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 | org.apache.log4j.ConsoleAppender(控制台) |
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样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。常用的格式PatternLayout1
2
3
4org.apache.log4j.HTMLLayout (以HTML表格形式布局)
org.apache.log4j.PatternLayout (可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
2.2 PatternLayout参数,定义日志打印格式
1 | %m 输出代码中指定的消息 |
举例:
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
16static {
// 前面的代码省略
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 | # rootLogger参数:最低输出级别INFO,定义2个最低appender:file和stdout |
3.2 log4j的xml格式配置
3.2.1 log4j的xml配置文件的树状结构图
1 | xml declaration and DTD |
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>