Spring的日志管理logback
本章节基于
SpringBoot
讲解
🍓logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<!--设置日志上下文名称,可以通过%contextName来打印日志上下文名称-->
<contextName>logback</contextName>
<!--
property:可以用来设置变量,可以通过${name}来访问,有以下的属性name和value和file
file:用于指定配置文件的路径,他的作用在于,如果你有多个配置信息的话,可以直接写在配置文件中,然后通过file引入
resource:作用和file一样,但是,它是可以直接从classpath路径下引入配置文件
-->
<property name="log.path" value="D:\\test\\logback.log" />
<!--
appender格式化日志输出节点,有两个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。
appender有以下子节点:
filter,日志输出拦截器,可以自定义拦截器也可以用系统一些定义好的拦截器
level:过滤哪个级别以下的日志:DEBUG < INFO < WARN < ERROR
encoder和pattern节点组合用于具体输出的日志格式
file节点用来指明日志文件的输出位置,可以是绝对路径也可以是相对路径(控制台输出策略不需要,文件输出策略需要)
rollingPolicy日志回滚策略,在这里我们用了TimeBasedRollingPolicy,基于时间的回滚策略,有以下子节点
fileNamePattern,必要节点,可以用来设置指定时间的日志归档,例如我们上面的例子是每天将日志归档成一个zip包
maxHistory ,可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,,例如设置为30的话,则30天之后,旧的日志就会被删除
totalSizeCap,可选节点,用来指定日志文件的上限大小,例如设置为3GB的话,那么到了这个值,就会删除旧的日志
-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- <filter class="com.example.logback.filter.MyFilter" /> -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36}.%method [%file : %line] - %msg%n
</pattern>
</encoder>
</appender>
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<!--
%date:日志打印时间
%level 日志级别:DEBUG、INFO、WARN和ERROR,定义于ch.qos.logback.classic.Level类
%thread 打印日志所属线程号
%logger{36} 表示logger名字最长36个字符,否则按照句点分割。
可以做以下选择
%logger mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar (完整输出)
%logger{0} mainPackage.sub.sample.Bar Bar (类全写)
%logger{5} mainPackage.sub.sample.Bar m.s.s.Bar (类全写(不占长度),(长度足够包略写的长度)包略写,有多余的长度满足最后一个包的长度,可以依次往前全写)
%logger{10} mainPackage.sub.sample.Bar m.s.s.Bar
%logger{15} mainPackage.sub.sample.Bar m.s.sample.Bar
%logger{16} mainPackage.sub.sample.Bar m.sub.sample.Bar
%logger{26} mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar
%method:所在方法名(注意:比较影响执行效率,建议不用或者提升日志级别再使用)
[%file : %line] 哪个文件,哪一行的日志(注意:line比较影响执行效率,建议不用或者提升日志级别再使用)
%msg%n 其中msg表示打印输出的消息, %n表示换行
-->
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<!--
root节点,必选节点,用来指定最基础的日志输出级别,他有俩个自己点可以用来应用appender,格式化日志输出
-->
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!--
logger节点,可选节点,用来具体指明包的日志输出级别,它将会覆盖root的输出级别,即root是全局设置所有java程序输出的日志级别,而logger是局部设置某个包下面的java程序的输入日志级别
-->
<!--<logger name="com.example.logback" level="warn" />-->
</configuration>
🍓应用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
private final Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping(value = "queryUser")
public String queryUser(){
logger.debug("logger_debug");
logger.info("logger_info");
logger.warn("logger_warn");
logger.error("logger_error");
return "success";
}
}
🍓日志
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.11)
16:11:49.335 logback [main] INFO cn.com.xuhx.App.logStarting [StartupInfoLogger.java : 55] - Starting App using Java 1.8.0_144 on LAPTOP-LD912GOF with PID 7060 (E:\ideaProject\SpringStudy\spring-logback\target\classes started by 15727 in E:\ideaProject\SpringStudy)
16:11:49.337 logback [main] INFO cn.com.xuhx.App.logStartupProfileInfo [SpringApplication.java : 675] - No active profile set, falling back to 1 default profile: "default"
16:11:49.879 logback [main] INFO o.s.b.w.e.tomcat.TomcatWebServer.initialize [TomcatWebServer.java : 108] - Tomcat initialized with port(s): 8080 (http)
16:11:49.884 logback [main] INFO o.a.coyote.http11.Http11NioProtocol.log [DirectJDKLog.java : 173] - Initializing ProtocolHandler ["http-nio-8080"]
16:11:49.885 logback [main] INFO o.a.catalina.core.StandardService.log [DirectJDKLog.java : 173] - Starting service [Tomcat]
16:11:49.885 logback [main] INFO o.a.catalina.core.StandardEngine.log [DirectJDKLog.java : 173] - Starting Servlet engine: [Apache Tomcat/9.0.60]
16:11:49.974 logback [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/].log [DirectJDKLog.java : 173] - Initializing Spring embedded WebApplicationContext
16:11:49.974 logback [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext.prepareWebApplicationContext [ServletWebServerApplicationContext.java : 290] - Root WebApplicationContext: initialization completed in 605 ms
16:11:50.164 logback [main] INFO o.a.coyote.http11.Http11NioProtocol.log [DirectJDKLog.java : 173] - Starting ProtocolHandler ["http-nio-8080"]
16:11:50.176 logback [main] INFO o.s.b.w.e.tomcat.TomcatWebServer.start [TomcatWebServer.java : 220] - Tomcat started on port(s): 8080 (http) with context path ''
16:11:50.193 logback [main] INFO cn.com.xuhx.App.logStarted [StartupInfoLogger.java : 61] - Started App in 1.132 seconds (JVM running for 1.89)
16:12:08.063 logback [http-nio-8080-exec-1] INFO o.a.tomcat.util.http.parser.Cookie.log [DirectJDKLog.java : 173] - A cookie header was received [Hm_lvt_8acef669ea66f479854ecd328d1f348f=1651450539,1651914390] that contained an invalid cookie. That cookie will be ignored.
Note: further occurrences of this error will be logged at DEBUG level.
16:12:08.067 logback [http-nio-8080-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/].log [DirectJDKLog.java : 173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
16:12:08.067 logback [http-nio-8080-exec-1] INFO o.s.web.servlet.DispatcherServlet.initServletBean [FrameworkServlet.java : 525] - Initializing Servlet 'dispatcherServlet'
16:12:08.068 logback [http-nio-8080-exec-1] INFO o.s.web.servlet.DispatcherServlet.initServletBean [FrameworkServlet.java : 547] - Completed initialization in 1 ms
16:12:08.081 logback [http-nio-8080-exec-1] INFO c.c.x.user.controller.UserController.queryUser [UserController.java : 17] - logger_info
16:12:08.081 logback [http-nio-8080-exec-1] WARN c.c.x.user.controller.UserController.queryUser [UserController.java : 18] - logger_warn
16:12:08.081 logback [http-nio-8080-exec-1] ERROR c.c.x.user.controller.UserController.queryUser [UserController.java : 19] - logger_error
🍓SpringBoot文件的加载顺序
logback.xml
➡ application.properties
➡ application.yml
➡ logback-spring.xml
注意: 如果你想在application.properties里面配置logback
日志文件的输出目录,则必须使用logback-spring.xml