Java第三方工具系列(一):log4j

【引言】作为一个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
    3
    if(log.isDebugEnabled()){
    log.debug("I am a debug log.");
    }

配置Appender

Appender的语法格式

  想来做Java的同学都对append不陌生(StringBuilder的append方法估计都用过),这里的appender更适合被理解为追加器(追加的是什么呢?当然是日志了);一个appenderName对应的是一组配置(也就是一个个的option)

1
2
3
4
log4j.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
2
3
Threshold=DEBUG	# 指定日志消息的输出最低层次。
ImmediateFlush=true # 默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err # 默认情况下是:System.out,指定输出控制台

Option of FileAppender

1
2
3
4
Threshold=DEBUG	# 指定日志消息的输出最低层次。
ImmediateFlush=true # 默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt # 指定消息输出到mylog.txt文件。
Append=false # 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

Option of RollingFileAppender

1
2
3
4
5
6
Threshold=DEBUG # 指定日志消息的输出最低层次。
ImmediateFlush=true # 默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt # 指定消息输出到mylog.txt文件。
Append=false # 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB # 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的日志文件内容备份为mylog.log.1文件。
MaxBackupIndex=2 # 指定可以产生的滚动文件的最大数。

配置Layout

语法格式

  顾名思义,Layout自然就是用来控制展示布局的,也就是我们通常关注的日志的格式。

1
2
3
4
log4j.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

------2019 Lin.C ------