Log4j2的基本使用
Log4j2是Log4j1.x的的升级版,其中也有很大的不同,最大的区别就是由以前的properties配置文件改为xml/json/yaml配置文件。
其中配置文件的位置官方说明如下:
- Log4j will inspect the "log4j.configurationFile" system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension.
- If no system property is set the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
- If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
- If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
- If a test file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
- If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
- If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
- If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.
它会依次查找可能存在的配置文件,也可自定义配置文件的路径。可设置System.setProperty("log4j.configurationFile", path);来自定义配置文件的路径。注意:默认配置文件会查找以log4j2命名的文件。
配置文件以<Configuration></Configuration>为根节点。可设置其默认的日志输出级别status,可输入的值可为 "trace", "debug", "info", "warn", "error" and "fatal"。也可以设置其自动循环执行配置文件的时间monitorInterval,默认是5s。
log4j2的配置文件会有几个必须的节点,Appenders和Root。Appenders配置是其输出的日志形式,有log文件输出/控制台输出/数据库写入/消息发送等方式。以控制台输出为例,其配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration status="WARN"> 3 <Appenders> 4 <Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 5 </Console> 6 </Appenders> 7 <Loggers> 8 <Root level="error"> 9 <AppenderRef ref="Console"/> 10 </Root> 11 </Loggers> 12 </Configuration>
Appender
其中Appender有很多种方法,常用的例如异步AsyncAppender、控制台ConsleAppender、救援FailoverAppender、文件FileAppender、数据库JDBCAppender、滚动文件RollingFileAppender等。
异步AsyncAppender不是单独配置的,而是引用其他已配置的Appender。它多用于不同线程操作日志的情况。配置格式如下:
1 <File name="MyFile" fileName="logs/app.log"> 2 <PatternLayout> 3 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 4 </PatternLayout> 5 </File> 6 <Async name="Async"> 7 <AppenderRef ref="MyFile"/> 8 </Async>
救援FailoverAppender是包裹其他的appender使用的。它的用处是当第一个Appender失效的时候,就执行第二个Appender,以此类推直到没有Appender可执行了。配置如下:
1 <Appenders> 2 <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz" 3 ignoreExceptions="false"> 4 <PatternLayout> 5 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 6 </PatternLayout> 7 <TimeBasedTriggeringPolicy /> 8 </RollingFile> 9 <Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false"> 10 <PatternLayout pattern="%m%n"/> 11 </Console> 12 <Failover name="Failover" primary="RollingFile"> 13 <Failovers> 14 <AppenderRef ref="Console"/> 15 </Failovers> 16 </Failover> 17 </Appenders>
文件FileAppender是一种输出流的方式输出日志文件的。格式如下:
1 <Appenders> 2 <File name="MyFile" fileName="logs/app.log"> 3 <PatternLayout> 4 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 5 </PatternLayout> 6 </File> 7 </Appenders>
数据库JDBCAppender是把错误日志信息根据配置存储到数据库中,两种格式如下:
1 <Appenders> 2 <JDBC name="databaseAppender" tableName="dbo.application_log"> 3 <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" /> 4 <Column name="eventDate" isEventTimestamp="true" /> 5 <Column name="level" pattern="%level" /> 6 <Column name="logger" pattern="%logger" /> 7 <Column name="message" pattern="%message" /> 8 <Column name="exception" pattern="%ex{full}" /> 9 </JDBC> 10 </Appenders>
1 <Appenders> 2 <JDBC name="databaseAppender" tableName="LOGGING.APPLICATION_LOG"> 3 <ConnectionFactory class="net.example.db.ConnectionFactory" method="getDatabaseConnection" /> 4 <Column name="EVENT_ID" literal="LOGGING.APPLICATION_LOG_SEQUENCE.NEXTVAL" /> 5 <Column name="EVENT_DATE" isEventTimestamp="true" /> 6 <Column name="LEVEL" pattern="%level" /> 7 <Column name="LOGGER" pattern="%logger" /> 8 <Column name="MESSAGE" pattern="%message" /> 9 <Column name="THROWABLE" pattern="%ex{full}" /> 10 </JDBC> 11 </Appenders>
第二种方法配置了Connection工厂类以及获取Connection的方法。该Connection是JDBC连接数据库的java.sql.Connection。
滚动文件RollingFileAppender是根据配置生成多文件的方法。它提供了一些文件的触发方法和生成格式。示例如下:
1 <Appenders> 2 <RollingFile name="RollingFile" fileName="logs/app.log" 3 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> 4 <PatternLayout> 5 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 6 </PatternLayout> 7 <Policies> 8 <TimeBasedTriggeringPolicy /> 9 <SizeBasedTriggeringPolicy size="250 MB"/> 10 </Policies> 11 </RollingFile> 12 </Appenders>
其中fileName是默认当前日志的名称。filePattern是多日志生成的命名规则。它依赖于日志的生成规则。可根据SimpleDateFormat的格式化日期或者%i整型计数等方式命名文件名。触发规则Policies有三种方式:
1 <Policies> 2 <OnStartupTriggeringPolicy /> 3 <SizeBasedTriggeringPolicy size="20 MB" /> 4 <TimeBasedTriggeringPolicy /> 5 </Policies>
OnStartup规则没有参数,如果当前日志文件比JVM的时间要迟,就会触发,生成新的日志。
SizeBased有一个参数size,即文件日志大小。当日志文件到达这个大小的时候,就会生成新的日志文件。后缀可为KB、MB、GB。
TimeBased是基于时间触发的周期性的保存日志,它有两个参数,interval:触发时间,单位为日志filePattern时间命名的的精度单位,默认是1。modulate:布尔类型。说明是否对日志生成时间进行调制。若为true,则日志时间将以0点为边界进行偏移计算。例如第一次日志保存时间是3点,modulate为true,interval是4h。那么下次生成日志时间是4点,08:00,12:00……
默认的文件生成规则DefaultRolloverStrategy。它有4个参数:
fileIndex:文件索引。
min:文件最小数量,默认是1;
max:文件最大数量。一旦达到这个最大数,以前的文档就会在下一轮生成日志的时候删除。
compressionLevel: 日志压缩级别。0-9,压缩效果依次增大。只对于压缩文件类型有效。<DefaultRolloverStrategy max="20"/>
文件的压缩格式支持的后缀名:".gz",".zip",".bz2",".xz"
Layout
layout是日志文件的布局格式。支持的格式比较多,有CSV/JSON/HTML/RFC-5424/pattern/XML等等,用法大同小异。以常用的pattern、HTML为例:
pattern是最常用也是比较简单的方式生成日志格式。它可以使用\t,\n,\r,\f用来分割排列信息。使用%加一些特定的英文单词输出日志详细描述。
比较常用的有:
%c: Logger的名称。它可以接受一个整型的参数。规则如下:
Conversion Pattern | Logger Name | Result |
---|---|---|
%c{1} | org.apache.commons.Foo | Foo |
%c{2} | org.apache.commons.Foo | commons.Foo |
%c{1.} | org.apache.commons.Foo | o.a.c.Foo |
%c{1.1.~.~} | org.apache.commons.test.Foo | o.a.~.~.Foo |
%c{.} | org.apache.commons.test.Foo | ....Foo |
%d:日志事件的时间。参考示例如下:
Pattern | Example |
---|---|
%d{DEFAULT} | 2012-11-02 14:34:02,781 |
%d{ISO8601} | 2012-11-02T14:34:02,781 |
%d{ISO8601_BASIC} | 20121102T143402,781 |
%d{ABSOLUTE} | 14:34:02,781 |
%d{DATE} | 02 Nov 2012 14:34:02,781 |
%d{COMPACT} | 20121102143402781 |
%d{HH:mm:ss,SSS} | 14:34:02,781 |
%d{dd MMM yyyy HH:mm:ss,SSS} | 02 Nov 2012 14:34:02,781 |
%d{HH:mm:ss}{GMT+0} | 18:34:02 |
%d{UNIX} | 1351866842 |
%d{UNIX_MILLIS} | 1351866842781 |
ex|exception|throwable
{["none"
|"full"
|depth
|"short"
|"short.className"
|"short.fileName"
|"short.lineNumber"
|"short.methodName"
|"short.message"
|"short.localizedMessage"]}:输出一个异常日志,后面可以带指定的字符串。默认输出信息是Throwable.printStackTrace()。
%m/%msg/%message:输出日志事件所提供的信息。
%n:日志换行。
%level:日志级别。
%t:当前生成日志事件的线程。
HTMLLayout是将日志文件生成一个HTML文件,它的好处是可以通过浏览器浏览。它是以table生成日志信息的。
可接收4个配置参数:
charset:文档类型,默认是utf-8。
contentType:用于申明文件头。默认是“text/html”。
locationInfo:布尔类型。如果为true的话。文件名和行数会写入到html中。默认是false。
title: html文件的标题。
Filter
配置日志的filter可以控制输出日志的类型。以ThresholdFilter为例,它是过滤日志级别的过滤器,允许通过的日志输出,不允许的不输出。它有三个参数:
level:配对的级别,即该级别的名称。
onMatch: 符合条件的级别。可填写: ACCEPT, DENY or NEUTRAL. 默认是NEUTRAL。
onMisMatch:不符合的级别。可填写: ACCEPT, DENY or NEUTRAL. 默认是DENY。
示例:
1 <Appenders> 2 <RollingFile name="RollingFile" fileName="logs/app.log" 3 filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> 4 <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/> 5 <PatternLayout> 6 <pattern>%d %p %c{1.} [%t] %m%n</pattern> 7 </PatternLayout> 8 <TimeBasedTriggeringPolicy /> 9 </RollingFile> 10 </Appenders>
这样配置之后,该log日志文件只会输出比trace更高级别或者同等级别的日志了。
最后说下配置需要注意的事项:
1.每个配置都需要一个root节点,root节点可以配置日志的级别,所有的Appender要配置到root中才能生效。
2.可以配置独立的Logger,设置其level以及additivity,addivity是布尔值,代表是否遵从log4j2的日志输出级别。
3.log4j2的日志级别:ALL<DEBUG<INFO<WARN<ERROR<FATAL。 日志输出遵从这样的级别,假设当前设置的日志输出级别是WARN,那么高于或者等于WARN级别的日志都会被输出,所以如果想把特定类型的日志写入到单独的日志文件中,需要做一个filter的过滤,不然高于配置级别的日志都会被输入到该文件中。