【注意】最后更新于 July 6, 2018,文中内容可能已过时,请谨慎使用。
log4j配置
根日志
log4j.rootLogger
格式
log4j.rootLogger = [ level ] , loggerName1 , loggerName2
第一个参数表示默认级别
日志级别从高到低分别为: FATAL,ERROR,WARN,INFO,DEBUG
一般线上使用INFO级别
log4j可以为不同的 Appender 设置日志输出级别(如果不配置这个的话默认使用根配置的级别)
1
|
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
|
输出目的地
appender
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
控制台
org.apache.log4j.ConsoleAppender
文件
org.apache.log4j.FileAppender
每天产生一个日志文件
org.apache.log4j.DailyRollingFileAppender
文件大小到达指定尺寸时产生一个新的文件
org.apache.log4j.RollingFileAppender
以流格式发送到任意指定的地方
org.apache.log4j.WriterAppender
|
输出格式
logger
html格式
org.apache.log4j.HTMLLayout
包含日志级别和信息字符串
org.apache.log4j.SimpleLayout
包含日志产生的时间,线程、类别等等信息
org.apache.log4j.TTCCLayout
指定格式(一般使用这个)
org.apache.log4j.PatternLayout
参数介绍

例子
1
2
3
4
5
6
|
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 异常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
|
slf4j指定输出到某个logger
Logger loggerCtrl = LoggerFactory.getLogger(“controller”);
如果name并没有在配置文件中则默认使用根目录的logger
继承关系
在rootLogger配置的logger是父logger
单独配置的logger为子logger
比如单独配置log4j.logger.controller=ERROR,controller,并不在root里面配置
子loggger和父logger的关系
默认情况下子Logger会继承父Logger的appender,也就是说子logger输出的时候,父logger同时会输出相同的内容
可以控制只输出子logger
1
|
log4j.additivity.controller = false
|
过滤某些包的日志
比如我想过滤所有spring包下面的日志
1
|
log4j.logger.org.springframework=OFF
|
追踪请求
为每个请求创建惟一标识,这在多线程中很有用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Log4jNdcFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
NDC.push(UUID.randomUUID().toString());
chain.doFilter(req, res);
NDC.pop();
}
public void init(FilterConfig config) throws ServletException {
}
}
|
配置web.xml
1
2
3
4
5
6
7
8
|
<filter>
<filter-name>Log4jNdcFilter</filter-name>
<filter-class>com.catfish.web.filter.Log4jNdcFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Log4jNdcFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
|
和springmvc的结合
web.xml配置
1
2
3
4
|
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>../../log4j.properties</param-value>
</context-param>
|
这里使用了相对路径,这样不同服务器就可以使用不同的配置了
动态加载配置
监听日志配置,修改配置不需要重启
1
2
3
4
5
6
7
8
|
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>10000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
|
日志输出规范
info信息要求简洁易懂
异常信息要求尽量详细
我的模板
1
2
|
String erreoInfo = "[接口:{}] [参数:{}] [异常:{}] ";
loggerErr.error(erreoInfo, url, params, exMsg);
|
异常信息需要全局统一处理,可以在aop中统一处理
我的日志配置
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
|
log4j.rootLogger=INFO,stdout,D
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.encoding=utf-8
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss:SSS} %x method:%l%n%m%n
log4j.additivity.stdout = false
log4j.logger.D =INFO,D
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=/usr/local/web-server/logs/info.log
log4j.appender.D.Append = true
log4j.appender.D.Encoding=utf-8
log4j.appender.D.DatePattern='-'yyyy-MM-dd'.log'
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=[%-5p] %-d{yyyy-MM-dd HH:mm:ss:SSS}-%x-%m%n
log4j.additivity.D = false
log4j.logger.err=ERROR,err
log4j.appender.err=org.apache.log4j.DailyRollingFileAppender
log4j.appender.err.File=/usr/local/web-server/logs/log_err.log
log4j.appender.err.Append = true
log4j.appender.err.Threshold=ERROR
log4j.appender.err.Encoding=utf-8
log4j.appender.err.DatePattern='-'yyyy-MM-dd'.log'
log4j.appender.err.layout=org.apache.log4j.PatternLayout
log4j.appender.err.layout.ConversionPattern=[%-5p] %-d{yyyy-MM-dd HH:mm:ss:SSS}^|^%x^|^%m%n
log4j.logger.accessLog=INFO,accessLog
log4j.appender.accessLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.accessLog.File=/usr/local/web-server/logs/log_access.log
log4j.appender.accessLog.Append = true
log4j.appender.accessLog.Encoding=utf-8
log4j.appender.accessLog.DatePattern='-'yyyy-MM-dd'.log'
log4j.appender.accessLog.layout=org.apache.log4j.PatternLayout
log4j.appender.accessLog.layout.ConversionPattern=%m%n
log4j.additivity.accessLog = false
|
参考资料
log4j 之 DailyRolling :屏蔽指定包日志输出 - CSDN博客
log4j过滤掉不必要的日志 - CSDN博客
在 Web 应用中增加用户跟踪功能
log4j.properties配置详解与实例 - CSDN博客