我们在给定系统上的所有 webapps 之间有一些通用的日志配置,我们试图将其外部化到 tomcat 的级别,而不是尝试在单个 webapp 的级别上处理。事实证明,正在使用的 webappsjava.util.logging
具有一定的挑战性,因为我们有一个自定义处理程序,而且似乎没有一种明显的方法可以让自定义处理程序与 tomcat 的类加载器很好地配合使用。目前这一切都处于原型阶段。
初步:Tomcat 7.0.32,Java 6。默认 tomcat 7 安装,部署了一个 REST 服务,配置中没有什么有趣的。
首先,大致按照this answer中的建议,我创建了自定义处理程序并将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) [...]
(这是与JAVA_OPTS=-verbose:class
)。
我已经看到稍后加载了相关的类,但这似乎并不一致,并且可能是上述 REST 服务的工件(直接使用它)。
如果我直接将 jar 添加到 jar 中,我可以让一切正常工作CLASSPATH
,但与修改加载器相比,这似乎通常不鼓励。
在读取java.util.logging.Handler
之前如何将自定义(以及后来的格式化程序)干净地添加到类加载器中,我是否缺少一些特别的东西?logging.properties
或者,如果我在错误的树上吠叫,我会采取更好的方法来解决多个 webapps 之间共享日志配置的问题java.util.logging
。