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博客