zoukankan      html  css  js  c++  java
  • log4j 2整理

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

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

    2、添加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>

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

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

    2、添加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>

    3、添加配置文件: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>
    ```
    ```

  • 相关阅读:
    gain 基尼系数
    luogu P5826 【模板】子序列自动机 主席树 vector 二分
    牛客挑战赛39 树与异或 离线 树上莫队 树状数组 约数
    4.22 省选模拟赛 三元组 manacher 回文自动机
    4.22 省选模拟赛 最优价值 网络流 最大权闭合子图
    4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列
    luogu P4008 [NOI2003]文本编辑器 splay 块状链表
    牛客挑战赛39 密码系统 后缀数组
    luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
    luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并
  • 原文地址:https://www.cnblogs.com/webyyq/p/9535865.html
Copyright © 2011-2022 走看看