17

我正在使用 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))

其中文件是通过我的 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。似乎没有任何区别。

4

5 回答 5

9

感谢 nolan6000 指出的错误报告中的信息,我终于可以使用 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
于 2014-12-10T02:06:09.037 回答
8

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\""
于 2013-02-04T16:13:05.213 回答
7

您可能正在目睹这个错误

从 Tomcat 版本 7.0.41 和 6.0.38 开始,该错误已得到修复。

于 2013-06-23T20:21:33.623 回答
3

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

于 2012-11-15T03:13:24.170 回答
3

在默认的 Tomcat 8 JULI 记录器中使用格式化程序模式需要这个,您可以将参数放入全局$tomcat/conf/logging.properties或 webapp 特定$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
于 2015-09-27T00:21:29.050 回答