log4j配置详解

Apache log4j是一个基于Java的日志记录工具。它最初是由CekiGülcü写的,现在是Apache软件基金会的一个项目, log4j的是主流Java日志框架之一。此后Gülcü设计了SLF4J和Logback,意图成为log4j的继任者。
log4j团队创建了log4j2.0新版本,log4j 2.0改进了很多logback中可用问题,和架构问题。

1. log4j的日志等级

级别 描述
OFF 最高级别,用于关闭日志记录
FATAL 致命级,会导致应用程序提前终止的严重错误
ERROR 错误级别,运行时错误或异常情况,但不影响系统的继续运行
WARN 表示具有潜在的错误情况
INFO 表示粗粒度级别的应用程序运行情况的信息的消息
DEBUG 调试级别指定是最有用的调试应用程序细粒度信息事件
TRACE 跟踪级别指定细粒度信息事件比DEBUG
ALL 本都有最低的等级,目的是打开所有日志记录

2. 配置日志信息输出目的地

1
2
3
4
5
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件到达指定大小的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
  • ConsoleAppender参数选项

    | 参数 | 含义 |
    | :——–: | :——–: |
    | Threshold | 指定日志信息的最低输出级别,默认为DEBUG |
    | ImmediateFlush | true表示所有消息都会被立即输出,设为false则不输出,默认值是true |
    | Target | 默认值是System.out |

  • FileAppender参数选项

    | 参数 | 含义 |
    | :——–: | :——–: |
    | Threshold | 日志最低输出级别 |
    | ImmediateFlush | |
    | Append | true表示日志添加文件末尾,false则将覆盖文件,默认值是true|
    | File | 日志的路径,指定消息输出到|

  • DailyRollingFileAppender参数选项

    | 参数 | 含义 |
    | :——–: | :——–: |
    | Threshold | |
    | ImmediateFlush | |
    | Append | |
    | File | 日志的路径,指定消息输出到某个文件|
    | DatePattern | 产生文件的周期,yyyy-MM表示每月;yyyy-ww表示每周;yyyy-MM-dd表示每天;yyyy-MM-dd-a表示每天两次(一般前面加’.’’效果是*.log.2015-10-01)|

  • RollingFileAppender(文件到达指定大小的时候产生一个新的文件)参数选项

    | 参数 | 含义 |
    | :——–: | :——–: |
    | Threshold | |
    | ImmediateFlush | |
    | Append | |
    | File | |
    | MaxFileSize| 允许的最大文件大小,超过该值,将内容移到logging.log4j.1。单位:KB, MB,GB… 默认大小100KB|
    | MaxBackupIndex| 指定可以产生的滚动文件的最大数,设置为2可以产生 *.log.1,*.log.2两个滚动文件。默认值2|

2.1 配置日志信息的格式Layout

Layout用来规定日志是以什么样的格式输出,需要输出哪些信息。Layout提供四种日志输出样式:HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。常用的格式PatternLayout

1
2
3
4
org.apache.log4j.HTMLLayout (以HTML表格形式布局)
org.apache.log4j.PatternLayout (可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)

2.2 PatternLayout参数,定义日志打印格式

1
2
3
4
5
6
7
8
%m   输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,可以指定格式,比如:%d{yyyy-MMM-dd HH:mm:ss,SSS},输出2015-10-18 00:00:00,100
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数

  • 举例:

    1
    2
    3
    4
    参数:
    %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [ %-5p ] [%c] %m%n"
    输出:
    2016-02-29 00:37:01,381 [ main:1 ] - [ ERROR ] [com.xxx.log4j.LogTest] This is error message.

  • 参数说明:

    1
    2
    %5p 表示占5个字符,右对齐
    %-5p表示占5个字符,左对齐。如果实际字符数量超过设置的个数,按照实际输出

3. log4j日志格式

log4j配置支持xml和properties两种格式的文件,默认先在程序的classpath目录下检查是否有log4j.xml文件,如果没有再去找log4j.properties文件。
LogManager配置static片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static {
// 前面的代码省略
URL url = null;
if(configurationOptionStr == null) {
url = Loader.getResource("log4j.xml");
if(url == null) {
url = Loader.getResource("log4j.properties");
}
} else {
try {
url = new URL(configurationOptionStr);
} catch (MalformedURLException var6) {
url = Loader.getResource(configurationOptionStr);
}
}
}

3.1 log4j的properties格式配置

rootLogger语法格式:log4j.rootLogger=[level],appenderName1,appenderName2

  • level :必填,设定日志记录的最低级别,可设的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别
  • appenderName:指定日志信息要输出的目的地。可以同时指定多个输出目的地,用逗号隔开
  • 举例:log4j.rootLogger=INFO, file, stdout 最低日志级别INFO,2个appender分别是file、stdout
    注意:参数Threshold也可以指定日志输出最低级别,但是当log4j.rootLogger指定时最低级别时,以rootLogger为主。

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# rootLogger参数:最低输出级别INFO,定义2个最低appender:file和stdout
log4j.rootLogger=INFO,file,stdout

# append = file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.File=D:\\logfile.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# append = stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

3.2 log4j的xml格式配置

3.2.1 log4j的xml配置文件的树状结构图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xml declaration and DTD
|
log4j:configuration
|
+-- appender (name, class)
| |
| +-- param (name, value)
| +-- layout (class)
| |
| +-- param (name, value)
+-- logger (name, additivity)
| |
| +-- level (class, value)
| | |
| | +-- param (name, value)
| +-- appender-ref (ref)
+-- root
| |
| +-- priority (class, value)
| +-- level (class, value)
| +-- appender-ref (ref)

3.2.2 log4j:configuration根元素介绍

  • appender: 定义日志输出目的地,可以配置多个
  • logger: 定义日志写出器
  • root: 定义了root logger,相当于properties格式log4j.rootLogger

appender:定义日志输出的目的地

  • name: 定义appender的名字,以便被后文引用,必填
  • class: 定义appender对象所属的类的全名,必填
  • param: appender对象创建时传递给类构造方法的参数,配置threshold、ImmediateFlush等参数
  • layout : 定义该appender使用的layout对象

logger参数

logger定义一个日志输出器

  • name : 定义logger的名字,以便被后文引用,必填
  • additivity: 是否继承父logger的属性,默认true,必填
  • level: 定义该logger的日志级别
  • appender-ref: 定义该logger的输出目的地

注意:name可以输出指定类包中的日志,例如name=”com.ibatis”会打印出com.ibatis下面的日志

root参数

root 定义根日志输出器,如果子logger没有定义

  • level: 定义root logger的日志级别
  • priority: 定义root logger的日志级别,
  • param : 创建root logger对象时传递给类构造方法的参数
  • appender-ref: 定义root logger的输出目的地

注意:level和priority都可以配置日志输出的最低级别,但是不能同时配置不然会报错。

log4j:ERROR The content of element type “root” must match “(param,(priority|level)?,appender-ref)”

举例

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
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- =============================================================== -->
<!-- 以下是appender的定义,定义日志输出的目的地、输出方式及过滤级别 -->
<!-- =============================================================== -->
<appender name="file-log" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="/logs/log4j-study.log"/>
<param name="append" value="true"/>
<param name="encoding" value="GBK"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %l - %m%n"/>
</layout>
</appender>
<appender name="console-log" class="org.apache.log4j.ConsoleAppender">
<param name="encoding" value="GBK"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<!-- ============================================================== -->
<!-- 日志写出器:每一个logger可以有多个输出目的地和输出方式 -->
<!-- ============================================================== -->
<logger name="com.xxx.biz" additivity="false">
<level value="INFO"/>
<appender-ref ref="file-log"/>
</logger>
<logger name="com.xxx.test" additivity="false">
<level value="INFO"/>
<appender-ref ref="console-log"/>
</logger>

<!-- ============================================================== -->
<!-- Root logger 所有logger的基类,没有定义的logger将会使用root logger -->
<!-- ============================================================== -->
<root>
<priority value="INFO"/>
<appender-ref ref="file-log"/>
<appender-ref ref="console-log"/>
</root>
</log4j:configuration>