美文网首页
【日志】Logback配置

【日志】Logback配置

作者: 嘻洋洋 | 来源:发表于2021-11-11 20:20 被阅读0次

    Logback支持XML和groovy两种配置方式,下面介绍XML的配置方式,具体maven依赖配置查看我的另外一篇文章

    1. 配置文件目录结构

    image.png

    如图所示:三者是并列的目录结构,可以用以下一句话描述它们的关系:root和logger都是用来设置某一个包或者具体的某一个类的日志打印级别,并指定日志输出目的(appender)

    1.1 logger

    (1)作用
    用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。不是必须要有的(只有root也行,如不需要设置特殊包或类的日志)
    (2)树状层级关系
    ,Logger之间存在树状层级关系,层级关系则是根据logger的名称来决定的。如名称:com.moduleA 是com.moduleA.packageA父级,种树状结构的作用在于,子则会继承父的日志级别。其它的如appender也会根据继承关系计算得出。
    (3)标签属性
    根据定义我们知道可以有多个logger,<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性:

    • name
      来指定受此loger约束的某一个包或者具体的某一个类。
    • level
      用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此level属性,那么当前loger将会继承上级的级别。
    • addtivity
      是否向上级logger传递打印信息。默认是true。例如:
    <logger name="integration" level="INFO" additivity="false">
        <appender-ref ref="integration"/>
        <appender-ref ref="common-error"/>
    </logger>
    

    如果root中声明了<appender-ref ref="common-error">,存在相同的appender,则integration向该appender打印两遍。因此,通过additivity设置为false,可以减少因为意料之外的appender继承导致日志的过量输出。

    1.2 root

    root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。也是<logger>元素,但是它是根logger。所有的logger的父节点都是root

        <!-- 框架日志 -->
        <logger name="org.springframework" level="INFO"/>
        <!-- 定义日志 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE-SHORT"/>
        </root>
    

    "org.springframework“ 包日志输出是继承root的CONSOLE和SHORT

    1.3 appender

    (1)作用
    元素定义了日志的输出目的地,支持的输出端很多,包括控制台,文件,远程Socket服务器,MySQL,PostgreSQL等数据库,远程UNIX日志进程,JMS等。一个<logger>或<root>可以关联多个<appender>,即允许将同样的一行日志输出到多个目的地。
    (2)属性
    appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。

    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    

    <encoder>表示对日志进行编码:%d{HH: mm:ss.SSS}——日志输出时间,%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用,%-5level——日志级别,并且使用5个字符靠左对齐,%logger{36}——日志输出者的名字,%msg——日志消息,%n——平台的换行符
    ThresholdFilter为系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。如果不用记得注释掉,不然你控制台会发现没日志~
    简单配置如:

    <configuration> 
       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
       <!-- encoders are  by default assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    

    以上声明了一个输出到控制台名称为STDOUT的appender,再声明了root logger的日志级别为debug,且规定将日志输出到STDOUT流中。

    1.4 其它属性

    (1)设置上下文名称<contextName>
    每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。 一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。

    <contextName>logback</contextName>
    

    (2)变量<property>
    用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

    <property name="log.path" value="/Users/tengjun/Documents/log" />
    

    (3)输出到文件RollingFileAppender
    另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志
    appender 增加子节点

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    

    把每一天的日志归档到一个文件中,<maxHistory>30</maxHistory>表示只保留最近30天的日志,以防止日志填满整个磁盘空间。
    <totalSizeCap>1GB</totalSizeCap>用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。

    1.5 实例解析

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration  scan="true" scanPeriod="60 seconds" debug="false">
        <contextName>logback</contextName>
        <property name="log.path" value="/Users/tengjun/Documents/log" />
        <!--输出到控制台-->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
           <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>-->
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
        <!--输出到文件-->
        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
        <root level="info">
            <appender-ref ref="console" />
            <appender-ref ref="file" />
        </root>
        <!-- logback为java中的包
          没有设置addtivity,默认为true,将此logger的打印信息向上级传递;
          没有设置appender,此logger本身不打印任何信息。 -->
        <logger name="com.dudu.controller"/>
        <!--logback.LogbackDemo:类的全路径
         如果你把additivity=”false”改成additivity=”true”的话,就会打印两次,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次。 -->
        <logger name="com.dudu.controller.LearnController" level="WARN" additivity="false">
            <appender-ref ref="console"/>
        </logger>
    </configuration>
    

    2.读取配置文件原理

    logback允许多配置文件,其加载时读取配置文件的顺序如下:
    在classpath查找logback-test.xml(一般classpath为src/test/resources)
    如果该文件不存在,logback尝试寻找logback.groovy
    如果该文件不存在,logback尝试寻找logback.xml
    如果该文件不存在,logback会在META-INF下查找com.qos.logback.classic.spi.Configurator接口的实现
    如果依然找不到,则会使用默认的BasicConfigurator,导致日志直接打印到控制台,日志等级为DEBUG,日志的格式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

    3.sql语句打印

    3.1 全局配置

    <root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息。

    3.2 指定目录配置

    单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:

    <logger name="com.dudu.dao" level="DEBUG" additivity="false">
        <appender-ref ref="console" />
    </logger>
    

    4.SpringBoot 配置 LogBack

    Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback,Spring Boot 默认的日志框架 logback。spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 logback,无需另外添加。
    默认情况下springboot是不将日志输出到日志文件中,这里对日志框架的支持有两种配置方式:
    (1)application.properties 或 application.yml (系统层面)
    (2)logback-spring.xml (自定义文件方式)

    4.1 application.yml

    此方法比较简单,只能配置日志文件的路径、日志文件的格式等。具体配置文件

    logging:
      pattern:
        console: "%d - %msg%n"
      path: /Users/yg/Desktop/sell222/                
      file: demo.log
      level:
        com.erp: INFO
    

    注意点:

    • 设置目录,若只配置logging.path,那么将会在/Users/yg/Desktop/sell222/文件夹生成一个日志文件为spring.log(ps:该文件名是固定的,不能更改)。如果path路径不存在,会自动创建该文件夹
    • 设置文件,若只配置logging.file,那将会在项目的当前路径下生成一个demo.log日志文件。这里可以使用绝对路径创建文件夹和相应的日志文件。
    • logging.path和logging.file同时配置时,只有logging.file生效哦。
    • 都可以是相对路径或者绝对路径。

    默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO

    4.2 logback-spring.xml

    (1)基本概念
    此种方式可以处理比较复杂的情况,比如区分 info 和 error 日志、每天产生一个日志文件。
    由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项。上面是默认的命名规则,并且放在src/main/resources下面即可。
    如果不想用logback.xml作为Logback配置的名字,可以在application.properties配置文件里面通过logging.config属性指定自定义的名字,如:

    logging:
        config: classpath:logback-config.xml
        level:
          com.mf: debug
    

    (2)多环境日志输出
    根据据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,在 logback-spring.xml中使用 springProfile 节点来定义(文件名称不是logback.xml,想使用spring扩展profile支持,要以logback-spring.xml命名),方法如下:

        <!-- 开发、测试环境 -->
        <springProfile name="dev,test">
            <logger name="org.springframework.web" level="INFO"/>
            <logger name="org.springboot.sample" level="INFO" />
            <logger name="com.andy" level="DEBUG" />
        </springProfile>
    
        <!-- 生产环境 -->
        <springProfile name="prod">
            <logger name="org.springframework.web" level="ERROR"/>
            <logger name="org.springboot.sample" level="ERROR" />
            <logger name="com.andy" level="ERROR" />
        </springProfile>
    

    可以启动服务的时候指定 profile (如不指定使用默认),如指定prod 的方式为:

    java -jar xxx.jar –spring.profiles.active=prod
    

    参考文献:http://tengj.top/2017/04/05/springboot7/

    相关文章

      网友评论

          本文标题:【日志】Logback配置

          本文链接:https://www.haomeiwen.com/subject/zxgajktx.html