原创

springboot日志配置

日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节。但是,这丝毫不影响它在任何一个系统中的重要的地位。

日志,通常记录系统执行过程中关键节点的数据,以及错误信息,方便在生产环境快速定位错误。比如我们在系统中要调用另外一个系统的接口,如果我们在日志里记录了调用该接口的入参及返回值,那么当接口调用出错的时候,将会非常方便的定位问题,是参数的问题,还是接口的问题。因此日志记录的越详细,排查问题的难度就越小。

所以日志至关重要,这篇就来介绍下在Spring Boot如何配置日志。

Spring Boot默认日志系统

Spring Boot默认使用LogBack日志系统,正常情况下,要使用LogBack日志,需要引用以下依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-logging -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>

但是因为新建的Spring Boot项目一般都会引用spring-boot-starter或者spring-boot-starter-web,而这两个依赖中都已经包含了对于spring-boot-starter-logging的依赖,所以,无需额外添加依赖

新建springboot项目,在项目启动类里添加如下代码,就可以记录日志

package logger;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
private static final Logger LOG = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
LOG.info("服务启动成功");
}
}

private static final Logger LOG = LoggerFactory.getLogger(Application.class);  表明我们定义了一个LOG变量,用来记录日志, LoggerFactory.getLogger的入参为当前类的class。

Logger  和 LoggerFactory 需要引用包 org.slf4j.*

LOG.info("服务启动成功"); 我们记录一个日志,所有用LOG记录的日志会同步在控制台输出,启动项目即可看到输出的日志


把日志信息存储到文件

打开resource目录下的application.properties添加如下代码即可包日志保存到指定的路径

logging.path=/log/

该配置会在项目运行的磁盘根目录下创建log目录,并把日志文件存储在该目录里,文件名默认为:spring.log。

我们还可以对日志文件及内容做更详细的配置,接下来介绍logback-spring.xml的配置

logback-spring.xml配置  

要想更加定制化地进行日志输出,需要自己写logback.xml配置文件,在resources目录下新建logback-spring.xml文件,spring-boot会自动读取该文件,而弃用默认配置。

  

具体看一个配置,看一下注释,大概能明白是什么配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="5 seconds">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<logger name="org.springframework.web" level="DEBUG"/>

<contextName>mylog</contextName>
<!-- 定义日志路径,错误日志路径 ./表示当前项目目录 -->
<property name="log.path" value="./logs/mylog.log"/>
<property name="log.error.path" value="./logs/mylog.error.log"/>

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36} %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>INFO</level>
</filter>
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 每天一归档 -->
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最多 100MB, 30天的日志周期,最大不能超过20GB -->
<maxFileSize>30MB</maxFileSize>
<maxHistory>90</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<appender name="FILE_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${log.error.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 每天一归档 -->
<fileNamePattern>${log.error.path}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最多 50MB, 60天的日志周期,最大不能超过5GB -->
<maxFileSize>30MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>

<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="FILE_ERROR"/>
</root>
<!-- name值的项目的包路径 ,level说明日志的级别 -->
<logger name="logger" level="INFO"/>
</configuration>

这个xml配置可以直接拿来使用(生产环境级别的使用),只用替换倒数第二行代码中的name属性为具体的项目的包名称,配置文件里配置了日志及错误日志的路径名称,及日志的归档方式,按照天生成日志,且规定了而每一个日志的大小。

源码:链接: https://pan.baidu.com/s/1coF7xTE2KAZ0sCvsT2QpNA 提取码: ajc2 

正文到此结束