转换到Log4j 2的最简单方法,也许就是把log4j 1.x的jar文件替换为Log4j 2的log4j-1.2-api.jar。然而,要让这个方式可以使用,应用必须满足以下要求:
不能访问Log4j 1.x的内部实现的方法和类,例如Appenders, LoggerRepository或者Category的callAppenders方法。不能以编程方式配置Log4j。不能通过调用类DOMConfigurator或PropertyConfigurator来进行配置。在大多数情况下,从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()替换。调用org.apache.log4j.Logger.getLogger,接受一个LoggerFactory参数,必须移除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核心现在在启动的时候会自动添加一个JVM关闭钩子来处理任何关键的清理。 从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 1.x, 但是即使不是全部,也是具备大多数同样的功能的。
需要注意的是,通过${foo}插入系统属性的功能,已经扩展成支持从许多不同的来源中查找属性。详细信息可以查阅Lookups的文档。例如,要查找名为catalina.base的系统属性,在Log4j 1.x,语法应该是${catalina.base},而在Log4j 2, 语法就应该是${sys:catalina.base}。
下面是Log4j 1.x和相对应的Log4j 2的配置示例。
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>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.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> <File name=“A1″ fileName=“A1.log” append=“false”> <PatternLayout pattern=“%t %-5p %c{2} – %m%n”/> </File> <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>Log4j 1.x XML配置。Log4j 1.x的例子容易令人误解。SocketAppender实际上并不使用Layout,配置一个Layout并不会有任何效果。
<?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”> <SerializedLayout/></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>使用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.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配置
<?xml version=“1.0” encoding=“UTF-8″?> <Configuration status=“debug”> <Appenders> <File name=“TEMP” fileName=“temp”> <PatternLayout pattern=“%d %-5p [%t] %C{2} (%F:%L) – %m%n”/> </File> <Async name=“ASYNC”> <AppenderRef ref=“TEMP”/> </Async></Appenders><Loggers> <Root level=“debug”> <AppenderRef ref=“ASYNC”/> </Root></Loggers></Configuration>使用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需要在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> 转载自 并发编程网 - ifeve.com