likes
comments
collection
share

SpringBoot 项目中使用日志及线上日志相关配置

作者站长头像
站长
· 阅读数 16

在 SpringBoot 项目开发及线上运行中免不了使用日志,日志可以帮忙我们在开发和解决线上BUG时去定位问题,这篇文章主要带大家了解一下 SpringBoot 中日志如何使用及线上日志该怎么配置。

接触过日志的同学比较困扰的是,日志好像很多种,Apache Commons LoggingSlf4jLog4jLog4j2Logback等等,完全搞不懂应该用哪个以及怎么用。

其实我们可以把日志分为我们熟悉的接口和实现类。

  1. 日志接口: Apache Commons LoggingSlf4j

主要是定义日志的接口规范,并不提供日志底层的具体实现逻辑,类似于我们定义的service接口。

  1. 日志实现: Log4jLog4j2Logback

这些则是日志的具体实现,包括实现了日志级别的控制、日志打印格式、日志输出形式(输出到数据库、输出到文件、输出到控制台等),类似于我们的service实现类。

为什么要把日志定义接口和实现类?

其实是方便我们在相同日志接口下的不同日志框架实现自由切换,不需要改动任何代码。

一、SpringBoot 种日志使用

  1. 依赖引入

如果已经引入了spring-boot-starterspring-boot-starter-web则不需要再引入,已经包含其中。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

SpringBoot默认使用的日志框架是Logback,也是目前最常使用的日志框架,如果想使用其他日志框架需要单独引入依赖并写相应的配置,这里我们就直接使用默认的Logback

  1. 打印日志
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";
    }
}

最终打印结果:

SpringBoot 项目中使用日志及线上日志相关配置

二、日志级别了解及配置

可以看到上面明明我们打印了5个级别的日志,但tracedebug级别的日志没有打印,这是因为springboot默认只会打印info及更高级别的日志。

1. 日志级别:

  1. trace:级别最低
  2. debug:调试级别日志
  3. info:普通打印信息基本
  4. warn:警告信息
  5. error:错误信息
  6. fatal:灾难级(代码异常退出执行等)

2. 配置SpringBoot打印日志级别

application.yml中通过logging.level来配置

SpringBoot 项目中使用日志及线上日志相关配置

root是所有日志级别的打印

sqlweb是分别设置sqlweb相关的日志级别

另外还可以分别对不同的包设置不同的日志打印级别

SpringBoot 项目中使用日志及线上日志相关配置

如上所示,分别对我们开发的根包和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> 

这个配置线上可以直接使用,其中大家需要关注的就是:

  1. 日志打印目录修改
<property name="log.path" value="./logs" />
  1. 日志打印级别配置
<!-- 系统模块日志级别控制  -->
<logger name="com.jk" level="info" />
<!-- Spring日志级别控制  -->
<logger name="org.springframework" level="warn" />

name配置为自己的开发根包(即启动类所在包),level配置为自己想要打印的日志级别。

以上就是在SpringBoot项目中使用日志即线上日志的相关配置,其实整体非常简单,特别是使用lombok来自动注入日志实例,我们直接打印即可,线上也就是配置一下打印目录等。