从 Log4j 1.x 迁移

使用 Log4j 1.x 网 bridge

转换为使用 Log4j 2 的最简单方法也许是用 Log4j 2 的 log4j-1.2-api.jar 替换 log4j 1.x jar 文件。但是,要成功使用此功能,应用程序必须满足以下要求:

  • 他们不得访问 Log4j 1.x 实现内部的方法和类,例如 Appenders,LoggerRepository 或 Category 的 callAppenders 方法。

  • 他们不得以编程方式配置 Log4j。

  • 它们不得通过调用 DOMConfigurator 或 PropertyConfigurator 类进行配置。

转换为 Log4j 2 API

在大多数情况下,从 Log4j 1.x API 转换到 Log4j 2 应该非常简单。许多日志语句将不需要修改。但是,必要时必须进行以下更改。

  • 版本 1 中的主要软件包是 org.apache.log4j,版本 2 中的主要软件包是 org.apache.logging.log4j

  • 必须将对 org.apache.log4j.Logger.getLogger()的调用修改为 org.apache.logging.log4j.LogManager.getLogger()。

  • 对 org.apache.log4j.Logger.getRootLogger()或 org.apache.log4j.LogManager.getRootLogger()的调用必须替换为 org.apache.logging.log4j.LogManager.getRootLogger()。

  • 调用接受 LoggerFactory 的 org.apache.log4j.Logger.getLogger 必须删除 org.apache.log4j.spi.LoggerFactory 并使用 Log4j 2 的其他扩展机制之一。

  • 将对 org.apache.log4j.Logger.getEffectiveLevel()的调用替换为 org.apache.logging.log4j.Logger.getLevel()。

  • 删除对 org.apache.log4j.LogManager.shutdown()的调用,在版本 2 中不需要它们,因为 Log4j Core 现在会在启动时自动添加 JVM 关机钩子以执行任何 Core 清理。

  • 从 Log4j 2.1 开始,您可以指定一个自定义ShutdownCallbackRegistry来覆盖默认的 JVM 关闭钩子策略。

    • 从 Log4j 2.6 开始,您现在可以使用 org.apache.logging.log4j.LogManager.shutdown()手动启动关机。
  • API 不支持对 org.apache.log4j.Logger.setLevel()的调用或类似方法。应用程序应删除这些。 Log4j 2 实现类中提供了等效的功能,请参阅 org.apache.logging.log4j.core.config.Configurator.setLevel(),但可能会使应用程序容易受到 Log4j 2 内部的更改的影响。

  • 在适当的情况下,应用程序应转换为使用参数化消息,而不是字符串串联。

  • org.apache.log4j.MDCorg.apache.log4j.NDC已由Thread Context代替。

配置 Log4j 2

尽管 Log4j 2 的配置语法与 Log4j 1.x 的语法不同,但大多数(如果不是全部)相同的功能可用。

请注意,已扩展了通过${foo}语法进行的系统属性插值,以允许从许多不同的源进行属性查找。有关更多详细信息,请参见Lookups文档。例如,在 Log4j 1.x 中使用名为 catalina.base 的系统属性的查找,语法为${catalina.base}。在 Log4j 2 中,语法为${sys:catalina.base}。

Log4j 1.x 具有与 Log4j 2 中的 XmlLayout 不同的 XMLLayout,log4j-1.2-api 模块包含一个 Log4j1XmlLayout,其生成的输出格式与 Log4j 1.x 中的格式相同。 Log4j 1.x SimpleLayout 可以使用 PatternLayout“%level-%m%n”进行模拟。 Log4j 1.x TTCCLayout 可以使用 PatternLayout“%r [%t]%p%c%notEmpty{%ndc }-%m%n”进行模拟。

Log4j 1.x 中的 PatternLayout 和 EnhancedPatternLayout 都可以用 Log4j 2 中的 PatternLayout 替换。log4j-1.2-api 模块包含两个模式转换“%ndc”和“%properties”,可用于模拟“%x”和“ Log4j 1.x PatternLayout 中的%X“(Log4j 2 中的”%x“和%X”格式略有不同)。

以下是 Log4j 1.x 以及 Log4j 2 中对应版本的示例配置。

示例 1-使用 Console Appender 进行简单配置

Log4j 1.x XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
  </appender>
  <category name="org.apache.log4j.xml">
    <priority value="info" />
  </category>
  <Root>
    <priority value ="debug" />
    <appender-ref ref="STDOUT" />
  </Root>
</log4j:configuration>

Log4j 2 XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Logger name="org.apache.log4j.xml" level="info"/>
    <Root level="debug">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
</Configuration>

示例 2-使用 File Appender,XMLLayout 和 SimpleLayout 的简单配置

Log4j 1.x XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="A1" class="org.apache.log4j.FileAppender">
    <param name="File"   value="A1.log" />
    <param name="Append" value="false" />
    <layout class="org.apache.log4j.xml.XMLLayout" />
  </appender>
  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.SimpleLayout" />
  </appender>
  <category name="org.apache.log4j.xml">
    <priority value="debug" />
    <appender-ref ref="A1" />
  </category>
  <root>
    <priority value ="debug" />
    <appender-ref ref="STDOUT" />
  </Root>
</log4j:configuration>

Log4j 2 XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <File name="A1" fileName="A1.log" append="false">
      <Log4j1XmlLayout />
    </File>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%level - %m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Logger name="org.apache.log4j.xml" level="debug">
      <AppenderRef ref="A1"/>
    </Logger>
    <Root level="debug">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
</Configuration>

示例 3-SocketAppender

Log4j 1.x XML 配置。 Log4j 1.x 中的此示例具有误导性。 SocketAppender 实际上并不使用布局。配置一个将不起作用。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="A1" class="org.apache.log4j.net.SocketAppender">
    <param name="RemoteHost" value="localhost"/>
    <param name="Port" value="5000"/>
    <param name="LocationInfo" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
    </layout>
  </appender>
  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
  </appender>
  <category name="org.apache.log4j.xml">
    <priority value="debug"/>
    <appender-ref ref="A1"/>
  </category>
  <root>
    <priority value="debug"/>
    <appender-ref ref="STDOUT"/>
  </Root>
</log4j:configuration>

Log4j 2 XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Socket name="A1" host="localHost" port="5000">
      <PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
    </Socket>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Logger name="org.apache.log4j.xml" level="debug">
      <AppenderRef ref="A1"/>
    </Logger>
    <Root level="debug">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
</Configuration>

示例 4-AsyncAppender 和 TTCCLayout

使用 AsyncAppender 进行 Log4j 1.x XML 配置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" configDebug="true">
  <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
    <appender-ref ref="TEMP"/>
  </appender>
  <appender name="TEMP" class="org.apache.log4j.FileAppender">
    <param name="File" value="temp"/>
    <layout class="org.apache.log4j.TTCCLayout">
      <param name="ThreadPrinting" value="true"/>
      <param name="CategoryPrefixing" value="true"/>
      <param name="ContextPrinting" value="true"/>
    </layout>
  </appender>
  <root>
    <priority value="debug"/>
    <appender-ref ref="ASYNC"/>
  </Root>
</log4j:configuration>

Log4j 2 XML 配置。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
  <Appenders>
    <File name="TEMP" fileName="temp">
      <PatternLayout pattern="%r [%t] %p %c %notEmpty{%ndc }- %m%n"/>
    </File>
    <Async name="ASYNC">
      <AppenderRef ref="TEMP"/>
    </Async>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="ASYNC"/>
    </Root>
  </Loggers>
</Configuration>

示例 5-带有控制台和文件的 AsyncAppender

使用 AsyncAppender 进行 Log4j 1.x XML 配置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" configDebug="true">
  <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
    <appender-ref ref="TEMP"/>
    <appender-ref ref="CONSOLE"/>
  </appender>
  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
  </appender>
  <appender name="TEMP" class="org.apache.log4j.FileAppender">
    <param name="File" value="temp"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
  </appender>
  <root>
    <priority value="debug"/>
    <appender-ref ref="ASYNC"/>
  </Root>
</log4j:configuration>

Log4j 2 XML 配置。请注意,应该在引用的附加程序之后配置 Async Appender。这样可以使其正常关闭。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
  <Appenders>
    <Console name="CONSOLE" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>
    <File name="TEMP" fileName="temp">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </File>
    <Async name="ASYNC">
      <AppenderRef ref="TEMP"/>
      <AppenderRef ref="CONSOLE"/>
    </Async>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="ASYNC"/>
    </Root>
  </Loggers>
</Configuration>