logback 配置详解

本文初衷为自己学习logback总结,参考书籍为陈华翻译的《logback中文手册》
笔友愿意奉献积分的,可到优快云下载:
https://download.youkuaiyun.com/download/smarttxp/11097957下载,积分为系统设置,知道怎么修改设置的请留言,谢谢。
没有积分的可到我的网盘下载:
链接:https://pan.baidu.com/s/1OQ9VDIzM9qOST5_aFCU53Q   提取码:j7pk 
 

言归正传,本文将从三个方面阐述个人学习logback的开发知识。如果想更系统学习,可阅读   logback_中文手册(译者陈华)

一、级别继承性、基本选择规则 、Appender叠加性

  •  有效级别(Level)即级别继承 

1)命名层次

Logger 是命名了的实体。它们的名字大小写敏感且遵从下面的层次化的命名规则: 

如果 logger的名称带上一个点号后是另外一个 logger的名称的前缀,那么,前者就被 称为后者的祖先。如果 logger与其后代 logger之间没有其他祖先,那么,前者就被称为子 logger 之父。 

2)有效级别(Level)即级别继承

  • logger L的有效级别等于其层次等级里的第一个非 null 级别,顺序是从 L开始,向上 直至根 logger。 
    • 举例:L级别为debug,不管父类为啥级别,L的有效级别就是debug
                 L级别为null,第一个追溯到的父类级别为trace,则L的有效级别就是trace,不管再往上的父类是啥级别。
  • 为确保所有 logger 都能够最终继承一个级别,根 logger 总是有级别,默认情况下,这 个级别是 DEBUG。 

3) 打印方法和基本选择规则 

  • 打印方法:根据定义,打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么, 语句 L.info("..")是一条级别为 INFO 的记录语句。
  • 基本选择规则 :记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。 
    该规则是 logback 的核心。级别排序为:TRACE < DEBUG < INFO < WARN < ERROR。 

4)Appender叠加性

  • appender 叠加性:Logger L的记录语句的输出会发送给 L及其祖先的全部 appender。
  • additivity 属性能够中断叠加性:如果 logger L的某个祖先 P设置叠加性标识(additivity 属性)为 false,那么,L的输出会发送给L 与 P 之间(含 P)的所有 appender,但不会发送给 P 的任何祖先的 appender。  
  • additivity 默认为true:Logger 的叠加性默认为 true

综上所述,对于某个logger对象:

 

  • 第一步:确认logger对象的有效级别(级别继承规则),
  • 第二步:根据appender叠加性看logger有哪些日志组件
  • 第三步:根据基本选择规则确定哪个日志组件生效(打印级别和有效级别比较,跟appender所关联的logger 的级别无关)
  • 如上图所示,root(根logger)是error级别,组件为file,com.example.demo这个logger的级别为trace,组件为控制台输出。根据上述步骤:demo的有效级别为trace,组件为file和stdout(appender的name属性为stdout,类型是控制台输出组件),
  • 打印为trace,和有效级别trace为相等关系,因此执行两个组件,在控制台和文件中都生效了
  • 附原文:
  • 注意,基本选择规则依赖于被调用的logger的有效级别,而不是 appender所关联的logger 的级别。Logback 首先判断记录语句是否被启用,如果启用,则调用logger 等级里的appender, 无视 logger 的级别。配置文件 sample4.xml 演示了这一点

二、配置文件详解

  1. Configuration标签,根标签
    属性:
    scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
               当scan为true时,此属性生效。默认的时间间隔为1分钟。 單位: milliseconds、seconds、minutes 和 hours
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    </configuration>

     

  2. appender标签,日志组件
    属性:
    name:指定appender名称,必须
    class:指定appender的全限定名,必须
    
    appender组件分类:
    ConsoleAppender:控制台组件类,全类名:ch.qos.logback.core.ConsoleAppender
    FileAppender:文件输出组件类,全类名:ch.qos.logback.core.FileAppender
    RollingFileAppender:滚动输出组件,全类名:ch.qos.logback.core.RollingFileAppender
    
    
  3. logger标签,日志对象
    属性:
     name:logger对象名称,一般为包名,必须
     level:可选值:TRACE、DEBUG、INFO、WARN、ERROR、ALL 和 OFF,可不选,若设置为null或者INHERITED表示强制继承父级级别
     additivity:控制appender的叠加性,默认为true
    
    注意:<logger>元素可以包含零个或多个<appender-ref>元素,表示这个 appender 会被添加到该 logger。强调一下,每个用<logger>元素声明的 logger,首先会移除所有 appender,然后才添加引用了的 appender,所以如果 logger 没有引用任何 appender,就会失去所有 appender。
  4. root标签,根日志对象
    属性:
    level:可不选,默认为debug
    
    注意:Level 属性的值大小写无关,其值为下面其中一个字符串:TRACE、DEBUG、INFO、 WARN、ERROR、ALL 和 OFF。注意不能设置为“INHERITED” 或“NULL”。<logger>元素可以包含零个或多个<appender-ref>元素。与<logger>元素类似,声明<root>元素后,会先关闭然后移除全部当前 appender,只引用声明了的 appender。如果 root 元素没有引用任何 appender,就会失去所有appender。
  5. 其他标签
    contextName标签,设置日志上下文名称,可以用来区分不同应用程序的日志,将%contextName 放入日志格式即可
    <contextName>myAppName</contextName>
    property标签,用来设置常量值,以便后面用作变量替换,替换是使用${},下面例子即为:${USER_HOME}
    <property name="USER_HOME" value="/home/sebastien" />
    timestamp标签:获取当前系统时间,datePattern属性为日期格式,遵循java.text.SimpleDateFormat 里的约定
    <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" />
    maxFileSize 单位 bytes、KB、MB 或 GB
    include标签,文件包含
    

 

案例:下面通过实际案例来配置常用的appender

控制台打印
 

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

 <!--ConsoleAppender为控制台输出打印-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <!--设置输出格式-->
      <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
      </encoder>
          <target>System.out</target>
    </appender>

    <!--设置根logger-->
    <root level="TRACE">
        <appender-ref ref="STDOUT" />
    </root>

    <!--com.example.demo为包名-->
    <logger name="com.example.demo" level="DEBUG">
        <appender-ref ref="STDOUT" />
    </logger>
</configuration>

文件输出 

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!--    <file>C:\Users\pc\Desktop\笔记\testFile.log</file>-->绝对路径
    <file>../testFile.log</file>  <!--相对目录下生成日志文件,./:src同级目录下 ../:src上级的同级目录-->
    <append>true</append>  //默认为true
        <!--prudent标签是是否安全写入,默认false,开启时是非开启状态三倍的性能消耗--> 
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>

滚动输出 

概念:
RollingFileAppender 能先记录到文件“log.txt”,然后当符合某个条件时,变成记录到其他文件。

        窗口滚动 FixedWindowRollingPolicy

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <contextName>myApp</contextName>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>testFile.log</file>
        <!--滚动策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>testFile.%i.log.zip</fileNamePattern>
        <minIndex>1</minIndex>
        <!--最大值为12,超过会默认设置为12-->
        <maxIndex>3</maxIndex>
    </rollingPolicy>
        <!--滚动条件-->
    <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>1M</maxFileSize>
    </triggeringPolicy>
    <encoder>
        <pattern>%contextName %-4relative [%thread] %-5level %logger{35} - %msg%n
        </pattern>
    </encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
        

 
                 过程示例:

        时间滚动 TimeBasedRollingPolicy
 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按每天归档 -->
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 保存30个周期日志,如果是每月归档就是30个月 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%contextName %-4relative [%thread] %-5level %logger{35} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="FILE" />
    </root>
</configuration>

          时间和文件大小滚动 SizeAndTimeBasedFNATP
 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>mylog.txt</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天滚动 -->
            <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 设置文件大小 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--设置保存的最大周期数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%contextName %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="ROLLING" />
    </root>
</configuration>

三、spring boot 配置logback
使用时,将配置文件命名为 logback-spring.xml、logback.groovy、logback.xml;三者的加载顺序也是依次类推

四、不同包下日志输出到不同位置


只要设置不同的logger和appender即可,此处不再赘述

综上为个人总结,参考自logback_中文手册(译者陈华),想更系统学习logback,可下载学习,如有错误,请批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值