最近项目需求需要将log4j1.2 升级到log4j2,摸索了好久,得出一点经验给大家分享。
1.log4j2 官网下载最新jar包(目前log2j2都是beta版)
导入入log4j-api-2.0-beta5.jar和log4j-core-2.0-beta5.jar。
2.配置文件
log4j2的配置文件后缀名只能为.xml, .json或者 .jsn,在默认的情况,系统选择configuration文件的优先级如下:
1.classpath下名为 log4j2-test.json 或者log4j2-test.jsn文件
2.classpath下名为log4j2-test.xml
3.classpath下名为 log4j2.json 或者log4j2.jsn文件
4.classpath下名为log4j2.xml
所以建议配置文件为log4j2.xml,下面以此为例:
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n"/> </Console> <RollingRandomAccessFile name="DebugAppender" fileName="./logs/lsp_admin_debug.log" append="true" filePattern="./logs/lsp_admin_debug.log.%d{yyyyMMdd}"> <PatternLayout> <Pattern>%d %-5p [%c] %m%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy interval="24" modulate="true"/> </Policies> <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="ACCEPT"/> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> </RollingRandomAccessFile> <RollingRandomAccessFile name="FILE" fileName="/opt/lspv2/lsp_app/logs/lsp_app.log" append="true" filePattern="/opt/lspv2/lsp_app/logs/lsp_app.log.%d{yyyyMMdd}"> <PatternLayout> <Pattern>%d %-5p [%c] %m%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy interval="24" modulate="true"/> </Policies> </RollingRandomAccessFile > </Appenders> <Loggers> <logger name="com.ericsson.lsp.service.sim" level="INFO" additivity="false"> <appender-ref ref="Console" /> <appender-ref ref="FILE" /> <appender-ref ref="Event.error" /> </logger> <root level="Info"> <appender-ref ref="Console" /> <appender-ref ref="DebugAppender" /> </root> </Loggers> </Configuration>
1.首先介绍loggers标签,用于定义logger的lever和所采用的appender,其中appender-ref必须为先前定义的appenders的名称,例如,此处为Console。那么log就会以appender所定义的输出格式来输出log
root标签为log的默认输出形式,如果一个类的log没有在loggers中明确指定其输出lever与格式,那么就会采用root中定义的格式
解析:如上面的例子中,com.ericsson.lsp.service.sim中的所有类,都会按照console和FILE的appender来输出,而没有定义log的类,都按照root默认的来输出。
2.再来介绍下Appenders标签,里面放各种扩展组件,主要类型有
1.ConsoleAppender
输出结果到控制台
2.FileAppender
输出结果到指定文件
3.RollingFileAppender
同样输出结果到文件,区别是用一个buffer,因此速度会快点。
还有其他的 FlumeAppender,JDBCAppender 等等,但是我们最常用的就是前面三者了。
介绍下RollingRandomessFile 的相关属性:
name:表示该appender的名称
fileName:表示输出的文件的路径
append:是否追加,true表示追加内容到所在的日志,false表示每次都覆盖
filePattern:表示当日志到达指定的大小或者时间,产生新日志时,旧日志的命名路径。
PatternLayout:和log4j1一样,指定输出日志的格式,具体代表的意思见前面的博客中
Policies:策略,表示日志什么时候应该产生新日志,
可以有时间策略和大小策略等,上面使用的是时间策略,每隔24小时产生新的日志文件
ThresholdFilter :过滤器,log4j2中有很多的filter,但是没有仔细研究,需要的时候再看
上文中的ThresholdFilter filter 指定了输出的最低级别,如
将输出debug以及debug级别以上的,但是需求只需要输出debug级别的,所以加上下列filter
但是,这样的效果是输出debug和info两个级别的日志,所以换下两个filter的顺序就好了。
当然还有许多其他的配置,可以自己到官网查看
http://logging.apache.org/log4j/2.x/manual/appenders.html
3.使用实例
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
private static Logger logger = LogManager.getLogger("HelloWorld");
public static void main(String[] args){
Test.logger.info("hello,world");
Test.logger.error("There is a error here");
}
}
获取logger换了一种方式,通过logManager获取logger,其他与log4j1一样,正常使用