从 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.MDC和org.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>