0

我使用以下 log4j.xml 文件,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender class="org.apache.log4j.RollingFileAppender" name="FILE">
      <param value="${logfile}" name="File" />
      <param value="10" name="MaxBackupIndex" />
      <param value="200MB" name="MaxFileSize" />
      <layout class="org.apache.log4j.PatternLayout">
         <param value="%d[%t] %-5p(%F:&lt;%M&gt;:%L)- %m%n" name="ConversionPattern" />
      </layout>
   </appender>

   <appender class="com.ubsc.at.properties.Log4JCustomAppender" name="CUSTAPPEN">
    <layout class="org.apache.log4j.PatternLayout">
         <param value="%m" name="ConversionPattern" />
      </layout>
      </appender>

   <appender class="org.apache.log4j.AsyncAppender" name="ASYNC">
     <param name="Blocking" value="false"/>
     <param name="BufferSize" value="512"/>
      <appender-ref ref="CUSTAPPEN" />
   </appender>

   <root>
      <level value="${logLevel}" />
      <appender-ref ref="FILE" />
      <appender-ref ref="ASYNC" />
   </root>
</log4j:configuration>

在码头服务器启动期间,我遇到了如下所示的问题。

java.lang.ClassNotFoundException: com.ubsc.at.properties.Log4JCustomAppender
        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)

我想这是因为 log4j.xml 的加载比我的自定义 Appender 类要早得多??

无论如何我可以应用类级别过滤,以便我可以在服务器启动期间跳过加载这个类。

请建议,提前谢谢。

4

1 回答 1

1

恐怕你不能用一个名为的文件来避免这种情况log4j.xml. 由于这是 log4j 配置文件的默认名称,因此可能有其他 Log4J 安装而不是您的尝试初始化。

这里有一些解决方案:

  1. 如果您使用的是 Spring,则可以重命名log4j.xmllog4j-myapp.xml配置 log4j 使用使用Log4jConfigListener
  2. 如果您不使用 Spring,则可以编写自己的Log4jConfigListener受 Spring 启发的代码。
  3. 将 appender 打包到单独的 JAR 中,并将 JAR 放入服务器共享库中。
于 2013-06-28T19:15:57.297 回答