【引言】作为一个Java开发者,这么多年来Log4j向来是必不可少的一个组件,但很多时候我们只了解个大概,想系统的用好这个组件,还真得花点儿工夫拾掇拾掇。
log4j的概念和定义?
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
log4j在工程中怎么引用?
如今Maven的流行,让我们很简单的就可以引用我们想要的各种软件包,不会像多年前那样还需要在本地打个lib目录再到工程配置中去依赖,时代真的是在不断进步。1
2
3
4
5<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
log4j的使用示例
其实我们日常使用日志组件的话,最值得关注的无非就是以下几个点:
- 日志等级打印到什么级别?
- 日志输出到什么地方?
- 日志文件是怎么命名的?
- 日志多了会不会把系统撑爆?
参考下面的一个简单的例子,我们基本可以对log4j的基础使用包括上面提到的问题都有个初步的概念了: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# rootLogger,配置输出日志的等级、输出点(对整个工程生效);这里的每个输出点对应到下面就是一组配置集合
log4j.rootLogger=INFO,Console,File
# 第一个输出点:Console;采用System.out(也可以被替换为别的命令)方式输出日志到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%l] %m%n
# 第二个输出点:File;采用文件方式输出日志(这里的文件类型可以有很多种,视需要而定)
log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.Append=true
log4j.appender.File.File = run.log
log4j.appender.File.MaxFileSize=512KB
log4j.appender.File.MaxBackupIndex=3
log4j.appender.File.DatePattern='.'yyyy-MM-dd
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%l] %m%n
# 定制化日志配置:myBatis的输出等级(单独针对某个包的定制化配置)
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j配置详解
基本组件
Log4j由三个重要的组件构成:
- 日志信息的优先级(优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度)
- 日志信息的输出目的地(指定了日志将打印到控制台还是文件中)
- 日志信息的输出格式(控制了日志信息的显示内容)
配置rootLogger
语法格式
rootLogger是对整个工程生效的,若没有其他特殊配置都将按照这里设置的级别和appender输出日志,它的值第一项表示日志级别,后面可重复N项用于指定不同的appender。1
log4j.rootLogger = [ level ] , appenderName, appenderName, …
语法点说明
- level
- 表示日志打印的级别
- ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF
- 不区分大小写
- 日志输出时会按照这里指定的级别打印,低于这个级别的打印语句会被忽略。
- appenderName
- 指定日志信息输出到什么地方(console,file,etc;这些appender都是在后面需要定义的,前后的名字不能出现偏差)
- 可以同时指定多个输出目的地
- 若需在控制台输入,只需将其中一个appender定义为stdout即可(log4j.appender.Console.Target=System.out)
其他说明
- 生效策略
- rootLogger默认是对整个工程生效的;
- 如果只想对某些包操作,那么可配置包日志:log4j.logger.com.xsy=info, stdout,表示该配置对package com.xsy生效(前面的log4j.logger是默认格式)
- 特殊规则:debug模式的使用如下格式即可
1
2
3if(log.isDebugEnabled()){
log.debug("I am a debug log.");
}
配置Appender
Appender的语法格式
想来做Java的同学都对append不陌生(StringBuilder的append方法估计都用过),这里的appender更适合被理解为追加器(追加的是什么呢?当然是日志了);一个appenderName对应的是一组配置(也就是一个个的option)1
2
3
4log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
Appender的种类
- org.apache.log4j.ConsoleAppender:控制台输出
- org.apache.log4j.FileAppender:文件输出
- org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件
- org.apache.log4j.RollingFileAppender:文件大小到达指定尺寸的时候产生一个新的文件
- org.apache.log4j.WriterAppender:将日志信息以流格式发送到任意指定的地方
- org.apache.log4j.JDBCAppender:将日志信息保存到数据库中
Option of ConsoleAppender
1 | Threshold=DEBUG # 指定日志消息的输出最低层次。 |
Option of FileAppender
1 | Threshold=DEBUG # 指定日志消息的输出最低层次。 |
Option of RollingFileAppender
1 | Threshold=DEBUG # 指定日志消息的输出最低层次。 |
配置Layout
语法格式
顾名思义,Layout自然就是用来控制展示布局的,也就是我们通常关注的日志的格式。1
2
3
4log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
layout的种类
- org.apache.log4j.HTMLLayout:以HTML表格形式布局
- org.apache.log4j.PatternLayout:可以灵活地指定布局模式
- org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串
- org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等等信息
日志格式集
- %c:输出日志信息所属的类的全名
- %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-M-dd HH:mm:ss }
- %f:输出日志信息所属的类的类名
- %l:输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
- %m:输出代码中指定的信息,如log(message)中的message
- %n:输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
- %p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
- %r:输出自应用启动到输出该日志信息所耗费的毫秒数
- %t:输出产生该日志事件的线程名
实例解析
前面几个段落陆陆续续的解释了我们最关注的的一些配置项,当然没有面面俱到;最后这里再附上一个小示例,虽然不全面但从大体结构上对该有的配置也都包含到了,实际运用时可以参考前面的具体细则自行定制。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# 全局日志等级配置,输出位置
log4j.rootLogger=error, stdout,logfile
# 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 %p [%c]:%L - %m%n
# 文件路径输出
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
# 默认输出到tomcat的根路径或者运行测试工程的根路径
log4j.appender.logfile.File=pss.log
# 单个日志文件的大小限制
log4j.appender.logfile.MaxFileSize=512KB
# 最多保存3个备份文件
log4j.appender.logfile.MaxBackupIndex=3
# 日志输出的Layout和pattern定义
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n