一尘不染

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

tomcat

在给定系统上的所有Web应用程序之间,我们都有一些通用的日志记录配置,我们试图将其外部化为tomcat级别,而不是尝试在单个Web应用程序级别进行处理。事实java.util.logging证明,正在使用的Web应用程序具有一定的挑战性,因为我们有一个自定义处理程序,而且似乎没有一种明显的方法可以使该自定义处理程序与tomcat的类加载器完美配合。目前,这一切都在原型阶段。

初步:Tomcat 7.0.32,Java6。默认安装的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) [...]

(带有JAVA_OPTS=-verbose:class)。

我已经看到稍后加载了相关的类,但这似乎并不一致,并且可能是上述REST服务(直接使用它)的产物。

如果CLASSPATH直接将jar添加到容器中,则可以使所有组件正常工作,但是与修改加载程序相比,通常不鼓励这样做。

java.util.logging.Handlerlogging.properties读取之前如何干净地向类加载器添加自定义(以及后来的格式化程序)的过程中,我是否缺少某些特殊之处?

另外,如果我一团糟地选择了错误的树,我会采用更好的方法来解决多个Webapp之间使用共享日志配置的问题java.util.logging


阅读 349

收藏
2020-06-16

共1个答案

一尘不染

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

#!/bin/sh

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

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

2020-06-16