zoukankan      html  css  js  c++  java
  • Java日志介绍(3)-Logback

    Logback 继承自Log4j,它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小,包含了许多独特并且有用的特性。logback需和SLF4J配合使用,所以在工程中除了需引入Logback的jar包,还需引入SLF4J的jar包;文中所使用到的软件版本:Java 1.8.0_191、logback 1.2.3、slf4j 1.7.29。

    1、配置

    1.1、加载配置

    Logback能够在初始化期间自动查找配置文件进行配置;按照优先级查找配置文件直到找到,优先级如下:

    1、查找系统属性logback.configurationFile对应的配置文件
    2、在classpath下查找logback-test.xml
    3、在classpath下查找logback.groovy
    4、在classpath下查找logback.xml
    5、通过JDK提供的ServiceLoader工具在类路径下寻找文件META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了Configurator接口的实现类的全限定类名
    6、如果以上都没有成功,logback会通过BasicConfigurator为自己进行配置,并且日志将会全部在控制台打印出来。

    1.2、自动更新配置

    <configuration>标签上添加 scan=true属性,可以让Logback自动定期扫描配置文件;默认一分钟扫描一次配置文件,<configuration> 标签上的 scanPeriod 属性可以指定扫描周期。扫描周期的时间单位可以是毫秒、秒、分钟或者小时。

    <configuration scan="true" scanPeriod="30 seconds">
       
    </configuration>

    2、Appenders

    2.1、ConsoleAppender

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
      </encoder>
    </appender>

    输出日志到控制台,有如下常用参数:

    name 输出目的地名称
    target SYSTEM_OUT或SYSTEM_ERR,默认为SYSTEM_OUT
    encoder encoder是处于Appender与Layout之间的一个中间层,它将日志事件转换为字节数组,并将字节数组写入到一个OutputStream中
    withJansi 是否显示彩色代码,默认为false

    2.2、FileAppender

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
      <file>D:/temp/aa.log</file>
      <encoder>
        <pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
      </encoder>
    </appender>

    输出日志到文件,有如下常用参数:

    name 输出目的地名称
    append 日志是否追加到文件里,默认为true
    encoder encoder是处于Appender与Layout之间的一个中间层,它将日志事件转换为字节数组,并将字节数组写入到一个OutputStream中
    file 日志文件名
    prudent 是否严格模式,默认为false;严格模式下写日志速度较慢
    immediateFlush 日志事件是否被立即刷新到底层的输出流,默认为true;设为true可以提高吞吐率

    2.2、RollingFileAppender

    轮转日志文件输出日志,有如下常用参数:

    name 输出目的地名称
    append 日志是否追加到文件里,默认为true
    encoder encoder是处于Appender与Layout之间的一个中间层,它将日志事件转换为字节数组,并将字节数组写入到一个OutputStream中
    file 日志文件名
    prudent 是否严格模式,默认为false;严格模式下写日志速度较慢
    rollingPolicy 当轮转发生时,指定RollingFileAppender的行为
    triggeringPolicy 告诉RollingFileAppender什么时候发生轮转行为

    2.2.1、TimeBasedRollingPolicy

    <!-- 按天轮训 ,保存10天的历史记录,总的最大大小为 3GB-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>10</maxHistory>
        <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>

    TimeBasedRollingPolicy基于时间来定义轮转策略,它既负责轮转的行为,也负责触发轮转。有如下参数:

    fileNamePattern 必选参数,定义了轮转时得文件名,需加上表示日期的参数%d,格式需符合java.text.SimpleDateFormat;如果以.gz或者.zip结尾,则启动文件自动压缩
    maxHistory 最多的归档文件数量
    totalSizeCap 控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时需要设置maxHistory属性,maxHistory会被作为第一条件,该属性作为第二条件
    cleanHistoryOnStart 如果设置为true,appender启动的时候,归档文件将会被删除。默认的值为 false

    2.2.2、SizeAndTimeBasedRollingPolicy

    <!-- 按天及日志文件大小轮训 ,保存10个文件历史记录,总的最大大小为 3GB-->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <maxFileSize>200MB</maxFileSize>
        <maxHistory>10</maxHistory>
        <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>

    SizeAndTimeBasedRollingPolicy基于大小及时间来定义轮转策略,它既负责轮转的行为,也负责触发轮转。有如下参数:

    fileNamePattern 必选参数,定义了轮转时得文件名,需加上表示日期的%d参数及表示序号的%i参数,日期格式需符合java.text.SimpleDateFormat,序号从0开始;如果以.gz或者.zip结尾,则启动文件自动压缩
    maxFileSize 日志文件达到了maxFileSize指定的大小,会进行归档
    maxHistory 最多的归档文件数量
    totalSizeCap 控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时需要设置maxHistory属性,maxHistory会被作为第一条件,该属性作为第二条件
    cleanHistoryOnStart 如果设置为true,appender启动的时候,归档文件将会被删除。默认的值为 false

    2.2.3、SizeAndTimeBasedRollingPolicy

    <!--归档日志文件个数为5,依次为bb.1.log,...,bb.5.log-->
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>D:/temp/bb.%i.log</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>5</maxIndex>
    </rollingPolicy>

    SizeAndTimeBasedRollingPolicy基于固定窗口算法重命名日志文件,它只负责轮转的行为。有如下参数:

    fileNamePattern 必选参数,定义了轮转时得文件名,需加上表示序号的%i参数,序号从0开始;如果以.gz或者.zip结尾,则启动文件自动压缩
    minIndex 表示窗口索引的下界
    maxIndex 表示窗口索引的上界

    2.2.4、SizeBasedTriggeringPolicy

    <!--日志文件达到5M就行归档-->
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>

    SizeBasedTriggeringPolicy基于文件大小的触发器,它只负责触发轮转。有如下参数:

    maxFileSize 日志文件达到了maxFileSize指定的大小,会进行归档

    3、Layouts

    logback提供了PatternLayout、HTMLLayout、XMLLayout等等,这里着重介绍PatternLayout。

    <pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>

    PatternLayout通过参数来格式化日志信息,与log4j 1.x中的用法很类似:

    d{pattern}、date{pattern}、d{pattern, timezone}、date{pattern, timezone} 输出日志记录事件的日期,可以在其后指定格式;如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781
    p、le、level 输出日志记录事件的优先级
    t、thread 输出生成日志记录事件的线程的名称
    c{length}、lo{length}、logger{length} 输出日志记录事件的类别;后面可以给出精度,如类别为"org.apache.commons.Foo";%c{1}将输出"Foo",%c{1.}将输出"o.a.c.Foo"
    C{length}、class{length} 输出发出日志记录请求的调用方的完全限定类名称;后面可以给出精度,与c{precision}类似。
    M、method 输出发出日志记录请求的方法名称。该操作代价较高,可能会影响性,小心使用。
    F、file 输出发出日志记录请求的文件名。该操作代价较高,可能会影响性,小心使用。
    L、line 输出发出日志记录请求的文件行号。该操作代价较高,可能会影响性,小心使用。
    m、msg、message 输出应用程序提供的消息
    n 输出与平台相关的行分隔符,Windows平台为 ,Unix平台为
    X{key:-defaultVal}、mdc{key:-defaultVal}用于输出与生成日志记录事件的线程关联的MDC(嵌套诊断上下文)。如%MDC{userid:-admin},-后面表示默认值。

    4、Filters

    Filters用来确定日志是否被输出。通常情况下,过滤器的逻辑由两个正交的部分组成,onMatch/onMismatch的检验。onMatch:匹配过滤器时执行的动作,onMismatch:不匹配过滤器时执行的动作;这两个参数的值可以为: ACCEPT、DENY 或NEUTRAL。ACCEPT表示输出日志;DENY表示不输出日志;NEUTRAL一般用于多个过滤器中,表示执行下一个过滤器。

    在多个过滤器一起使用时:
    如果一个过滤器配置为onMatch="ACCEPT"(或onMismatch="ACCEPT"),并且日志消息匹配onMatch(或匹配onMismatch),则输出该日志消息并忽略后面的过滤器;
    如果一个过滤器配置为onMatch="DENY"(或onMismatch="DENY"),并且日志消息匹配onMatch(或匹配onMismatch),则不输出该日志消息并忽略后面的过滤器;
    如果一个过滤器配置为onMatch="NEUTRAL"(或onMismatch="NEUTRAL"),并且日志消息匹配onMatch(或匹配onMismatch),则继续执行后面的过滤器。

    4.1、LevelFilter

    日志级别过滤器,判断日志级别是否与配置的级别相等。

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>NEUTRAL</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>

    4.2、ThresholdFilter

    阈值过滤器,输出日志级别是否大于等于配置的日志。

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>

     这两个过滤器比较简单,还有其他一些较复杂的过滤器:GEventEvaluator、JaninoEventEvaluator等等,这里就不介绍了,可以参考官方文档:http://logback.qos.ch/manual/filters.html

    5、实际使用

    5.1、配置文件logback.xml

    该文件放到src或src/main/resources(spring boot工程)下即可。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration debug="false">
        <timestamp key="bySecond" datePattern="yyyyMMddHHmmss" />
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
              <level>INFO</level>
            </filter>
            
            <encoder>
                <pattern>[logback]%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
            </encoder>
        </appender>
        <appender name="FILE" class="ch.qos.logback.core.FileAppender">
            <file>D:/temp/aa-${bySecond}.log</file>
            <encoder>
                <pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
            </encoder>
            <immediateFlush>true</immediateFlush>
        </appender>
        
        <appender name="RollingFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
           <file>D:/temp/bb.log</file>
           
           <!-- 按天轮训 ,保存10天的历史记录,总的最大大小为 3GB-->
           <!-- rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
                <maxHistory>10</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy-->
            
            <!-- 按天及日志文件大小轮训 ,保存10个文件历史记录,总的最大大小为 3GB-->
            <!-- rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <maxFileSize>3KB</maxFileSize>
                <maxHistory>10</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy-->
            
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>D:/temp/bb.%i.log</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>3</maxIndex>
            </rollingPolicy>
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>3KB</maxFileSize>
            </triggeringPolicy>
           <encoder>
                <pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
           </encoder>
        </appender>
    
        <root level="info">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="FILE" />
            <appender-ref ref="RollingFILE" />
        </root>
    
    </configuration>

    5.2、代码例子

    package com.inspur.demo.log;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    /**
     * Logback使用示例
     */
    public class LogbackCase {
        public static final Logger logger = LoggerFactory.getLogger(LogbackCase.class);
        public static void main(String[] args) throws Exception {
            logger.debug("This is debug message.");
            logger.warn("This is warn message.");
            for (int i = 0; i < 100; i++) {
                logger.info("This is info message:" + i);
            }
        }
    }

    运行代码可以看到控制台及相关的文件中生成了日志消息。

  • 相关阅读:
    Azure WAF防火墙工作原理分析和配置向导
    多云时代,海外微软Azure云与国内阿里云专线打通性能测试
    【Hololens】微软Hololens虚拟现实视频集
    【Azure】Azure学习方法和学习资料
    LINUX ON AZURE 安全建议(全)
    编程行业之网络贩卖生存
    Bootstrap
    我谷首开博客
    Noip2018普及组初赛试题解题报告
    奇yin技巧
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/12326167.html
Copyright © 2011-2022 走看看