文章目录

  • 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.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的子节点

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)

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

  1. SpringBoot项目集成logback日志分等级配置

    背景: 日志的作用: boot项目集成logback: 一.单模块项目配置: 1.添加依赖 2.添加logback-spring.xml配置文件到resources目录下 3.接下来启动一下项目,就可 ...

  2. 基于Spring Boot的Logback日志轮转配置

    在生产环境下,日志是最好的问题调试和跟踪方法,因此日志的地位是十分重要的.我们平时经常使用的log4j,slf4j,logback等等,他们的配置上大同小异.这里就结合Spring Boot配置一下L ...

  3. SpringBoot专栏 | SpringBoot2.x系列教程之花样配置--自定义Banner

    前言 在前面的几个章节中,壹哥 带大家认识了SpringBoot的由来.优缺点,以及在SpringBoot中创建Web项目的3种方式. 既然我们现在已经把SpringBoot项目创建出来了,那么Spr ...

  4. springboot集成logback日志 通用logback.xml模板详解

    先看Spring Boot中依赖的logback,log4j,slf4j相关Jar包 1.最简单的默认打印控制台日志  import org.slf4j.Logger; import org.slf4 ...

  5. 项目logback日志组件更换为log4j2日志组件步骤及注意事项

    1.将项目当前maven中的logback相关依赖exclude掉 <exclusions><exclusion><artifactId>logback-acces ...

  6. SpringBoot中LogBack日志输出配置记录

    <?xml version="1.0" encoding="UTF-8"?><!-- Created by jinKai on 2017/1/ ...

  7. spring中使用logback日志组件替换log4j

    logback比log4j的强大之处,请到logback的主页去看,我就不啰嗦了,你懂.或者不懂,logback就在那里,无比强大,傲视绝伦. 复制log4j-over-slf4j.jar,logba ...

  8. SpringMVC学习(三)——SpringMVC+Slf4j+Log4j+Logback日志集成实战分享

    文章目录 1.概述 1.1 说明 1.2 日志体系 1.2.1 JCL日志面门介绍 1.2.2 Slf4j日志面门介绍 2.几种日志系统介绍: 2.1 Slf4j 2.2 Commons-loggin ...

  9. ASP.NET使用log4Net日志组件教程(按日期与按日志大小切割)

    对于一个大型网站与系统来说,日志是必备的工具,通过日志你可以非常清楚程序的运行情况,及时得到反馈来解决问题,下面介绍ASP.NET版本的log4Net日志组件是个非常强大的工具,最新版本for .ne ...

最新文章

  1. python参数类型限定_python限定方法参数类型、返回值类型、变量类型等|python3教程|python入门|python教程...
  2. python 字符串部分总结
  3. 【译】Spring官方教程:使用STS的入门指南
  4. OpenGL初学时遇到的一些常见的函数之解析
  5. 工具用的好下班走的早
  6. 实用工具篇(三):Free Mybatis plugin
  7. java 取对象的类_Java中通过Class类获取Class对象的方法详解
  8. Python高级编专题 - 类的创建与销毁
  9. IE 8 Beta 2中文版首份试用体验
  10. 豆瓣电影爬虫Ⅱ 豆瓣电影数据的整理
  11. 怪物之心无法触发_《异度之刃2》稀有异刃力男怪物之心支线任务攻略
  12. Oracle 11gR2光钎链路切换crs服务发生crash
  13. python实现文件重命名_python实现文件重命名
  14. Xiaocao's first blog post
  15. 重构:改善既有代码的设计(评注版)
  16. HTML中的长度单位px、em、rem
  17. vue当中的$refs[formName].validate详解
  18. Directx11进阶教程PBR(3)之IBL
  19. mysql 截取第一个字符_MySQL 字符串截取SUBSTRING()函数
  20. A001 - 基础 - 交换机原理简述

热门文章

  1. MB1A MB1B MB1C MB11 MIGO的区别解析
  2. SAP Basis如何显示SAP中所有用户列表
  3. 当ABAP遇到OLE
  4. 上市近一年,良品铺子的“高端化”之路走通了吗?
  5. JAVA关于父亲节的代码_关于父亲节的经典语录
  6. python图像识别步骤_利用百度智能云结合Python体验图像识别(转载来自qylruirui)
  7. oracle 批量修改表结构,关于Oracle批量修改表结构相关内容的整理
  8. python保存创建文件报错 with open(fileName,‘w‘) as fp: IOError: [Errno 22] invalid mode (‘w‘) or filename
  9. 详细讲解python中的析构方法;
  10. Python基础教程:内置类型之生成器