Log4j 是 Log for java 的简写。
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
当前有两个常用版本:
版本 |
稳定版本 |
核心jar包 |
1.x |
log4j-1.2.18.jar |
log4j-1.2.18.jar |
2.x |
Log4j-x-2.1.jar |
log4j-api-2.1.jar log4j-core-2.1.jar |
2.x 与1.x的变化还是很大的,一些核心的API都做了些许的调整。
Log4j由三个重要的组件构成: 日志信息的优先级(Loggers)、日志信息的输出目的地(Appdenders)、日志信息的输出格式(Layouts)。 其中日志信息的优先级别从高到低有: OFFà FATALàERRORàWARNà
INFOàDEBUGàTRACEàALL,分别代表这条日志信息的重要程度。
日志信息的输出目的地制定了日志将打印到控制台、文件或者数据库中。而输出格式则控制了日志信息的显示内容。
日志级别 |
1.x版本 |
2.x版本 |
OFF |
Y |
Y |
FATAL |
Y |
Y |
ERROR |
Y |
Y |
WARN |
Y |
Y |
INFO |
Y |
Y |
DEBUG |
Y |
Y |
TRACE |
N |
Y |
ALL |
Y |
Y |
其中OFF是关闭日志记录,ALL是开启所有级别的日志记录,不推荐使用OFF、ALL这两种日志级别。
OFF: 用户关闭日志记录。
FATAL: 系统发生严重错误,将会导致程序退出。
ERROR:系统发生错误,但是不影响系统的继续运行。
WARN: 警告,潜在的危险。
INFO: 程序的正常的输出信息,用于突出强调程序的运行过程。
DEBUG: 调试程序时的输出消息。
TRACE: 主要是输出调试时堆栈信息,一般使用debug模式替代。
ALL: 输出所有级别日志。
2.x版本新添加了一个TRACE级别的日志信息。
Addenders也叫做Log4j的适配器
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
org.apache.log4j.HTMLLayout (以HTML 表格形式布局),
org.apache.log4j.PatternLayout (可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
如果使用PatternLayou布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
[QC]是log信息的开头,可以为任意字符,一般为项目简称。
Log4j 1.x 的配置文件主要有:
log4j.properties
log4j.xml
本例 主要以log4j.properties
#INFO表示日志级别,stdout,R表示日志适配器的别名 log4j.rootLogger=INFO, stdout , R ################### # stdout Appender ################### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n ################### # R Appender ################### log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n |
Log4j 1.x 默认文件名为log4j 默认路径是src目录下(classpath根目录)
Log4j 2.x 的配置文件主要有以下格式:
log4j2.xml,log4j2.json log4j2.yaml(json与yaml格式的没有搞懂,也没有见到过这种配置,主要是依据官方文档中的一段话)
Through a configuration file written in XML,JSON or YAML.
注意: 配置文件默认存放的目录是src,路径是classpath
默认的文件名有两个log4j2或者log4j2-test(json 文件可以简写成后缀名为jsn)
下面主要是以xml格式为例:
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration status="error"> <!--先定义所有的appender--> <appenders> <!--这个输出控制台的配置,target是输出目的地--> <Console name="Console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!--这个都知道是输出日志的格式--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--> <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档,这儿不知道是bug还是设定好的,每个目录下最多只能生成7个压缩文件,循环覆盖--> <RollingFile name="RollingFile" fileName="log/app.log" filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> <SizeBasedTriggeringPolicy size="20MB"/> </RollingFile> </appenders> <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--> <loggers> <!--建立一个默认的root的logger--> <root level="trace"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> <appender-ref ref="log"></appender-ref> </root> </loggers> </configuration> |
上面的xml配置文件的层级为:
<configuration> <appenders></appenders> <loggers> <root level=”日志级别”> <appender-ref ref=”” /> </root> </loggers> </configuration> |
首先分析appenders 节点:
<appdenders> <!-- Console控制台输出-- > <Console></Console> <!-- File文件输出-- > <File></File> <!-- 固定大小文件输出-- > <RollingFile></RollingFile> </appenders>
|
<appenders> 中可以定义很多的日志适配器,但是只有配置在<loggers>的<root>中,才会生效。
上面罗嗦了那么多主要是为了铺垫,主要是在程序中的应用。下面分别介绍下log4j1.x 与log4j 2.x 的使用方法。
/** Log4j 1.x的日志记录器 */ Import org.apache.log4j.Logger; |
/** 申明一个日志记录常量 */ Private static final Logger LOGGER=Logger.getLogger(this.getClass()); |
/** 使用INFO,DEBUG 日志之前需要做判断,是否是开启了该级别的日志记录,否则正式上线后,日志过多影响系统的性能 */ If(LOGGER.isInfoEnabled()){ LOGGER.info(“ this is a info message”); } If(LOGGER.isDebugEnabled()){ LOGGER.debug(“this is a debug message”); } |
/** Log4j 2.x的日志记录器,日志管理器 */ import org.apache.logging.log4j.LogManager; Import org.apache.logging.log4j.Logger; |
/** 申明一个日志记录常量 */ Private static final Logger LOGGER= LogManager.getLogger(this.getClass()); |
/** 使用INFO,DEBUG 日志之前需要做判断,是否是开启了该级别的日志记录,否则正式上线后,日志过多影响系统的性能 */ if(LOGGER.isDebugEnabled()) { LOGGER.debug("this is a debug message,my name is {}","King-pan"); } if(LOGGER.isInfoEnabled()) { LOGGER.debug("this is a info message,my age is {}","25"); } |
注意: log4j 2.x 版本 在日志输出时,可以使用{}占位符来传入参数. 学过c的同学可以回想下printf方法。