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

导读:本篇文章讲解 SpringBoot笔记:SpringBoot2.3集成Logback日志组件配置,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

配置Logback

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

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!-- 定义日志组件上下文路径名,用于区分不同应用程序的记录 -->
    <contextName>springboot-logback</contextName>
    <!--定义日志文件的存储地址目录 -->
    <property name="LOG_HOME" value="./logs"/>

    <!-- 控制台输出的配置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 每天生成一个.log日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名,我们使用的是路径${LOG_HOME}+文件名(文件名里面加了日期) -->
            <FileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小,默认是10MB,超过这个就会备份为一个压缩文件 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 每天生成一个html格式的日志 -->
    <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}.html</FileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%p%d%msg%M%F{32}%L</pattern>
            </layout>
        </encoder>
        <!--日志文件最大的大小 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 生成html格式的WARN级别日志 -->
    <appender name="WARNHtmlFile" class="ch.qos.logback.core.FileAppender">
        <!-- 过滤器,只记录WARN级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

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

    <!-- 根日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="HtmlFile"/>
    </root>

    <!--自定义日志级别配置,指定我们项目都是debug级别 -->
    <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的子节点

p1

3、设置上下文名称

3.1、默认方式contextName

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

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <contextName>springboot-logback</contextName>  
      <!-- 其他配置省略-->  
</configuration>

3.2、默认方式property

用来定义变量值的标签,<property> 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
例如使用<property>定义上下文名称,然后在<contentName>设置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:标识此<timestamp> 的名字;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:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
    name:用来指定受此loger约束的某一个包或者具体的某一个类。
    level:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
    addtivity:是否向上级loger传递打印信息。默认是true。
    可以包含零个或多个元素,标识这个appender将会添加到这个loger。

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

<root>可以包含零个或多个<appender-ref>元素,标识这个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配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder 默认配置为PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

其中appender的配置表示打印到控制台,<root level=“INFO”>将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配置如下所示:

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

当执行/helloLogback方法时,因为其在com.example.logback包中,所以首先执行<logger name=“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配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder 默认配置为PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 将spring框架的日志界别调整为ERROR级别,ERROR级别以下的不打印-->
    <logger name="org.springframework" level="ERROR"/>
    <!-- 这个是测试类TestController所在类名,指定WRAN以上级别日志输出,并且不向上传递,以免重复打印 -->
    <logger name="com.example.logback.TestController" level="WARN" additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>
    <!-- 这个是测试类Test2Controller所在类名,内容和TestController一模一样 -->
    <logger name="com.example.logback.Test2Controller"/>
    <!-- 注意这里将级别调整为DEGUGE级别 -->
    <root level="DEBUGE">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

对于 <logger name=“com.example.logback.Test2Controller”/>解释:

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

对于<logger name=“com.example.logback.TestController” level=“WARN” additivity=“false”>解释:

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

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

总结日志打印信息
当执行com.example.logback.TestController里面的方法时,先执行<logger name=“com.example.logback.TestController” level=“WARN” additivity=“false”>,将级别为“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传递一份,也就是打印两次日志,验证一下:

    <!-- 这个是测试类TestController所在类名,指定WRAN以上级别日志输出,并且不向上传递,以免重复打印 -->
    <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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72630.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!