在tomcat中自定义java.util.logging处理程序

时间:2013-01-29 19:04:53

标签: tomcat logging java.util.logging

我们在给定系统上的所有Web应用程序之间有一些常见的日志记录配置,我们正在尝试将其外部化到tomcat级别,而不是尝试在单个webapp级别进行处理。使用java.util.logging的webapps证明有些挑战,因为我们有一个自定义处理程序,并且似乎没有一种明显的方法可以让自定义处理程序与tomcat的类加载器很好地协同工作。这一切都处于原型阶段。

初步:Tomcat 7.0.32,Java 6.默认tomcat 7安装,部署了一个REST服务,配置中没什么好笑的。

首先,roughly following the advice in 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添加到CLASSPATH,我可以正常工作,但这似乎通常不鼓励而不是修改加载器。

在读取java.util.logging.Handler之前,如何在类加载器中干净地添加自定义logging.properties(以及稍后的格式化程序),是否有一些特殊内容?

或者,如果我在错误的树上咆哮,我会更好地解决多个带有java.util.logging的webapp之间的共享日志记录配置问题。

1 个答案:

答案 0 :(得分:4)

对于Tomcat范围的自定义日志记录,您需要将您的类注入Tomcat引导程序ClassLoader。因此,必须将具有自定义处理程序和所需依赖项的jar放入启动脚本CLASSPATH中。我建议在$ CATALINA_BASE / bin / setenv.sh添加自定义脚本,即

#!/bin/sh

CLASSPATH="$CATALINA_BASE/bin/myhandler.jar"

或者您可以在Tomcat启动期间加载脚本变量时动态收集所需的jar。