spring boot 配置log4j2

一.介绍

log4j2是apache著名日志框架log4j的升级,参考logback架构,并且修复了logback固有的一些问题。是一个很好的日志框架。我看了网上一些关于log4j2的教程,要么是光讲概念,要么是只贴代码,适合新手入门的教程比较少。本篇教程的目标是给那些初次使用log4j2的人一个快速入门、配置代码拿来就可用的指导。 
log4j2官方文档大而全、有很多概念,往往给一个问题提供多种不同的解决方案。我结合自身使用体验,对工作开发中常用的日志配置提供我个人认为最好的那一种配置,只介绍一种配置,拿来即用,简单方便

Log4j 2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

二.使用

1.pom文件 

去掉spring boot-web自带的日志依赖

添加log4j2依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions><!-- 去掉默认配置 -->
				<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>
			<version>1.5.9.RELEASE</version>
</dependency>

2.log4j2.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置, 当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="warn" monitorInterval="30">
    <!--定义通用属性,下面可以使用${name}引用}-->
    <Properties>
        <!-- 定义日志文件根目录 -->
        <Property name="logDir" value="logs123" />
        <!-- 定义日志的通用格式 -->
        <Property name="genericPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <!-- 定义日志分卷文件通用文件名形式 -->
        <Property name="genericFilePattern" value="%d{yyyy-MM-dd}-%i" />
    </Properties>
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${genericPattern}"/>
        </console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/hpaasvc/info.log"
                     filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/hpaasvc/warn.log"
                     filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/hpaasvc/error.log"
                     filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!-- 定义根logger,根logger是必须的,这里我把根logger定义为异步的,也可为定义为普通的同步的,但是注意在同步根logger和异步根logger中只能存在一个,不能两个都配置 -->
        <!-- 普通的根logger,注意,跟上面的异步跟root同时只能存在一个 -->
        <!-- <Root level="trace"> <AppenderRef ref="consoleAppender" /> </Root> -->
        <asyncRoot level="info">
            <AppenderRef ref="consoleAppender" />
        </asyncRoot>
        <!--过滤掉spring和hibernate的一些无用的debug信息-->
        <logger name="org.springframework" level="INFO">
        </logger>
        <logger name="org.mybatis" level="INFO">
        </logger>
        <!--一个普通的looger-->
        <logger level="DEBUG" name="com.asiainfo.dao" additivity="false">
           <!--输出的信息源,这里输出到控制台-->
            <AppenderRef ref="Console" />
        </logger>
        <!-- 定义一个普通的logger,这里我定义为异步的 -->
        <asyncLogger name="com.foo.Bar" level="info" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFileInfo" />
        </asyncLogger>

    </loggers>
</configuration>

三、上述完整配置例子的详解

log4j2的官网有很多配置可选,但是平常工作开发中大多用不到。开头已经说过,只介绍“一种”配置,秉承这种思想,我解释下“三”中的配置示例。

其实“三”的配置示例可以当做模板来用,粘贴复制再修改修改就可以满足大部分工作开发中的需求。 
1. 首先看<Configuration>元素,log4j2框架自己也有一系列日志,比如框架初始化日志或者初始化失败日志什么的。status表示应该记录哪个等级的log4j2自身的日志,一般情况下WARN就行,如果出现了了WARN等级的日志,说明你的log4j2框架的用法有问题,就要及时排查排查了。log4j2支持自动更新配置文件,也就是说不用重启服务器,直接改log4j2的配置文件,它就能自动重新加载,起作用,完全碾压log4j,monitorInterval表示应该多久检测一次更新,单位:,默认5秒。

2. 再看<Properties>,它里面包含<Property>,就是把一些通用的值提出来,在配置的其他地方已${}的形式引用而已。

3. <Appenders>元素,官方文档表示有还有一种异步appender,但是效能提升及其有限,而且在多线程情况下有可能出现问题,所以不建议使用,本教程不讨论那个。官方文档有很多种类型的appender,但是平常工作中常用的也就是console类型和file类型的,console类型appender输出到控制台,方便开发调试用,file类型appender类型输出到文件,用在生产环境记录日志。console类型appender没得选,只有这一种,结构很简单,不用多说。file类型appender有多种类型,本教程建议使用<RollingRandomAccessFile>类型,因为这种类型的fileAppender有缓存功能,效率比RollingFile高(网上很多教程都是几年前的了,用的还是RollingFile),所以只讨论这种类型。fileName表示日志文件名,filePattern表示日志文件分卷的分卷文件的文件名(日志文件分卷就是某些情况,比如每天生成一个文件,或者单个日志文件超过100MB时自动分成多个日志文件),fileName如果已.zip结尾表示启用压缩功能,那些分卷好的日志文件会被压缩,某些情况会很有用。如果不想启用压缩功能,就不要已.zip或者其他压缩文件后缀结尾。PatternLayout表示日志格式,不必多说。Policies是触发日志文件分卷的条件。TimeBasedTriggeringPolicy表示按照时间来分卷,interval表示时间间隔,时间单位有点诡异,不是明确设置的,而是从filePattern推导的,是filePattern中最小的时间的单位,比如上述示例中的filePattern为%d{yyyy-MM-dd},这个日期时间格式必须符合java日期时间规范,其中最小日期单位为dd,也就是天,推导出来也就是1天分一个日志文件出来,如果filePattern的配置为%d{yyyy-MM-dd HH:mm},最小单位是mm,也就是分钟,那就是1分钟分一个日志文件出来,如果interval为3,那就是3天一个日志文件和3分钟一个日志文件,推导规则就是如此。SizeBasedTriggeringPolicy表示日志文件大小超过多大时对其进行分卷,size表示日志大小,单位推荐写MB,数值为大于0的整数,100 MB中间有个空格,推荐写上。DefaultRolloverStrategy表示分卷策略,只需要记住这个必须要配就行了,不必深究,max表示最多可以有多少个分卷文件,默认为7个,超出7个的日志分卷文件将被删除,也就是说可能导致重要日志丢失,所以该参数配大点,100000应该够了,compressionLevel表示压缩等级,值为0-9,只在filePattern以.zip结尾,也就是说压缩格式为zip时起作用,这也是为什么前面说建议压缩格式为zip。0表示不压缩,只打包为zip格式,9表示最高压缩比(个人测试1MB日志文件某些情况下能压缩到4KB左右)。如果不想启用压缩功能,前面说过,日志filePattern不以.zip结尾就行了,这时compressionLevel是不起作用的。

4. 表示配置各种logger的地方。根logger是必需的,可配置为普通的,也可配置问异步的,但是只能配置一种,不能两种都配置。其他的普通logger配置很简单,不必多说,可根据需要配置为普通logger或者异步logger,至于选择异步的还是普通的,教程前半部分已经说过,如果日志记录代码跟业务逻辑代码是有关系的,最好选普通logger,如果真的只是单纯为了记个日志,建议配置异步logger。根logger没有additivity属性,普通logger和异步logger有additivity属性。additivity设置为false是为了防止当前logger向父logger发送日志,导致日志被重复记录。至于log4j2的logger的父子关系,可以看这里http://logging.apache.org/log4j/2.x/manual/architecture.html。总的来说就是类似java体系的父子关系,根logger相当于是java体系中的Object类,是所有logger的父logger,所以所有logger的日志都会被添加到根logger中,所以给每个(除了根logger)添加additivity=”false”是很有必要的,可以避免记录大量重复的日志

参考https://blog.csdn.net/lianjunzongsiling/article/details/78848844

https://blog.csdn.net/V_Come_On/article/details/79408773

猜你喜欢

转载自blog.csdn.net/oschina_40730821/article/details/81737706