SpringBoot2.x集成Log4j2

2,619 阅读9分钟

官网

logging.apache.org/log4j/2.x/

POM

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <!--排除logback-->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--log4j2 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

基本结构

log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn".

选择配置文件的优先级(从先到后)如下:

  1. classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
  2. classpath下的名为log4j2-test.xml的文件.
  3. classpath下名为log4j2.json 或者log4j2.jsn的文件.
  4. classpath下名为log4j2.xml的文件

基本结构文件如下,

<Configuration status="INFO">
	<Properties>
	<Appenders/>
	<Loggers/>
</Configuration>

Configuration

根节点

<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数,如下配置为30分钟检测一次-->
<Configuration status="WARN" monitorInterval="3600">

Properties

变量定义,在此可定义日志目录,日志格式等

<Properties>
    <property name="LOG_FILE" value="log"/>
    <property name="LOG_HOME">${sys:catalina.base}/logs</property>
    <property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} %t %l:%m%n</property>
</Properties>

使用变量通过${name}即可

Appendes

1.Console:控制台打印(常用)

<!--默认配置-->
<Console name="STDOUT" target="SYSTEM_OUT">
    <!-- %m:显示输出消息 %n:换行 更多配置参见后文Pattern参数配置 -->
      <PatternLayout pattern="%m%n"/>
</Console>

2.File:普通日志文件输出

 <!--文件会打印出所有信息,append为true,则在日志文件中追加日志,为false则每次项目启动清空文件重新生成,实际作用不大-->
<File name="FileLog" fileName="${LOG_HOME}/file.log" append="true">
    <!-- 只输出info及以上级别的信息(info、warn、error)(onMatch),其他的直接拒绝(onMismatch) -->
    <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout pattern="${LOG_PATTERN}" />
</File>

3.RollingFile:按照配置的规则滚动式输出日志文件

    <!-- 常规info,
        fileName为最新的日志文件,
        每当大小超过size,则会以 filePattern 的格式重新生成一个归档文件 
        这里设置每天会生成一个归档文件
    -->
    <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/info-%d{yyyy-MM-dd}-%i.log">
        <!-- 只打印info级别日志 注意先后顺序,优先排除不需要的级别-->
            <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        <PatternLayout pattern="${LOG_PATTERN}" />
        <Policies>
            <!--
                interval属性用来指定多久滚动一次,默认是1,这里配合filePattern
                如果 filePattern 为 yyyy-MM-dd,则按天生成归档日志
                如果 filePattern 为 yyyy-MM-dd HH-mm,则按分钟生成归档日志
                modulate,从0点开始计时,否则从当前时间+interval计时
            -->
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            <!-- 指定单个日志文件的大小 -->
            <SizeBasedTriggeringPolicy size="5M"/>
        </Policies>
        <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
        <DefaultRolloverStrategy fileIndex="max" max="7"/>
    </RollingFile>

4.RollingRandomAccessFile(常用)

RollingFile的增强版,效率提升20%-200%不等

Loggers

包含Logger和Root

Logger指定自定义,

Root指定全局Logger

    <Loggers>
        <!--设置指定包或类的日志级别,>
        <logger name="org.springframework" level="INFO"></logger>
        <!-- 指定项目的根日志 -->
        <Root level="info">
            <AppenderRef ref="STDOUT"/>
            <AppenderRef ref="FileLog"/>
            <AppenderRef ref="RollingFileInfo"/>
            <AppenderRef ref="RollingFileError"/>
        </Root>
    </Loggers>

Pattern详细参数

%c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介
假设当前logger名字空间是"a.b.c"
%c a.b.c
%c{2} b.c
%20c (若名字空间长度小于20,则左边用空格填充)
%-20c (若名字空间长度小于20,则右边用空格填充)
%.30c (若名字空间长度超过30,截去多余字符)
%20.30c (若名字空间长度小于20,则左边用空格填充;若名字空间长度超过30,截去多余字符)
%-20.30c (若名字空间长度小于20,则右边用空格填充;若名字空间长度超过30,截去多余字符)
%C 列出调用logger的类的全名(包含包路径) 假设当前类是"org.apache.xyz.SomeClass"
%C org.apache.xyz.SomeClass
%C{1} SomeClass
%d 显示日志记录时间,{<日期格式>}使用ISO8601定义的日期格式 %d{yyyy/MM/dd HH:mm:ss,SSS} 2005/10/12 22:23:30,117
%d{ABSOLUTE} 22:23:30,117
%d{DATE} 12 Oct 2005 22:23:30,117
%d{ISO8601} 2005-10-12 22:23:30,117
%F 显示调用logger的源文件名 %F MyClass.java
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 %l MyClass.main(MyClass.java:129)
%L 显示调用logger的代码行 %L 129
%m 显示输出消息 %m This is a message for debug.
%M 显示调用logger的方法名 %M main
%n 当前平台下的换行符 %n Windows平台下表示rn
UNIX平台下表示n
%p 显示该条日志的优先级 %p INFO
%r 显示从程序启动时到记录该条日志时已经经过的毫秒数 %r 1215
%t 输出产生该日志事件的线程名 %t MyClass
%x 按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志 假设某程序调用顺序是MyApp调用com.foo.Bar
%c %x - %m%n MyApp - Call com.foo.Bar.
com.foo.Bar - Log in Bar
MyApp - Return to MyApp.
%X 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。 %X{5} (记录代号为5的客户端的日志)
%% 显示一个百分号 %% %

自用配置

如下配置按天生成日志

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数,如下配置为30分钟检测一次-->
<Configuration status="WARN" monitorInterval="3600">

    <Properties>
        <!-- ==============================================公共配置============================================== -->
        <!-- 设置日志文件的目录名称 -->
        <property name="LOG_HOME" value="${sys:catalina.home}/logs/"/>

        <!-- 日志默认存放的位置,可以设置为项目根路径下,也可指定绝对路径 -->
        <!-- 存放路径一:通用路径,window平台 -->
        <!-- <property name="LOG_HOME">d:/logs/${logFileName}</property> -->
        <!-- 存放路径二:web工程专用,java项目没有这个变量,需要删掉,否则会报异常,这里把日志放在web项目的根目录下 -->
        <!-- <property name="LOG_HOME">${web:rootDir}/${logFileName}</property> -->
        <!-- 存放路径三:web工程专用,java项目没有这个变量,需要删掉,否则会报异常,这里把日志放在tocmat的logs目录下 -->
        <!--<property name="LOG_HOME">${sys:catalina.home}/logs/${logFileName}</property>-->

        <!-- 控制台默认输出格式,%clr{} 带上颜色,"%-5level":日志级别,"%l":输出完整的错误位置,是小写的L,因为有行号显示,所以影响日志输出的性能 -->
        <!--<property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %clr{%5p}  ${sys:PID}-[%t] %l %30c{1.}.%M%clr{(%F:%L)}:%m%n </property>-->
        <property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} %t %l:%m%n</property>
        <property name="LOG_PATTERN_COLOR">%d{yyyy-MM-dd HH:mm:ss.SSS} %clr{%5p} %clr{${sys:PID}}{magenta}  %clr{[%15.15t]} %clr{%-40.40c{1.}}{cyan}:%m%n</property>
        <!--<property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{-&#45;&#45;}{faint} %clr{[.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</property>-->
        <!--<property name="COLOR_PATTERN">%highlight{%d{HH:mm:ss.SSS} %-5level %logger{36}.%M() @%L - %msg%n}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=black, DEBUG=green bold, TRACE=blue}</property>-->
        <!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 -->
        <!-- <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M - %m%n</property> -->
        <!-- 日志文件默认输出格式,另类带行号输出(对日志输出性能未知);%C:大写,类名;%M:方法名;%L:行号;%m:错误信息;%n:换行 -->
        <!--<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M[%L line] - %m%n</property>-->

        <!-- 日志默认切割的最小单位 -->
        <property name="EVERY_FILE_SIZE">1GB</property>
        <!-- 日志默认输出级别 -->
        <property name="OUTPUT_LOG_LEVEL">INFO</property>

        <!-- ===========================================所有级别日志配置=========================================== -->
        <!-- 日志默认存放路径(所有级别日志) -->
        <property name="ROLLING_FILENAME">${LOG_HOME}/all.log</property>
        <!-- 日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="ROLLING_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz</property>
        <!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个,filePattern最后要带%i才会生效 -->
        <property name="ROLLING_MAX">30</property>
        <!-- 日志默认同类型日志,多久生成一个新的日志文件,这个配置需要和filePattern结合使用,默认为1;
                如果设置为1,filePattern是%d{yyyy-MM-dd}到天的格式,则间隔一天生成一个文件
                如果设置为12,filePattern是%d{yyyy-MM-dd-HH}到小时的格式,则间隔12小时生成一个文件 -->
        <property name="ROLLING_TIME_INTERVAL">1</property>

        <!-- ============================================Info级别日志============================================ -->
        <!-- Info日志默认存放路径(Info级别日志) -->
        <property name="INFO_FILENAME">${LOG_HOME}/info.log</property>
        <!-- Info日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="INFO_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz</property>
        <!-- ============================================Warn级别日志============================================ -->
        <!-- Warn日志默认存放路径(Warn级别日志) -->
        <property name="WARN_FILENAME">${LOG_HOME}/warn.log</property>
        <!-- Warn日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="WARN_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz</property>
        <!-- Warn日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
        <!-- ============================================Error级别日志============================================ -->
        <!-- Error日志默认存放路径(Error级别日志) -->
        <property name="ERROR_FILENAME">${LOG_HOME}/error.log</property>
        <!-- Error日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="ERROR_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz</property>

        <!-- ============================================控制台显示控制============================================ -->
        <!-- 控制台显示的日志最低级别 -->
        <property name="CONSOLE_PRINT_LEVEL">DEBUG</property>

    </Properties>

    <!--定义appender -->
    <Appenders>
        <!-- =======================================用来定义输出到控制台的配置======================================= -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 设置输出格式,不设置默认为:%m%n -->
            <PatternLayout pattern="${LOG_PATTERN_COLOR}"/>
        </Console>

        <!-- =======================================打印INFO级别的日志到文件======================================= -->
        <RollingRandomAccessFile name="InfoFile" fileName="${INFO_FILENAME}" filePattern="${INFO_FILEPATTERN}">
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${ROLLING_MAX}"/>
            <Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingRandomAccessFile>

        <!-- =======================================打印WARN级别的日志到文件======================================= -->
        <RollingRandomAccessFile name="WarnFile" fileName="${WARN_FILENAME}" filePattern="${WARN_FILEPATTERN}">
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${ROLLING_MAX}"/>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingRandomAccessFile>

        <!-- =======================================打印ERROR级别的日志到文件======================================= -->
        <RollingRandomAccessFile name="ErrorFile" fileName="${ERROR_FILENAME}" filePattern="${ERROR_FILEPATTERN}">
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${ROLLING_MAX}"/>
            <Filters>
                <ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingRandomAccessFile>
    </Appenders>

    <!--定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <Loggers>
        <!--level指定级别,additivity表示是否向上传递打印日志信息(若为true则向上传递,那么root根对象也会进行日志打印-->
        <Logger name="com.mayezi.log4j2.Log4jSpringBootApplication" level="INFO" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <!--建立一个默认的root的logger-->
        <Root level="INFO">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="InfoFile"/>
            <AppenderRef ref="WarnFile"/>
            <AppenderRef ref="ErrorFile"/>
        </Root>
    </Loggers>

</Configuration>

默认配置

在spring-boot-2.x.x.RELEASE.jar中org.springframework.boot.logging.log4j2文件夹下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
	<Properties>
		<Property name="PID">????</Property>
		<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
		<Property name="LOG_LEVEL_PATTERN">%5p</Property>
		<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
		<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
		<Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
	</Properties>
	<Appenders>
		<Console name="Console" target="SYSTEM_OUT" follow="true">
			<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
		</Console>
	</Appenders>
	<Loggers>
		<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
		<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
		<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
		<logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
		<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
		<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
		<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
		<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
		<Root level="info">
			<AppenderRef ref="Console" />
		</Root>
	</Loggers>
</Configuration>

参考文章

blog.51cto.com/1197822/215…

juejin.cn/post/684490…

www.cnblogs.com/hafiz/p/617…

blog.csdn.net/Q176782/art…

logging.apache.org/log4j/2.x/