SpringBoot 项目中使用日志及线上日志相关配置
在 SpringBoot 项目开发及线上运行中免不了使用日志,日志可以帮忙我们在开发和解决线上BUG时去定位问题,这篇文章主要带大家了解一下 SpringBoot 中日志如何使用及线上日志该怎么配置。
接触过日志的同学比较困扰的是,日志好像很多种,Apache Commons Logging
、Slf4j
、Log4j
、Log4j2
、Logback
等等,完全搞不懂应该用哪个以及怎么用。
其实我们可以把日志分为我们熟悉的接口和实现类。
- 日志接口:
Apache Commons Logging
、Slf4j
主要是定义日志的接口规范,并不提供日志底层的具体实现逻辑,类似于我们定义的service
接口。
- 日志实现:
Log4j
、Log4j2
、Logback
这些则是日志的具体实现,包括实现了日志级别的控制、日志打印格式、日志输出形式(输出到数据库、输出到文件、输出到控制台等),类似于我们的service
实现类。
为什么要把日志定义接口和实现类?
其实是方便我们在相同日志接口下的不同日志框架实现自由切换,不需要改动任何代码。
一、SpringBoot 种日志使用
- 依赖引入
如果已经引入了spring-boot-starter
或spring-boot-starter-web
则不需要再引入,已经包含其中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
SpringBoot
默认使用的日志框架是Logback
,也是目前最常使用的日志框架,如果想使用其他日志框架需要单独引入依赖并写相应的配置,这里我们就直接使用默认的Logback
。
- 打印日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoggerController {
// 1. 得到日志对象
private Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/logger")
public String logger() {
// 2. 日志打印
logger.trace("日志级别: trace");
logger.debug("日志级别: debug");
logger.info("日志级别: info");
logger.warn("日志级别: warn");
logger.error("日志级别: error");
return "logger";
}
}
首先通过slf4j
包提供的日志工厂得到日志的实例,再通过这个实例来打印不同级别的日志。
如果我们项目中有使用lombok
,可以使用它所提供的注解来得到这个日志实例,使用如下:
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j // 1. 通过lombok的`@Slf4j`得到日志实例
public class LoggerController {
@RequestMapping("/logger")
public String logger() {
// 2. 日志打印
log.trace("日志级别: trace");
log.debug("日志级别: debug");
log.info("日志级别: info");
log.warn("日志级别: warn");
log.error("日志级别: error");
return "logger";
}
}
最终打印结果:
二、日志级别了解及配置
可以看到上面明明我们打印了5个级别的日志,但trace
和debug
级别的日志没有打印,这是因为springboot
默认只会打印info
及更高级别的日志。
1. 日志级别:
trace
:级别最低debug
:调试级别日志info
:普通打印信息基本warn
:警告信息error
:错误信息fatal
:灾难级(代码异常退出执行等)
2. 配置SpringBoot
打印日志级别
在application.yml中
通过logging.level
来配置
root
是所有日志级别的打印
sql
、web
是分别设置sql
或web
相关的日志级别
另外还可以分别对不同的包设置不同的日志打印级别
如上所示,分别对我们开发的根包和spring
框架的打印级别进行配置
3. SpringBoot
日志相关配置
上面我们配置了日志打印级别,还可以配置日志的打印目录和文件名,具体如下:
logging:
level:
com.jk: debug
org.springframework: warn
file:
path: ./logs # 配置日志打印目录,默认名称为:spring.log
name: ./logs/SpringLogging.log # 配置日志打印目录和名称,和上面的path选一即可
三、线上日志配置
日志的配置除了在application.yml
里面配置还可以在xml
中单独配置,并且xml
中配置更加灵活,如线上日志我们需要根据日期及日志级别来分成不同的日志文件,也是为了方便我们在线上查日志。
SpringBoot
中加载日志配置顺序:logback.xml
->application.yml
->logback-spring.xml
我们使用logback.xml
来配置,具体配置如下:
logback.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="./logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.jk" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
这个配置线上可以直接使用,其中大家需要关注的就是:
- 日志打印目录修改
<property name="log.path" value="./logs" />
- 日志打印级别配置
<!-- 系统模块日志级别控制 -->
<logger name="com.jk" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
name
配置为自己的开发根包(即启动类所在包),level
配置为自己想要打印的日志级别。
以上就是在
SpringBoot
项目中使用日志即线上日志的相关配置,其实整体非常简单,特别是使用lombok
来自动注入日志实例,我们直接打印即可,线上也就是配置一下打印目录等。
转载自:https://juejin.cn/post/7234718074985005114