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(关闭),什么都不输出。
没有特别指明的地方默认都用的是根日志规则
,有子日志的地方用的是子日志的规则
对于一个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更加轻松
配置只需要在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>
scan
:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod
:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug
:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
参考配置如下:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
configuration>
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>springboot-logbackcontextName>
configuration>
用来定义变量值的标签,
例如使用
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_Name" value="springboot-logback" />
<contextName>${APP_Name}</contextName>
<!-- 其他配置省略-->
</configuration>
两个属性 key:标识此
例如将解析配置文件的时间作为上下文名称:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<contextName>${bySecond}contextName>
configuration>
设置loger
:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定
name
:用来指定受此loger约束的某一个包或者具体的某一个类。
level:
用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:
是否向上级loger传递打印信息。默认是true。
可以包含零个或多个元素,标识这个appender将会添加到这个loger。
设置root
:也是它是根logger
。只有一个level属性,应为已经被命名为"root".
level:
用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
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!";
}
}
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的配置表示打印到控制台,
当执行/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
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>
当执行/helloLogback方法时,因为其在com.example.logback包中,所以首先执行
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
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>
对于
对于
最后,
总结日志打印信息:
当执行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)