Log4j2的基本使用

ⅰ亾dé卋堺 提交于 2020-01-16 23:47:01

  Log4j2是Log4j1.x的的升级版,其中也有很大的不同,最大的区别就是由以前的properties配置文件改为xml/json/yaml配置文件。

  其中配置文件的位置官方说明如下:

  1. 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.
  2. If no system property is set the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
  3. If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
  4. If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
  5. If a test file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
  6. If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
  7. If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
  8. 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 PatternLogger NameResult
%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:日志事件的时间。参考示例如下:

PatternExample
%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的过滤,不然高于配置级别的日志都会被输入到该文件中。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!