我正在使用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))
Run Code Online (Sandbox Code Playgroud)
where文件是通过我的web.xml文件中的参数配置的.我已经尝试将该文件放在WEB-INF/classes/logging.properties中,但行为没有变化.
SimpleFormatter的Javadocs指定如果属性文件和系统属性都指定格式化字符串,则系统属性优先.我已验证未设置系统属性
context.log ("Formatting system property is " + System.getProperty("java.util.logging.SimpleFormatter.format"));
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
我已经尝试了我能想到的一切,包括修改TOMCAT/conf和JRE_HOME/lib目录中的logging.properties.似乎没有任何区别.
我们在给定系统上的所有Web应用程序之间有一些常见的日志记录配置,我们试图将其外部化到tomcat级别,而不是尝试在单个webapp级别进行处理.正在使用的webapps java.util.logging有点挑战,因为我们有一个自定义处理程序,并且似乎没有一种明显的方法可以让自定义处理程序与tomcat的类加载器很好地协同工作.这一切都处于原型阶段.
初步:Tomcat 7.0.32,Java 6.默认的tomcat 7安装,部署了一个REST服务,配置中没什么好笑的.
首先,大致遵循这个答案中的建议,我创建了自定义处理程序并将jar放入$CATALINA_HOME/lib并确认所述目录位于正确的目录中并且common.loader包含此目录:
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
然后我修改了logging.properties文件并添加了处理程序:
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler, my.custom.Handler
./startup.sh然而,当我跑步时,我得到以下内容:
[Loaded java.io.PrintWriter from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.util.logging.StreamHandler from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.util.logging.ConsoleHandler from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
Handler error
java.lang.ClassNotFoundException: my.custom.Handler
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:521)
at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:464)
at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:288)
at java.util.logging.LogManager$2.run(LogManager.java:267) [...]
Run Code Online (Sandbox Code Playgroud)
(这是JAVA_OPTS=-verbose:class).
我已经看到了稍后加载的相关类,但这看起来并不一致,可能是上述REST服务(直接使用它)的工件.
如果我CLASSPATH直接添加jar,我可以让一切正常工作,但这似乎通常不鼓励而不是修改加载器.
java.util.logging.Handler在logging.properties读取之前如何在类加载器中干净地添加自定义(以及稍后的格式化程序)时,我是否缺少一些特别的东西?
或者,如果我在错误的树上咆哮,我会更好地解决多个webapps之间共享日志记录配置的问题java.util.logging.