最近项目需求需要将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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<? 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一样,正常使用