修改Tomcat下的java.util.logging.SimpleFormatter格式属性

时间:2012-07-03 10:05:03

标签: tomcat java.util.logging

我使用的是Tomcat 7.0.28,在Ubuntu上的OpenJDK 1.7下运行,我正在尝试修改java.util.logging.SimpleFormatter使用的格式化字符串。根据该类的Javadocs,我可以指定属性java.util.logging.SimpleFormatter.format来更改格式。事实上,当我在Eclipse中运行我的webapp并在logging.properties文件中更改此属性时,它可以工作。

但是,当我将应用程序部署到Tomcat时,此属性似乎没有任何效果。我确信我的属性文件正在被正确读取,因为我对其进行的其他更改确实生效了(我正在使用

从文件中读取属性)
LogManager.getLogManager().readConfiguration(new FileInputStream(file))

其中file是通过我的web.xml文件中的参数配置的。我已经尝试将该文件放在WEB-INF / classes / logging.properties中,但行为没有变化。

SimpleFormatter的Javadocs指定如果属性文件和系统属性都指定格式化字符串,则系统属性优先。我已验证系统属性未设置

context.log ("Formatting system property is " + System.getProperty("java.util.logging.SimpleFormatter.format"));

在ServletContextListener.contextInitialized方法中。

这是我的完整日志属性文件

handlers=java.util.logging.ConsoleHandler

#  Default logging level for root logger
.level=FINE

#  Set the level for the ConsoleHandler
java.util.logging.ConsoleHandler.level=FINE
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tr] %3$s %4$s:  %5$s %n

我已经尝试了我能想到的一切,包括修改TOMCAT / conf和JRE_HOME / lib目录中的logging.properties。似乎没有任何区别。

5 个答案:

答案 0 :(得分:9)

感谢nolan6000指出的the bug report中的信息,我终于与tomcat-juli合作了。

而不是:

java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n

必须是:

1catalina.java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n

答案 1 :(得分:7)

确实

java.util.logging.SimpleFormatter.format可以在logging.properties中设置 - 这对我来说也不起作用 - 或者作为命令行参数(java选项)。

命令行参数似乎对我有用。因为$ JAVA_OPTS变量经历了如此多的篡改并最终在eval中,这就是我解决它的方法(在Debian上,java 1.7.0_07,apache-tomcat-7.0.30)

$ CATALINA_HOME / bin / catalina.sh(第230行):

JAVA_OPTS="$JAVA_OPTS \"-Djava.util.logging.SimpleFormatter.format=%1\\\$tY-%1\\\$tm-%1\\\$td %1\\\$tH:%1\\\$tM:%1\\\$tS.%1\\\$tL %4\\\$s %3\\\$s %5\\\$s%6\\\$s%n\""

答案 2 :(得分:7)

您可能正在见证this bug

从Tomcat版本7.0.41开始以及6.0.38开始修复该错误。

答案 3 :(得分:2)

不知道这是否能解决您的问题,但值得一试。我看到了相同的行为,虽然在我的情况下,我是以编程方式进行日志记录设置而不是使用属性。事实证明,在构造(在我的情况下)FileHandler之前,需要设置java.util.logging.SimpleFormatter.format的属性值。我在构造FileHandler之后设置它,但是在构造SimpleFormatter之前。我想知道在你的属性文件中定义java.util.logging.SimpleFormatter.format是否在定义任何Handler属性之前将解决问题。

答案 4 :(得分:2)

在默认的Tomcat 8 JULI记录器中使用格式化程序模式需要这样,您可以将参数放到全局$tomcat/conf/logging.properties或特定于Web应用程序的$tomcat/webapps/myapp/WEB-INF/classes/logging.properties文件中。

这是我的全局文件,其中还禁用了manager-webapp日志文件。记录线是:
2015-09-23 17:32:11 INFO org.apache.catalina.startup.Catalina Server startup in 1028 ms

#handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

# formatter attributes = date, source, logger, level, message, thrown
java.util.logging.SimpleFormatter.format = %1$tF %1$tT %4$s %3$s %5$s%6$s%n

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8
1catalina.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter
#1catalina.org.apache.juli.AsyncFileHandler.bufferSize = 2048

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8
2localhost.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter
#2localhost.org.apache.juli.AsyncFileHandler.bufferSize = 2048

#3manager.org.apache.juli.AsyncFileHandler.level = FINE
#3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
#3manager.org.apache.juli.AsyncFileHandler.prefix = manager.

#4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
#4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
#4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.

java.util.logging.ConsoleHandler.level = FINE
#java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler

#org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
#org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler

#org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
#org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE

# To see debug messages in TldLocationsCache, uncomment the following lines
#org.apache.jasper.compiler.TldLocationsCache.level = FINE
#org.apache.jasper.servlet.TldScanner.level=FINE