如何将log4j.xml转换为logback.xml?

时间:2011-11-16 11:13:46

标签: log4j logback

我正在从log4j转移到logback所以我需要将我的log4j.xml转换为logback.xml

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题并找到了更好的解决方案。首先,您需要从最新的log4j.xml开始。我仍然有categorypriority标签之类的内容,必须在配置中分别由loggerlevel替换。然后删除每个特定的appender,例如RollingFileAppender。之后你必须手动转换它们。

然后按照this blog中的说明使用Xalan和XSLT转换过滤器将log4j.xml文件转换为logback.xml文件。由于这篇博客的内容对我的答案来说相当珍贵,我个人确保本文可以found in the wayback machine以防万一。此外,本文未提供所需库的版本。这是我使用的那个:

  • 串行 - 2.7.1
  • 的Xalan-2.7.0
  • xercesImpl-2.6.2
  • XML的API-1.3.02

这是适用于我的命令行(在所有库和资源所在的同一文件夹中执行:

java -classpath  xalan-2.7.0.jar org.apache.xalan.xslt.Process -IN log4j.xml -XSL log4j-to-logback.xsl -OUT logback.xml

现在大部分工作已经完成。首先,我重新组织了所有记录器,就像它们在原始log4j.xml文件中一样,以便于进一步比较。然后我手工转换了特殊的appender。它比看起来容易,documentation相当清晰。这是一个例子(实际上我必须处理的最复杂的事情):

<!-- Log4J Configuration -->
<appender name="myAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${catalina.base}/logs/myApp.log" />
    <param name="Append" value="true" />
    <param name="MaxFileSize" value="20MB" />
    <param name="MaxBackupIndex" value="10" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %X{param} %-5p %m%n" />
    </layout>
       <filter class="org.apache.log4j.varia.StringMatchFilter">
              <param name="StringToMatch" value="PATTERN1" />
              <param name="AcceptOnMatch" value="true" />
      </filter>
      <filter class="org.apache.log4j.varia.StringMatchFilter">
              <param name="StringToMatch" value="PATTERN2" />
              <param name="AcceptOnMatch" value="true" />
      </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>


<!-- Logback configuration -->
<appender name="myAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/myApp.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/myApp.log.%i</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>10</maxIndex>
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>20MB</maxFileSize>
    </triggeringPolicy>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
        <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
            <expression>return message.contains("PATTERN1");</expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>ACCEPT</OnMatch>
    </filter>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
        <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
            <expression>return message.contains("PATTERN2");</expression>
        </evaluator>
        <OnMismatch>DENY</OnMismatch>
        <OnMatch>ACCEPT</OnMatch>
    </filter>
    <encoder>
        <pattern>%d %X{param} %-5p %m%n</pattern>
    </encoder>
</appender>

注意:如果您的配置需要使用像我这样的评估程序过滤器,您需要在项目的库中声明janino和commons-compiler(与slf4j相同的版本)

答案 1 :(得分:0)

如果您可以手动将其翻译回log4j属性格式,则可以在Logback项目网站上使用the log4j.properties to logback.xml translator