log4j是一个开源的日志工具包,可以提供很好的日志支持。可以通过配置文件,定义日志输出的等级,日志文件格式,存放位置,保存策略等。
1.引入log4j包
到官网下载所需要的jar
包或者源码包,放到工程中lib
路径下,然后在工程中添加dependency
即可。
2.log4j配置文件
log4j
默认情况下会读取classpath
下的配置文件,配置文件格式可以为.json
, .xml
, .properties
等。经过作者的实践,java
下的许多配置,xml
文件在阅读性、管理上有着天然优势,建议使用xml
文件作为配置文件。
关于什么是classpath
,本文不做详细阐述,不是太明白的读者可以再查找一下其他资料。
在Idea中,只需要在src
同级目录下,创建log4j2.xml
即可,log4j
会自动读取到这个文件。
2.1 下面我们来看看配置文件的写法,首先给出一个示例。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<!-- 变量配置 -->
<Properties>
<Property name="log_path">/PATH_TO_LOG/</Property>
</Properties>
<!-- appender配置 -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} | %5p | %c{1} | %F:%L | %m%n"/>
</Console>
<RollingFile name="DailyRollingFile" fileName="${log_path}/push.log"
filePattern="${log_path}/push_log_%d{yyyy-MM-dd-HH}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} | %5p | %c{1} | %F:%L | %m%n"/>
<TimeBasedTriggeringPolicy interval="5"/>
<!--<SizeBasedTriggeringPolicy size="1 MB"/>-->
<!--<DefaultRolloverStrategy max="200"/>-->
</RollingFile>
</Appenders>
<Loggers>
<Logger name="test" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="DailyRollingFile"/>
</Root>
</Loggers>
</Configuration>
可以看到,配置文件主要是Configuration
下面含有的Properties
, Appenders
, Loggers
组成。简单来说,Appenders
定义了日志具体写的方式(写到什么地方,console还是文件;写的格式是什么;保存的策略是什么)。Loggers
定义了日志的类型,以及该类型使用什么样的Appender
来写日志。Properties
则主要是整个log4j
的配置,最重要的是日志文件保存的路径。
2.2 示例说明
properties
在示例配置文件中,我们在properties
定义了日志文件保存到/PATH_TO_LOG/
路径下。
appenders
在Appenders
中定义了两种日志的记录方式,一种定义在Console
中,命名为Console
,输出的target为SYSTEM_OUT
. <Console name="Console" target="SYSTEM_OUT">
。 接下来给出了单条日志输出的格式:<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} | %5p | %c{1} | %F:%L | %m%n"/>
含义为:开始是时间(年月日、时分秒),然后是5个字符宽度的日志级别,然后是Logger的名称,,其次是文件名和行数(%F:%L
),最后是日志内容(%m
)+换行(%n
)。
第二种appender
我们定义为RollingFile
,即会根据策略分文件存储,在其属性中,fileName
表示当前日志输出文件的命名格式,filePattern
表示历史日志存档时命名格式。PatternLayout
的作用于上述方式相同。重要的是,log4j
提供了两种日志归档的策略,一种为TimeBasedTriggeringPolicy
即基于时间出发的策略,其后面的属性interval
为小时数,即每隔多少小时,归档一次,然后新的日志重新记录,老日志按照filePattern
格式命名归档。另一种为SizeBasedTriggeringPolicy
,即基于大小的策略,size
可以自定义,不带单位为Byte大小,可以设定为1 KB
, 1 MB
等等。当日志大小到达设定的size
时,已有的日志将会归档。
Loggers
loggers
中定义的日志器是代码中新建Logger的时候需要制定的,代码中每一个Logger实例都有一个logger与之对应,如果找不到对应的logger设置,则执行所有logger的父方法Root
。
Root
是必须有的,示例中,制定了名为(name
)console
和DailyRollingFile
的两个appender
来输出Root
的日志,即此类日志将会在控制台中输出,并且输出到DailyRollingFile
定义的日志文件中。
此外,我们还定义了一个名为test
的logger,只在控制台输出日志。
需要注意的是,每个logger
都需要定义一个属性level
,即日志的输出级别。log4j中定义了6个日志级别,等级高低为trace < debug < info < warn < error < fatal
。logger
只会输出大于等于level
的日志。
3.代码中的日志输出
Logger log = (Logger) LogManager.getLogger("test");//参数为logger的name
log.trace("this is a trace");
log.debug("this is a debug");
log.info("this is a info");
log.warn("this is a warn");
log.error("this is a error");
log.fatal("this is a fatal");