zoukankan      html  css  js  c++  java
  • slf4j 与 log4j2 实战讲解与日志分割

    这两天搭建项目的时候用到log4j2在这里把自己的问题与了解拿出来与大家分享一下。

    1.为什我要用

        因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用log4j2而不是log4j是因为Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上),Log4j2.0是XML的配置。

    2.使用方法

    在类中获取logger实例的方法为

    Logger logger = LogManager.getLogger(Test.class);

    使用时直接 logger.debug()就可以。

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- log4j2使用说明(create By SeanXiao    ):
    使用方式如下:
    private static final Logger logger = LogManager.getLogger(实际类名.class.getName());
    
    2、日志说明:
    (1)请根据实际情况配置各项参数
    (2)需要注意日志文件备份数和日志文件大小,注意预留目录空间
    (3)实际部署的时候backupFilePatch变量需要修改成linux目录
     -->
    <configuration status="error">
        <Properties>
            <Property name="fileName">front.log</Property>
            <Property name="backupFilePatch">d:/usr/front/log/</Property>
          </Properties>
        <!--先定义所有的appender-->
        <appenders>
            <!--这个输出控制台的配置-->
            <Console name="Console" target="SYSTEM_OUT">
                 <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
                <!--这个都知道是输出日志的格式-->
                <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
            </Console>
            
            <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
            <RollingFile name="RollingFile" fileName="${backupFilePatch}/${fileName}"
                filePattern="${backupFilePatch}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
                <PatternLayout
                    pattern="%d{yyyy.MM.dd 'at' HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n" />
                
                <!-- 日志文件大小 -->
                <SizeBasedTriggeringPolicy size="20MB" />
                <!-- 最多保留文件数 -->
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
        </appenders>
        
        <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
        <loggers>
            <!--建立一个logger,此logger监听name对应的包名下的日志输出,level表示日志级别-->
            <Logger name="com.testlog" level="trace"
                additivity="true">
                <AppenderRef ref="RollingFile" />
            </Logger>
    <!--建立一个默认的root的logger-->
    <Root level="error">
    <AppenderRef ref="Console" />
    </Root>
        </loggers>
    </configuration>


    3.配置文件节点解析    

        (1).根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).

           status用来指定log4j本身的打印日志的级别.

           monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.

        (2).Appenders节点,常见的有三种子节点:Console、RollingFile、File.

           Console节点用来定义输出到控制台的Appender.

            name:指定Appender的名字.

            target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.

            PatternLayout:输出格式,不设置默认为:%m%n.

           File节点用来定义输出到指定位置的文件的Appender.

            name:指定Appender的名字.

            fileName:指定输出日志的目的文件带全路径的文件名.

            PatternLayout:输出格式,不设置默认为:%m%n.

           RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.

            name:指定Appender的名字.

            fileName:指定输出日志的目的文件带全路径的文件名.

            PatternLayout:输出格式,不设置默认为:%m%n.

            filePattern:指定新建日志文件的名称格式.

            Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.

            TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.

            SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.

            DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

        (3).Loggers节点,常见的有两种:Root和Logger.

           Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

             level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

             AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.

           Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

             level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

             name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.

             AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

        (4).关于日志level.

          共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

          All:最低等级的,用于打开所有日志记录.

          Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.

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

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

          Warn:输出警告及warn以下级别的日志.

          Error:输出错误信息日志.

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

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

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

    4.自己遇到的问题

         开始是遇到日志无法按照小时去分割,后来查到资料。如果是新的项目要记住,如果日志文件是空内容,那么它不会自动去分割。

           log4j2的按天分日志文件

    1. <RollingFile name="error_appender" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error-%d{yyyy-MM-dd}.log">  
    2.     <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%thread] %m%n"/>  
    3.     <Policies>  
    4.         <TimeBasedTriggeringPolicy modulate="true" interval="1"/>  
    5.     </Policies>  
    6. </RollingFile>  

            按大小分

    1. <RollingFile name="error_appender" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error-%d{yyyy-MM-dd}-%i.log.gz">  
    2.     <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%thread] %m%n"/>  
    3.     <SizeBasedTriggeringPolicy size="100 MB" />  
    4. </RollingFile>  

            按分钟分

    1.     <RollingRandomAccessFile name="_1min_appender" fileName="${MINUTE_HOME}/minute" filePattern="${MINUTE_HOME}/minute-%d{yyyy-MM-dd-HH-mm}.log">  
    2.         <PatternLayout pattern="%m%n"/>  
    3.         <Policies>  
    4.     <TimeBasedTriggeringPolicy interval="1" modulate="true" />  
    5. </Policies>  
    6.     </RollingRandomAccessFile>  

    关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval,日期格式精确到哪一位,interval也精确到哪一个单位

    参考自https://www.cnblogs.com/haiyupeter/p/6864425.html

              https://blog.csdn.net/zhang168/article/details/46814489

              https://www.cnblogs.com/hafiz/p/6170702.html

  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/technologykai/p/8717326.html
Copyright © 2011-2022 走看看