Java使用log4j进行日志管理

时间:2022-02-28 21:48:15

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是必须有的,示例中,制定了名为(nameconsoleDailyRollingFile的两个appender来输出Root的日志,即此类日志将会在控制台中输出,并且输出到DailyRollingFile定义的日志文件中。

此外,我们还定义了一个名为test的logger,只在控制台输出日志。

需要注意的是,每个logger都需要定义一个属性level,即日志的输出级别。log4j中定义了6个日志级别,等级高低为trace < debug < info < warn < error < fatallogger只会输出大于等于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");