Log4j 2配置指南

Posted Java识堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j 2配置指南相关的知识,希望对你有一定的参考价值。

前言


以前都是直接在项目中使用网上的log4j2.xml,大概能用就行,结果用Storm的时候,项目中的log4j2.xml文件失效,必须在Storm目录的配置文件中配置,就学习了一波,分享一下


log4j2有8个级别,从低到高为

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

等级

描述

All

最低等级的,用于打印所有日志记录

TRACE

追踪,就是程序运行到哪了

DEBUG

指出细粒度信息事件对调试应用程序是非常有帮助的

INFO

消息在粗粒度级别上突出强调应用程序的运行过程

WARN

输出警告    

ERROR

输出错误信息日志

FATAL

输出每个严重的错误事件,将会导致应用程序退出的日志

OFF

最高等级的,用于关闭所有日志记录


程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少 


先看一个最简单的,log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
   <Appenders>
       <Console name="Console" target="SYSTEM_OUT">
           <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </Console>
   </Appenders>
   <Loggers>
       <Root level="error">
           <AppenderRef ref="Console"/>
       </Root>
   </Loggers>
</Configuration>


这个配置文件主要是把程序运行过程中error级别的日志打印到控制台


根标签Configuration常用的子标签为Properties,Appenders,Loggers

Configuration常用属性

描述

monitorInterval

假设这个值是10,则每隔10秒重新读取配置文件,动态的更改配置

status

设置log4j2自身内部的信息输出


Console代表向控制台打印日志 
RollingFile会根据具体的生成策略重新生成日志文件,如日志大小到了指定大小,或者到了指定时间

Console常用属性

描述

name

Appender的名字

target

Either “SYSTEM_OUT” or “SYSTEM_ERR”. The default is “SYSTEM_OUT”


File常用属性

描述

name

Appender的名字

fileName

The name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created.

append

值为false,则每次清空文件,为true则追加到文件,默认为true


RollingFile常用属性

描述

fileName

The name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created.

filePattern

The pattern of the file name of the archived log file(归档日志文件的文件名的模式)


翻转策略常用的一些标签


SizeBasedTriggeringPolicy常用属性

描述

size

文件多大时开始翻转,后缀可为KB, MB or GB


TimeBasedTriggeringPolicy 常用属性

描述

interval

根据filePattern的最小粒度,设置翻转策略

modulate

是否在区间边界上翻转,值为boolean类型

maxRandomDelay

随机延迟翻转的最大秒数,默认是0,表示没有延迟


DefaultRolloverStrategy 常用属性

描述

min

计数器的最小值,默认是1

max

计数器的最大值。一旦达到这个值,旧文件将在后续翻转中删除。默认值为7


Loggers标签常用的子标签为Root,Logger,Root标签用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root进行日志输出


Logger常用属性

描述

name

可以为随便起的名字,如果想指定某个包或者某个类的打印策略,则为包名或者全类名

level

日志打印级别


如果Logger没有指定level属性,就会默认继承自Root 


Root标签和Logger标签常用的子标签为AppenderRef


AppenderRef 常用属性

描述

ref

指定日志输出的Appender


如果Logger没有指定AppenderRef ,就会默认继承自Root。如果指定了,就会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity=false只在自定义的Appender中进行输出


再介绍一个常用的过滤器标签ThresholdFilter


ThresholdFilter常用属性

描述

level

日志级别

onMatch

Action to take when the filter matches. May be ACCEPT, DENY or NEUTRAL. The default value is NEUTRAL

onMismatch

Action to take when the filter does not match. May be ACCEPT, DENY or NEUTRAL. The default value is DENY


这里说一下可选值ACCEPT, DENY, NEUTRAL,ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。所以,在组合过滤器中,使用NEUTRAL(中立的),被第一个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件


常用模板


我们在项目中一般不直接使用Log4j2而是SLF4J。SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类,SLF4J类似JDBC,这样我们可以轻松更改日志的实现,一般在pom文件中加入如下即可


<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-core</artifactId>
   <version>2.6.2</version>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-api</artifactId>
   <version>2.6.2</version>
</dependency>

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.7.13</version>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-slf4j-impl</artifactId>
   <version>2.5</version>
</dependency>

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.16.18</version>
</dependency>


lombok是一个神奇插件,在类上加上@Slf4j 注解,就相当于在类中加入如下代码,特别方便,还有其他特别方便的注解,可以参考其他文章安装和学习一下


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private Logger log = LoggerFactory.getLogger(类名.class);


将指定包或者指定类的日志打印到不同文件


设置Logger标签的name属性为包名或者全类名,即可把日志打到相应的文件中

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

   <Properties>
   <!-- 定义日志输出的格式,具体含义可参考官网 -->
       <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
       <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
       <property name="logDir">./logs</property>
       <property name="logLevel">debug</property>
   </Properties>

   <Appenders>
       <Console name="console" target="SYSTEM_OUT">
           <PatternLayout>
               <pattern>${consolePattern}</pattern>
           </PatternLayout>
       </Console>
       <File name="logFile" fileName="${logDir}/server.log" append="false">
           <PatternLayout pattern="${filePattern}"/>
       </File>
       <File name="classFile" fileName="${logDir}/classFile.log" append="false">
           <PatternLayout pattern="${filePattern}"/>
       </File>
   </Appenders>

   <Loggers>
       <Logger name="com.test1.TestLog">
           <AppenderRef ref="classFile" />
       </Logger>
       <Root level="${logLevel}">
           <AppenderRef ref="console" />
           <AppenderRef ref="logFile" />
       </Root>
   </Loggers>

</Configuration>


将不同级别的日志打印到不同文件


主要思路是,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能颠倒

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

   <Properties>
       <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
       <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
       <property name="logDir">./logs</property>
       <property name="logLevel">debug</property>
   </Properties>

   <Appenders>
       <Console name="console" target="SYSTEM_OUT">
           <PatternLayout>
               <pattern>${consolePattern}</pattern>
           </PatternLayout>
       </Console>
       <File name="logFile" fileName="${logDir}/server.log" append="false">
           <PatternLayout pattern="${filePattern}"/>
       </File>
       <File name="debugFile" fileName="${logDir}/debug.log" append="false">
           <Filters>
               <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
               <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
           </Filters>
           <PatternLayout pattern="${filePattern}"/>
       </File>
       <File name="infoFile" fileName="${logDir}/info.log" append="false">
           <Filters>
               <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
               <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
           </Filters>
           <PatternLayout pattern="${filePattern}"/>
       </File>
       <File name="errorFile" fileName="${logDir}/error.log" append="false">
           <Filters>
               <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
           </Filters>
           <PatternLayout pattern="${filePattern}"/>
       </File>
   </Appenders>

   <Loggers>
       <Root level="${logLevel}">
           <AppenderRef ref="console" />
           <AppenderRef ref="logFile" />
           <AppenderRef ref="debugFile" />
           <AppenderRef ref="infoFile" />
           <AppenderRef ref="errorFile" />
       </Root>
   </Loggers>

</Configuration>


按时间或者大小归档


<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

   <Properties>
       <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
       <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
       <property name="logDir">./logs</property>
       <property name="logLevel">debug</property>
   </Properties>

   <Appenders>
       <Console name="console" target="SYSTEM_OUT">
           <PatternLayout>
               <pattern>${consolePattern}</pattern>
           </PatternLayout>
       </Console>
       <RollingFile name="logFile" fileName="${logDir}/server.log" filePattern="${logDir}/server-%d{yyyyMMddHH}.log.gz">
           <PatternLayout>
               <pattern>${filePattern}</pattern>
           </PatternLayout>
           <Policies>
               <TimeBasedTriggeringPolicy interval="24" modulate="true" />
               <!--<SizeBasedTriggeringPolicy size="10MB" />-->
           </Policies>
           <DefaultRolloverStrategy max="30" />
       </RollingFile>
   </Appenders>

   <Loggers>
       <Root level="${logLevel}">
           <AppenderRef ref="console" />
           <AppenderRef ref="logFile" />
       </Root>
   </Loggers>

</Configuration>


每天零点归档日志,文件名类似如下server-2018041123.log.gz,当日志达到30个以后,删除以前的日志

以上是关于Log4j 2配置指南的主要内容,如果未能解决你的问题,请参考以下文章

在Web项目中配置Log4j --指南--

将 log4j.properties 文件从 Log4j 版本 1 迁移到 2 的合适指南

Appuim项目实战—log4j配置

Log4j 2 指南

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章

Log4j for C++ 实用指南