Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j自定义附加器最初引发ClassNotFoundException?_Java_Log4j - Fatal编程技术网

Java Log4j自定义附加器最初引发ClassNotFoundException?

Java Log4j自定义附加器最初引发ClassNotFoundException?,java,log4j,Java,Log4j,我有下面这个log4j.xml文件,其中我使用了一个log4j自定义Appender 当应用程序启动时,我在jetty控制台中遇到以下异常 java.lang.ClassNotFoundException: com.ubsc.at.properties.CustomAppender at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessControlle

我有下面这个log4j.xml文件,其中我使用了一个log4j自定义Appender


当应用程序启动时,我在jetty控制台中遇到以下异常

java.lang.ClassNotFoundException: com.ubsc.at.properties.CustomAppender
        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:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
        at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:247)
        at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176)
        at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191)
        at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:284)
        at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176)
        at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191)
        at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:523)
        at org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:492)
        at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:1001)
        at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:867)
        at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:773)
        at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)
        at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
        at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)
        at org.eclipse.jetty.util.log.Slf4jLog.<init>(Slf4jLog.java:44)
        at org.eclipse.jetty.util.log.Slf4jLog.<init>(Slf4jLog.java:27)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
java.lang.ClassNotFoundException:com.ubsc.at.properties.CustomAppender
位于java.net.URLClassLoader$1.run(URLClassLoader.java:202)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:190)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:307)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:248)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:169)
位于org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
位于org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:247)
位于org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176)
位于org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191)
位于org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:284)
位于org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176)
位于org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191)
位于org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:523)
位于org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:492)
位于org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:1001)
位于org.apache.log4j.xml.domconfigure(DOMConfigurator.java:867)
位于org.apache.log4j.xml.domconfigure(DOMConfigurator.java:773)
在org.apache.log4j.helpers.OptionConverter.selectAndConfigure上(OptionConverter.java:483)
登录org.apache.log4j.LogManager(LogManager.java:127)
位于org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)
位于org.eclipse.jetty.util.log.Slf4jLog(Slf4jLog.java:44)
位于org.eclipse.jetty.util.log.Slf4jLog(Slf4jLog.java:27)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于java.lang.Class.newInstance0(Class.java:355)
我发现问题在于log4j是在我的类加载之前初始化的

如何避免此错误?复制现有log4j.jar中的类文件并创建一个新的jar


请分享你的想法。有没有办法将CustomAppender设置为仅为我的应用程序包加载此文件?

如上所述,您遇到了类加载程序问题

很难从stacktrace(需要更多)猜出您是从父类加载器还是从webapp URLClassLoader加载slf4J+Log4J

无论如何,如果slf4J和log4j安装在jetty
/lib
文件夹中(例如,最有可能由jetty父类加载器加载),则任何自定义追加器都应位于同一
/lib
文件夹中的jar中

或者,以下是您可以尝试的内容(未经测试):

  • 从一个“标准”log4j配置文件开始(无自定义附加器)
  • 在webapp的
    WEB-INF/lib
    文件夹中的jar中获取自定义appender的类,或者在
    WEB-INF/classes
  • 重写servlet的
    ìnit
    方法,以编程方式将自定义appender加载到日志4j记录器上。差不多

    Logger.getLogger(“my.package”).addAppender(新的MyCustomAppender(blah))

  • 您的servlet中针对“my.package”记录的任何内容现在都应该定向到您的自定义appender


    注意:SLF4J通常不能很好地处理类加载器的问题。

    如上所述,您遇到了类加载器问题

    很难从stacktrace(需要更多)猜出您是从父类加载器还是从webapp URLClassLoader加载slf4J+Log4J

    无论如何,如果slf4J和log4j安装在jetty
    /lib
    文件夹中(例如,最有可能由jetty父类加载器加载),则任何自定义追加器都应位于同一
    /lib
    文件夹中的jar中

    或者,以下是您可以尝试的内容(未经测试):

  • 从一个“标准”log4j配置文件开始(无自定义附加器)
  • 在webapp的
    WEB-INF/lib
    文件夹中的jar中获取自定义appender的类,或者在
    WEB-INF/classes
  • 重写servlet的
    ìnit
    方法,以编程方式将自定义appender加载到日志4j记录器上。差不多

    Logger.getLogger(“my.package”).addAppender(新的MyCustomAppender(blah))

  • 您的servlet中针对“my.package”记录的任何内容现在都应该定向到您的自定义appender


    注意:SLF4J通常不能很好地处理类加载器。jar是否在Jetty lib文件夹中包含您的自定义appender?不,它不包含。除非您有充分的理由不将其放在
    lib
    文件夹中,否则我会这样做。我怀疑您的log4j配置是用Jetty父类加载器读取的。@BGR是的,正确,有什么我可以避免的吗?是的