SpringBoot框架内部集成了LogBack日志,默认使用LogBack的base.xml配置内容来输出日志到控制台或文件之中。本文主要介绍如何使用Logback进行日志记录。
1、在controller包下新增log相关类,这里引用的日志包是org.slf4j包下的。
LogController 类:
package com.example.demo.controller;
import com.example.demo.helper.LogHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("log")
public class LogController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("writelog")
public Object writeLog()
{
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
new LogHelper().helpMethod();
return "OK";
}
}
LogHelper 类:
package com.example.demo.helper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogHelper {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public void helpMethod(){
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
}
}
这里一定要在pom文件中引入tomcat-embed-jasper相关包,详细请参考:SpringBoot 篇 - 整合jsp
2、在浏览器中输入http://localhost:8080/log/writelog 将会看到以下结果
控制台输出如下:
可以看到来自logback root logger的输出信息。
但是可以注意到debug级别的日志没有记录下来,那是因为Spring Boot为Logback提供了默认的配置文件base.xml,另外Spring Boot 提供了两个输出端的配置文件console-appender.xml和file-appender.xml,base.xml引用了这两个配置文件。
以下是base.xml的内容,可以看到,root logger的日志级别被重写为Info级别,这就是上面例子中debug级别的日志没有打印的原因。
<?xml version="1.0" encoding="UTF-8"?>
<included>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
3、对Logback进行配置
方法一:在application.properties文件中对Logback进行配置
logging.file=log.log
logging.level.com.example.demo.controller = debug
logging.level.com.example.demo.helper = warn
配置记录日志到log.log,com.example.demo.controller日志级别为debug,
com.example.demo.helper中日志级别为warn。看到以下结果,按照配置的日志级别进行记录。
可以看到日志记录到了log.log日志文件中。
方法二:通过额外的文件logback.xml配置Logback
在main/resources下新增 logback.xml文件,在logback.xml配置文件中,添加了控制台输出、文件每天输出、日志文件最大上限、输出的日志都为debug级别,文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 应用名称 -->
<property name="APP_NAME" value="springboot" />
<!--日志文件的保存路径,首先查找系统属性-Dlog.dir,如果存在就使用其;否则,在当前目录下创建名为logs目录做日志存放的目录 -->
<property name="LOG_HOME" value="${log.dir:-logs}/" />
<!-- 日志输出格式 -->
<property name="ENCODER_PATTERN"
value="%d{HH:mm:ss.SSS} %-5level [%15.15thread] %logger{30} - %msg%n" />
<contextName>${APP_NAME}</contextName>
<!-- 控制台日志:输出全部日志到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${ENCODER_PATTERN}</Pattern>
</encoder>
</appender>
<!-- 文件日志:输出全部日志到文件 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<!-- 错误日志:用于将错误日志输出到独立文件 -->
<appender name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
控制台输出结果如下:
因为logback.xml中配置的./logs作为日志的输出根目录,所以LogBack自动在我们的项目根目录下创建名叫做logs的文件夹,并且项目启动时第一次记录日志时会自动创建根据我们的命名方式的文件。
4、屏蔽某个包下的日志输出
项目中需要屏蔽某个或者多个包下不输出日志也不记录日志到文件内,可以修改application.properties文件添加对应配置:
logging.level.com.example.demo.controller = off
重启运行,控制台输出如下,可以看到屏蔽了com.example.demo.controller 包下的日志打印。