基本介绍
Log4j基本的jar包为log4j-core-版本.jar和log4j-api-版本.jar,一般导入这两个jar包足以满足基本使用,其他jar包的功能参考官网。
在程序中我们可以通过下面的方式获得一个logger,
1 | Logger logger = LogManager.getLogger("name of logger"); |
其中logger_name是在配置文件中指定的,如果没有配置文件或者没有找到对应名字的logger,则会使用默认的logger: 日志级别为ERROR,输出为控制台。
重点要说明的是日志的级别以及如果配置Logger。Log4j默认有如下级别:trace, debug, info, warn, error, fatal,重要级别依次增加。当然也可以自定义级别,不过一般这些默认级别足够使用,而且也利于扩展和迁移。
- trace一般用于记录程序进行所有的进展信息,数量一般比较多。
- debug一般用于调试输出调试部分所需要查看的信息。
- info一般用于输出重要的关注的信息。
- warn一般用于输出程序可能存在潜在的问题和提示。
- error用于输出错误信息。
- fatal同样用于输出错误信息,一般是程序遇到致命错误需要停止,输出相关信息。
基本使用如下:
1 | import org.apache.logging.log4j.LogManager; |
如果直接运行上面的代码,trace和info的信息将被丢弃,error及以上信息会被输出到控制台,这时Log4jD的默认配置。
配置文件
我们可以通过配置文件配置logger按照我们所需要的方式工作。配置文件可以为xml,ymal和json格式,一般放在src目录下,如log4j2-test.xml。这里我们介绍基于xml的配置文件,其他文件格式也是类似的,一个简单的配置文件如下:
1 |
|
定义appenders
首先我们定义所需要的appenders,可以声明任意数量的所需要的appenders,appender记录了日志的输出形式,输出地点,格式,级别过滤等信息。如:
常用的几种输出形式有Console(输出到控制台),File(输出到文件),RollingFile(超过size自动存为压缩文件)。
1 | <Console name="Console" target="SYSTEM_OUT"> |
这时一个输出到控制台的appender,名字是Console,我们在程序中用于通过logger名字获得logger所使用的参数即是这个参数,目的地是SYSTEM_OUT
。另外我们可以通过<ThresholdFilter>
定义过滤器,这里我们希望过滤掉info以下的信息,也就是onMismatch,操作是直接拒绝,info及以上的信息accept。也就是只会有info以上的信息会被输出到SYSTEM_OUT
。输出的格式为可以通过%msg
。更多的可以定义输出代码位置、时间、级别等信息:
1 | <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> |
下面是另一个输出到文件的appender:
1 | <File name="keyinfo" fileName="/Users/chenzb/Desktop/logtest/keyinfo.log" append="true"> |
可以通过append属性指定是否为追加方式。
定义loggers
定义appender后,我们可以定义logger,也就是将会在程序中直接使用的logger的配置。
1 | <logger name="suggestion" level="trace" additivity="false"> |
这里定义了一个logger,名字为suggestion(用来在程序获得这个logger的实例),level用于制定这个logger的基本级别,additivity用来指定是否重叠输出,需要注意的是info信息由于级别高于trace,所以它同时也是trace信息,如果additivity为true,则这个info信息将会被输出两次,一次作为info信息,一次trace信息。将additivity设置为false则该信息则只会以其满足的最高级别输出一次。
对于这个logger,我们使用了三个appender,也就是这个logger所获得信息将会被输出到这个三个appender,再由appender具体根据其配置过滤以及格式等信息输出。
最终在程序我们可以通过获得该logger的实例:
1 | private Logger logger = LogManager.getLogger("suggestion"); |
另外如果在配置文件中没有名字为”suggestion”的logger,如果定义了root logger(也就是默认logger),则会使用root logger,如果没有定义,则会使用Log4j默认配置(只输出error及以上信息到控制台)。
更多使用参考Apache Log4j官网。