log4j 2整理

# Log4j 2最佳实践 #
Log4j的1.x版本已经被普遍使用于不少应用程序中。然而,它这些年的发展已经放缓。它变得愈来愈难以维护,由于它须要严格遵循很老的Java版本,并在2015年8月寿终正寝。它的替代品,SLF4J和Logback对框架作了不少必要的改进。  

```
一、首先移除log4j相关的jar包
<dependency>
    ...
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

二、添加slf4j和log4j 2的jar包
<!-- log4j2 依赖的jar包 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
    <scope>runtime</scope>
</dependency>
<!-- 与slf4j整合所需 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.11.1</version>
    <scope>runtime</scope>
</dependency>
<!-- web网站须要 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.11.1</version>
    <scope>runtime</scope>
</dependency>
<!-- 异步使用的依赖 -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.7</version>
    <scope>runtime</scope>
</dependency>

三、添加配置文件:log4j2.xml
# Log4j 2最佳实践 #
Log4j的1.x版本已经被普遍使用于不少应用程序中。然而,它这些年的发展已经放缓。它变得愈来愈难以维护,由于它须要严格遵循很老的Java版本,并在2015年8月寿终正寝。它的替代品,SLF4J和Logback对框架作了不少必要的改进。  

```
一、首先移除log4j相关的jar包
<dependency>
    ...
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

二、添加slf4j和log4j 2的jar包
<!-- log4j2 依赖的jar包 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
    <scope>runtime</scope>
</dependency>
<!-- 与slf4j整合所需 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.11.1</version>
    <scope>runtime</scope>
</dependency>
<!-- web网站须要 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.11.1</version>
    <scope>runtime</scope>
</dependency>
<!-- 异步使用的依赖 -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.7</version>
    <scope>runtime</scope>
</dependency>

三、添加配置文件:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
    首先看Configuration元素,log4j2框架本身也有一系列日志,好比框架初始化日志或者初始化失败日志什么的。
    status表示应该记录哪一个等级的log4j2自身的日志,通常状况下WARN就行,若是出现了了WARN等级的日志,就要及时排查排查了。
    log4j2支持自动热更新配置文件,直接改log4j2的配置文件,它就能自动从新加载,monitorInterval表示应该多久检测一次更新,单位:秒,默认5秒。
-->
<Configuration status="WARN" monitorInterval="5">
   
    <!-- 将一些经常使用值提取出来,而后在文件的其余部分经过${}的形式引用,这些值能够随便定义 -->
    <Properties>
        <!-- 定义日志文件根目录 -->
        <Property name="logDir" value="d:/logs" />
        <!-- 定义日志的通用格式 -->
        <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>


<!--
Appenders元素,官方文档表示有还有一种异步appender,写文件等使用同步便可,在作数据库插入等耗时操做时用,并且在多线程状况下有可能出现问题,不讨论那个。
官方文档有不少种类型的appender,可是日常工做中经常使用的也就是console类型和file类型的。
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是不起做用的。 -->
    <!-- appender们的定义,能够控制台、文件、发邮件、存数据库等等。常规状况下只用控制台和文件便可 -->
        <!-- appender们的定义 -->
    <Appenders>
        <!-- 定义一个console类型定定义,若是须要,能够以这个为原型粘贴复制修改再定义适合本身的 -->
        <Console name="app_console" target="SYSTEM_OUT">
            <PatternLayout pattern="${patternLayout}" />
        </Console>
        
        <!-- debug及以上级别的日志都打印在一个文本中 -->
        <RollingRandomAccessFile name="app_debug" fileName="${logDir}/app-debug.log"
            filePattern="${logDir}/app-debug_${genericFilePattern}.log" append="true">
            <Filters>
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${patternLayout}" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" />
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="1000000" compressionLevel="5" />
        </RollingRandomAccessFile>
        
        <!-- 只打印info -->
        <RollingRandomAccessFile name="app_info_only" fileName="${logDir}/app-info.log"
            filePattern="${logDir}/app-info_${genericFilePattern}.log" append="true">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${patternLayout}" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" />
                <SizeBasedTriggeringPolicy size="100 MB" />
            </Policies>
            <DefaultRolloverStrategy max="1000000" compressionLevel="5" />
        </RollingRandomAccessFile>
        
    </Appenders>


    <!-- 定义logger们 -->
    <Loggers>
        <!-- 定义根logger,根logger是必须的,这里我把根logger定义为异步的,也可为定义为普通的同步的,可是注意在同步根logger和异步根logger中只能存在一个,不能两个都配置 -->
        <asyncRoot level="debug">
            <AppenderRef ref="app_console" />
        </asyncRoot>
        <!-- 普通的根logger,注意,跟上面的异步跟root同时只能存在一个 -->
        <!-- <Root level="trace"> <AppenderRef ref="consoleAppender" /> </Root> -->
        <!-- 定义一个普通的logger,这里我定义为异步的 -->
        <!-- 定义一个普通的logger,这里我定义为异步的
            additivity:表示是否将本身所管目录下的消息复制一份发送给父类(即rootLoggers)默认true
            name:loggers监控的包名,好比com.sun.jdbc
            lever:级别,只有大于等于该级别的才能被监听到
        -->
        <asyncLogger name="logtest" level="debug" additivity="false">
            <AppenderRef ref="app_console" />
            <AppenderRef ref="app_debug" />
            <AppenderRef ref="app_info_only" />
        </asyncLogger>
    </Loggers>
</Configuration>
```
```java

相关文章
相关标签/搜索