参考

https://www.cnblogs.com/ArtsCrafts/archive/2013/06/07/log4j5.html

maven

1
2
3
4
5
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

使用

1
2
3
4
5
6
7
8
9
10
11
12
import org.apache.log4j.Logger;
import org.junit.Test;

public class Test {
private static Logger log = Logger.getLogger(Test.class.getClass());

@Test
public void testLog(){
log.debug("debug");
log.error("error");
}
}

log4j.properties

示例

重点:rootLogger 中第一个参数为输出日志的级别,是全局的。XXX.Threshold 是指定输出项的输出日志级别,是局部的。输出结果以两者中「更严格」的级别输出。 DEBUG - INFO - WARN- ERROR 严格程度依次递增

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
log4j.rootLogger=DEBUG,Console,Daily_Rolling

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.Threshold=DEBUG
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

#输出到滚动文件
log4j.appender.Daily_Rolling=org.apache.log4j.DailyRollingFileAppender
#DEBUG以上才使用
log4j.appender.Daily_Rolling.Threshold=DEBUG
#滚动文件名
log4j.appender.Daily_Rolling.File=./logs/log4j.log
#追加方式
log4j.appender.Daily_Rolling.Append=true
#滚动日期格式
log4j.appender.Daily_Rolling.DatePattern=.yyyy-MM-dd
# 输出日期格式
log4j.appender.Daily_Rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.Daily_Rolling.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%C]-[%p] %m%n

#会输出到Console,Daily_Rolling
log4j.logger.druid.sql=error
log4j.logger.druid.sql.DataSource=error
log4j.logger.druid.sql.Connection=error
log4j.logger.druid.sql.Statement=debug
log4j.logger.druid.sql.ResultSet=error

#设置dao包的日志配置
#log4j.logger.com.theking.xxx.dao = debug, Daily_Rolling
#设置service包的日志配置
#log4j.logger.com.theking.xxx.service = info, Daily_Rolling

配置

输出地 Appender

Appender 为日志输出目的地,Log4j 提供的 appender 有以下几种:

  • org.apache.log4j.ConsoleAppender(控制台)
  • org.apache.log4j.FileAppender(文件)
  • org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
  • org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  • org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
  • org.apache.log4j.jdbc.JDBCAppender(输出到数据库)

输出到控制台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#跟记录器,ERROR,输出到A1
log4j.rootLogger=ERROR,Console

#本记录器为DEBUG级别
log4j.category.com.log4j.test=DEBUG

#控制台输出
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#DEBUG以上级别是输出
log4j.appender.Console.Threshold=DEBUG
#编码方式
log4j.appender.Console.Encoding=UTF-8
#是否立即输出
log4j.appender.Console.ImmediateFlush=true
#使用System.err输出
log4j.appender.Console.Target=System.err
#输出格式,表达式配置
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.ConversionPattern=%-d{yyyy-MM-d HH:mm:ss, SSS}[%C]-[%p] %m%n

输出到文件

1
2
3
4
5
6
7
8
9
10
11
log4j.logger.com.log4j.test.Log4jTest=DEBUG, File

#输出到文件
log4j.appender.File=org.apache.log4j.FileAppender
#文件位置
log4j.appender.File.File=./logs/log4j.log
#追加文件内容
log4j.appender.File.Append=true
#输出格式表达式
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%C]-[%p] %m%n

输出为 HTML 文件

1
2
3
4
5
6
7
8
9
10
log4j.rootLogger=DEBUG, HTML

log4j.appender.HTML=org.apache.log4j.FileAppender
log4j.appender.HTML.File=./logs/log4j.log
log4j.appender.HTML.Append=false

#不配置这个会乱码
log4j.appender.HTML.Encoding=GBK
#HTMLLayout 布局
log4j.appender.HTML.layout=org.apache.log4j.HTMLLayout

输出到按大小滚动文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#DEBUG 级别,两个输出:文件与滚动文件
log4j.rootLooger=DEBUG, Rolling_File

#输出到滚动文件
log4j.appender.Rolling_File=org.apache.log4j.RollingFileAppender
#DEBUG以上才使用
log4j.appender.Rolling_File.Threshold=DEBUG
#滚动文件名
log4j.appender.Rolling_File.File=./logs/log4j.log
#追加方式
log4j.appender.Rolling_File.Append=true
#文件达到10MB就自动命名
log4j.appender.Rolling_File.MaxFileSize=10MB
#最多备份100个文件
log4j.appender.Rolling_File.MaxBackupIndex=100
log4j.appender.Rolling_File.layout=org.apache.log4j.PatternLayout
log4j.appender.Rolling_File.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%C]-[%p] %m%n

输出到按日期滚动文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#DEBUG 级别,两个输出:文件与滚动文件
log4j.rootLooger=DEBUG, Daily_Rolling

#输出到滚动文件
log4j.appender.Daily_Rolling=org.apache.log4j.DailyRollingFileAppender
#DEBUG以上才使用
log4j.appender.Daily_Rolling.Threshold=DEBUG
#滚动文件名
log4j.appender.Daily_Rolling.File=./logs/log4j.log
#追加方式
log4j.appender.Daily_Rolling.Append=true
#滚动日期格式
log4j.appender.Daily_Rolling.DatePattern=.yyyy-MM-dd
# 输出日期格式
log4j.appender.Daily_Rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.Daily_Rolling.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%C]-[%p] %m%n

输出到 JDBC 数据库

创建数据库表
1
2
3
4
5
6
7
create database log4j;
use log4j;
create table tb_log(id int primary key auto_increment,
date varchar(255),
priority varchar(255),
message text,
classname varchar(255));
配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#配置rootLogger为ALL级别,输出到 DATABASE
log4j.rootLogger=ALL, DATABASE

#数据库输出
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.Threshold=DEBUG

#数据库连接URL
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/log4j
#数据库驱动
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
#用户名
log4j.appender.DATABASE.user=root
#用户密码
log4j.appender.DATABASE.password=password

#执行SQL语句,列内容为表达式
log4j.appender.DATABASE.sql=insert into tb_log(date, priority, message, classname) values('%d', '%p', '%m', '%c')
#输出格式
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%C]-[%p] %m%n

日志格式化器 Layout

Layout:日志输出格式,Log4j 提供的 layout 有以下几种:

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

用户可以自定义输出信息,例如日期,时间,所在的线程,类名,文件名,方法名,信息级别,文件级别,文件行数

Log4j 中 ConversionPattern 常用的参数表:

参数 描述 实例
c 输出 Logger 所在的类别 (即 Logger 的名字)。允许使用 % c {数字} 输出部分的名字 (从右边往左边数)。见实例 % c 将输出 com.log4j.Log4jTest% c {1} 将输出 Log4jTest% c {2} 将输出 log4j.Log4jTest% c {3} 将输出 com.log4j.Log4jTest
C 输出 Logger 所在类的名称有时候 Logger 的名称不同于类名,例如 Hibernate 中用 org.hibernate.SQL 作为所有输出 DML 语句的 Logger 的名称,便于控制。允许使用 % C {数字} 输出部分的名称 (从右边往左边)。见实例 % C 将输出 com.log4j.Log4jTest% C {1} 将输出 Log4jTest% C {2} 将输出 log4j.Log4jTest% C {3} 将输出 com.log4j.Log4jTest
d 输出日期。允许使用 % d {yyyy-MM-dd HH:mm:ss} 格式化日期。% d 不仅支持 JDKSimpleDateFormat 的日期格式,还支持 log4j 自己的日期格式,例如 ABSOLUTE,DATE,ISO8601 等 % d 将输出 2013-06-06 22:24:25,353% d {yyyy-MM-dd} 将输出 2013-06-06% d {ABSOLUTE} 将输出 22:24:25,353% d {DATE} 将输出 06 六月 2013 22:24:25,253
F 输出所在的类文件名称 % F 将输出 Log4jTest.java
l 输出语句所在的行数,包括类名,方法名,文件名,行数等 % l 将输出 com.log4j.test.Log4jTest.main (Log4jTest.java:50)
L 输出语句所在的行数,只输出数字 % L 将输出 50
m 输出日志 输出日志,即 log.info (“”),log.debug (“”) 参数
M 输出方法名 % M 将输出 main
n 换行.Windows 下输出 \r\n,Linux 下输出 \n 含行
p 输出日志级别 (prioriry) DEBUG,INFO,ERROR,FITAL 等
r 输出从程序启动到输出该日志之间的时间间隔,单位毫秒 % r 将输出 300
t 输出当前的线程名称 % t 将输出 main,Thread-0,Thread-1 等
% %% 用来输出百分号

以 % p 为例,所有的调整格式见表:

格式 对齐方式 最小宽度 最大宽度 描述 实例
[%10p] 右对齐 10 正数右对齐,最小宽度 [ ERROR]
[%-10p] 左对齐 10 负数左对齐,最小宽度 [ERROR ]
[%.4p] 4 最大宽度 [ERROR]
[%10.20p] 右对齐 10 20 正数右对齐,最大最小宽度 [ ERROR]
[%-10.20p] 左对齐 10 20 负数左对齐,最大最小宽度 [ERROR ]