SpringBoot笔记:SpringBoot2.3集成Logback日志组件配置

文章目录

  • Logback简介
    • 简介
    • 日志级别
    • 日志分类
  • Logback使用
    • 添加依赖
    • 配置Logback
    • Logback参数解释
      • 1、根节点configuration包含属性
      • 2、根节点configuration的子节点
      • 3、设置上下文名称
        • 3.1、默认方式contextName
        • 3.2、默认方式property
        • 3.3、获取时间戳字符串:timestamp
      • 4、设置loger、root
      • 5、举例说明
        • 5.1、只配置root
        • 5.2、带有logger的配置,不指定界别,不指定appender
        • 5.3、带有多个logger的配置,指定级别,指定appender

Logback简介

简介

logback是继log4j后的又一个日志框架,logback是springboot自带的日志框架,logback以严格的日志级别区分不同级别的日志(其他日志都是继承上一级的日志级别,例如:log4j2,log4j都是继承更高级别的日志),logback分为三个模块,logback-core,logback-classic,logback-access。

logback-core:logback-core是logback的核心模块,是logback-classic和的logback-access的基础。
logback-classic:实现了 slf4j API,配合 slf4j 使用,可以方便的切换其他日志框架。
logback-access:与Servlet容器(如Tomcat和Jetty)集成,提供了 HTTP 访问日志接口。

日志级别

ALL > DEBUG > INFO > WARN > ERROR > OFF 级别越低,输出日志越多,最低级别ALL,所有都输出。最高级别是OFF(关闭),什么都不输出。

  • ALL:所有都输出
  • DEBUG:输出DEBUG及后面所有日志
  • INFO:输出INFO及后面所有日志
  • WARN:输出WARN及后面所有日志
  • ERROR:只输出ERROR级别日志

日志分类

  • 项目根日志:全局日志,一个项目只有一个根日志
  • 项目子日志:包级别的日志,一个项目可以有多个子日志。

没有特别指明的地方默认都用的是根日志规则,有子日志的地方用的是子日志的规则

Logback使用

添加依赖

对于一个web应用,只需要添加 spring-boot-starter-web依赖,因为它依赖了logging starter

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

springboot默认集成logback,不用额外引入jar包
logback延用了log4j所有语法和规则,熟悉log4j的话学习logback更加轻松

配置Logback

配置只需要在resources下添加logback-spring.xml配置文件就可以了。内容可以参考以下日志模板:


<configuration debug="false">
    
    <contextName>springboot-logbackcontextName>
    
    <property name="LOG_HOME" value="./logs"/>

    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%npattern>
        encoder>
    appender>

    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <FileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.logFileNamePattern>
            
            <MaxHistory>30MaxHistory>
        rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%npattern>
        encoder>
        
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MBMaxFileSize>
        triggeringPolicy>
    appender>

    
    <appender name="HtmlFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <FileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.htmlFileNamePattern>
            
            <MaxHistory>30MaxHistory>
        rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%p%d%msg%M%F{32}%Lpattern>
            layout>
        encoder>
        
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MBMaxFileSize>
        triggeringPolicy>
    appender>

    
    <appender name="WARNHtmlFile" class="ch.qos.logback.core.FileAppender">
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARNlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>

        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%p%d%msg%M%F{32}%Lpattern>
            layout>
        encoder>
        <file>${LOG_HOME}/WARN-log.htmlfile>
    appender>

    
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="HtmlFile"/>
    root>

    
    <logger name="com.example.logback" level="debug"/>
configuration>

Logback参数解释

1、根节点configuration包含属性

scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

参考配置如下:

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
        
configuration>

2、根节点configuration的子节点

SpringBoot笔记:SpringBoot2.3集成Logback日志组件配置_第1张图片

3、设置上下文名称

3.1、默认方式contextName

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <contextName>springboot-logbackcontextName>  
        
configuration>
3.2、默认方式property

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
例如使用定义上下文名称,然后在设置logger上下文时使用。

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <property name="APP_Name" value="springboot-logback" />   
      <contextName>${APP_Name}</contextName>  
      <!-- 其他配置省略-->  
</configuration>
3.3、获取时间戳字符串:timestamp

两个属性 key:标识此 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
例如将解析配置文件的时间作为上下文名称:

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>   
      <contextName>${bySecond}contextName>  
        
configuration>

4、设置loger、root

  1. 设置loger:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定仅有一个name属性,一个可选的level和一个可选的addtivity属性。
    name:用来指定受此loger约束的某一个包或者具体的某一个类。
    level:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
    addtivity:是否向上级loger传递打印信息。默认是true。
    可以包含零个或多个元素,标识这个appender将会添加到这个loger。

  2. 设置root:也是元素,但是它是根logger。只有一个level属性,应为已经被命名为"root".
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。

可以包含零个或多个元素,标识这个appender将会添加到这个logger。

5、举例说明

TestController.java测试类:

package com.example.logback;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    /**
     * 获取一个日志组件
     */
    Logger logger = LoggerFactory.getLogger(getClass());

    @GetMapping("/helloLogback")
    public String testDemo() {
        logger.trace("hello trace");
        logger.debug("hello debug");
        logger.info("hello info");
        logger.warn("hello warn");
        logger.error("hello error");
        return "Hello Logback!";
    }
}
5.1、只配置root

logback-spring.xml配置内容如下:


<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
        encoder>
    appender>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    root>
configuration>

其中appender的配置表示打印到控制台,将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。

当执行/helloLogback方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;打印测试结果:

08:48:57.007 [http-nio-8080-exec-2] INFO  o.a.c.c.C.[.[.[/logback-demo] - Initializing Spring DispatcherServlet 'dispatcherServlet'
08:48:57.007 [http-nio-8080-exec-2] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
08:48:57.014 [http-nio-8080-exec-2] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 7 ms
08:49:11.080 [http-nio-8080-exec-3] INFO  com.example.logback.TestController - hello info
08:49:11.080 [http-nio-8080-exec-3] WARN  com.example.logback.TestController - hello warn
08:49:11.080 [http-nio-8080-exec-3] ERROR com.example.logback.TestController - hello error
5.2、带有logger的配置,不指定界别,不指定appender

logback-spring.xml配置如下所示:


<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
        encoder>
    appender>
    
    <logger name="com.example.logback"/>
    
    <root level="DEBUGE">
        <appender-ref ref="STDOUT"/>
    root>
configuration>
  1. 其中appender的配置表示打印到控制台;
  2. 将控制com.example.logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“DEBUG”;
  3. 没有设置addtivity,默认为true,将此logger的打印信息向上级传递;
  4. 没有设置appender,此logger本身不打印任何信息。
  5. 将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

当执行/helloLogback方法时,因为其在com.example.logback包中,所以首先执行将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印;
root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;打印结果如下所示:

09:09:10.489 [http-nio-8080-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - GET "/logback-demo/helloLogback", parameters={}
09:09:10.490 [http-nio-8080-exec-3] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to com.example.logback.TestController#testDemo()
09:09:10.490 [http-nio-8080-exec-3] DEBUG com.example.logback.TestController - hello debug
09:09:10.490 [http-nio-8080-exec-3] INFO  com.example.logback.TestController - hello info
09:09:10.490 [http-nio-8080-exec-3] WARN  com.example.logback.TestController - hello warn
09:09:10.490 [http-nio-8080-exec-3] ERROR com.example.logback.TestController - hello error
09:09:10.491 [http-nio-8080-exec-3] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Using 'text/html', given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, */*;q=0.8] and supported [text/plain, */*, text/plain, */*, application/json, application/*+json, application/json, application/*+json]
09:09:10.491 [http-nio-8080-exec-3] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Writing ["Hello Logback!"]
09:09:10.491 [http-nio-8080-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - Completed 200 OK
5.3、带有多个logger的配置,指定级别,指定appender

logback-spring.xml配置如下:


<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
        encoder>
    appender>

    
    <logger name="org.springframework" level="ERROR"/>
    
    <logger name="com.example.logback.TestController" level="WARN" additivity="false">
        <appender-ref ref="STDOUT"/>
    logger>
    
    <logger name="com.example.logback.Test2Controller"/>
    
    <root level="DEBUGE">
        <appender-ref ref="STDOUT"/>
    root>
configuration>

对于 解释:

  1. 控制Test2Controller日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“DEBUG”;
  2. 没有设置addtivity,默认为true,将此logger的打印信息向上级传递;
  3. 没有设置appender,此logger本身不打印任何信息。

对于解释:

  1. 控制TestController类的日志打印,打印级别为“WARN”;
  2. additivity属性为false,表示此loger的打印信息不再向上级传递,
  3. 指定了名字为“STDOUT”的appender。

最后,将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

总结日志打印信息
当执行com.example.logback.TestController里面的方法时,先执行,将级别为“WARN”及大于“WARN”的日志信息交给此logger指定的名为“STDOUT”的appender处理,在控制台中打出日志,不再向次logger的上级 传递打印信息;

访问http://localhost:8080/logback-demo/helloLogback,日志打印结果:

09:38:30.571 [http-nio-8080-exec-1] INFO  o.a.c.c.C.[.[.[/logback-demo] - Initializing Spring DispatcherServlet 'dispatcherServlet'
09:38:30.600 [http-nio-8080-exec-1] WARN  com.example.logback.TestController - hello warn
09:38:30.600 [http-nio-8080-exec-1] ERROR com.example.logback.TestController - hello error

访问http://localhost:8080/logback-demo/helloLogback2,日志打印结果:

09:39:58.732 [http-nio-8080-exec-2] DEBUG com.example.logback.Test2Controller - hello debug
09:39:58.732 [http-nio-8080-exec-2] INFO  com.example.logback.Test2Controller - hello info
09:39:58.732 [http-nio-8080-exec-2] WARN  com.example.logback.Test2Controller - hello warn
09:39:58.732 [http-nio-8080-exec-2] ERROR com.example.logback.Test2Controller - hello error

以上可以看出logback控制日志的粒度是非常细的。

如果将没有设置addtivity值修改为true,会发生什么?这个是控制日志输出的位置的,推测会向自己的logger打印一份,同时向上一级root传递一份,也就是打印两次日志,验证一下:

    
    <logger name="com.example.logback.TestController" level="WARN" additivity="true">
        <appender-ref ref="STDOUT"/>
    logger>

访问http://localhost:8080/logback-demo/helloLogback,日志打印结果:

09:43:38.805 [http-nio-8080-exec-1] INFO  o.a.c.c.C.[.[.[/logback-demo] - Initializing Spring DispatcherServlet 'dispatcherServlet'
09:43:38.836 [http-nio-8080-exec-1] WARN  com.example.logback.TestController - hello warn
09:43:38.836 [http-nio-8080-exec-1] WARN  com.example.logback.TestController - hello warn
09:43:38.836 [http-nio-8080-exec-1] ERROR com.example.logback.TestController - hello error
09:43:38.836 [http-nio-8080-exec-1] ERROR com.example.logback.TestController - hello error

参考其他:
logback 配置详解(二)——appender(https://www.cnblogs.com/cb0327/p/5770794.html)
Springboot集成logback,控制台日志打印两次,并且是不同的线程打印的(http://shangdixinxi.com/detail-1501889.html)

你可能感兴趣的:(SpringBoot)