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.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
设置loger
:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name
:用来指定受此loger约束的某一个包或者具体的某一个类。
level:
用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:
是否向上级loger传递打印信息。默认是true。
可以包含零个或多个元素,标识这个appender将会添加到这个loger。设置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>
- 其中appender的配置表示打印到控制台;
- <logger name=“logback” />将控制com.example.logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级<root>的日志级别“DEBUG”;
- 没有设置addtivity,默认为true,将此logger的打印信息向上级传递;
- 没有设置appender,此logger本身不打印任何信息。
- <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”/>解释:
- <logger name=“com.example.logback.Test2Controller”/>控制Test2Controller日志的打印,但是并没用设置打印级别,所以继承他的上级<root>的日志级别“DEBUG”;
- 没有设置addtivity,默认为true,将此logger的打印信息向上级传递;
- 没有设置appender,此logger本身不打印任何信息。
对于<logger name=“com.example.logback.TestController” level=“WARN” additivity=“false”>解释:
- <logger name=“com.example.logback.TestController” level=“WARN” additivity=“false”>控制TestController类的日志打印,打印级别为“WARN”;
- additivity属性为false,表示此loger的打印信息不再向上级传递,
- 指定了名字为“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日志组件配置相关推荐
- SpringBoot项目集成logback日志分等级配置
背景: 日志的作用: boot项目集成logback: 一.单模块项目配置: 1.添加依赖 2.添加logback-spring.xml配置文件到resources目录下 3.接下来启动一下项目,就可 ...
- 基于Spring Boot的Logback日志轮转配置
在生产环境下,日志是最好的问题调试和跟踪方法,因此日志的地位是十分重要的.我们平时经常使用的log4j,slf4j,logback等等,他们的配置上大同小异.这里就结合Spring Boot配置一下L ...
- SpringBoot专栏 | SpringBoot2.x系列教程之花样配置--自定义Banner
前言 在前面的几个章节中,壹哥 带大家认识了SpringBoot的由来.优缺点,以及在SpringBoot中创建Web项目的3种方式. 既然我们现在已经把SpringBoot项目创建出来了,那么Spr ...
- springboot集成logback日志 通用logback.xml模板详解
先看Spring Boot中依赖的logback,log4j,slf4j相关Jar包 1.最简单的默认打印控制台日志 import org.slf4j.Logger; import org.slf4 ...
- 项目logback日志组件更换为log4j2日志组件步骤及注意事项
1.将项目当前maven中的logback相关依赖exclude掉 <exclusions><exclusion><artifactId>logback-acces ...
- SpringBoot中LogBack日志输出配置记录
<?xml version="1.0" encoding="UTF-8"?><!-- Created by jinKai on 2017/1/ ...
- spring中使用logback日志组件替换log4j
logback比log4j的强大之处,请到logback的主页去看,我就不啰嗦了,你懂.或者不懂,logback就在那里,无比强大,傲视绝伦. 复制log4j-over-slf4j.jar,logba ...
- 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 ...
- ASP.NET使用log4Net日志组件教程(按日期与按日志大小切割)
对于一个大型网站与系统来说,日志是必备的工具,通过日志你可以非常清楚程序的运行情况,及时得到反馈来解决问题,下面介绍ASP.NET版本的log4Net日志组件是个非常强大的工具,最新版本for .ne ...
最新文章
- python参数类型限定_python限定方法参数类型、返回值类型、变量类型等|python3教程|python入门|python教程...
- python 字符串部分总结
- 【译】Spring官方教程:使用STS的入门指南
- OpenGL初学时遇到的一些常见的函数之解析
- 工具用的好下班走的早
- 实用工具篇(三):Free Mybatis plugin
- java 取对象的类_Java中通过Class类获取Class对象的方法详解
- Python高级编专题 - 类的创建与销毁
- IE 8 Beta 2中文版首份试用体验
- 豆瓣电影爬虫Ⅱ 豆瓣电影数据的整理
- 怪物之心无法触发_《异度之刃2》稀有异刃力男怪物之心支线任务攻略
- Oracle 11gR2光钎链路切换crs服务发生crash
- python实现文件重命名_python实现文件重命名
- Xiaocao's first blog post
- 重构:改善既有代码的设计(评注版)
- HTML中的长度单位px、em、rem
- vue当中的$refs[formName].validate详解
- Directx11进阶教程PBR(3)之IBL
- mysql 截取第一个字符_MySQL 字符串截取SUBSTRING()函数
- A001 - 基础 - 交换机原理简述
热门文章
- MB1A MB1B MB1C MB11 MIGO的区别解析
- SAP Basis如何显示SAP中所有用户列表
- 当ABAP遇到OLE
- 上市近一年,良品铺子的“高端化”之路走通了吗?
- JAVA关于父亲节的代码_关于父亲节的经典语录
- python图像识别步骤_利用百度智能云结合Python体验图像识别(转载来自qylruirui)
- oracle 批量修改表结构,关于Oracle批量修改表结构相关内容的整理
- python保存创建文件报错 with open(fileName,‘w‘) as fp: IOError: [Errno 22] invalid mode (‘w‘) or filename
- 详细讲解python中的析构方法;
- Python基础教程:内置类型之生成器