【问题标题】:Custom java.util.logging Handler in tomcattomcat 中的自定义 java.util.logging 处理程序
【发布时间】:2013-01-13 11:04:51
【问题描述】:

我们在给定系统上的所有 webapps 之间有一些通用的日志配置,我们试图将其外部化到 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,我可以让一切正常工作,但与修改加载器相比,这似乎通常不鼓励。

在读取logging.properties 之前,如何将自定义java.util.logging.Handler(以及后来的格式化程序)干净地添加到类加载器中是否有什么特别之处?

或者,如果我在错误的树上吠叫,我会采取更好的方法来解决多个 web 应用程序之间的共享日志配置问题java.util.logging

【问题讨论】:

    标签: tomcat logging java.util.logging


    【解决方案1】:

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

    #!/bin/sh
    
    CLASSPATH="$CATALINA_BASE/bin/myhandler.jar"
    

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

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2013-05-06
      • 2012-08-13
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多