Spring Boot 整合 Logback 处理项目中的日志

引言

自定义日志配置

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
  • Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
  • Log4j2:log4j2-spring.xml, log4j2.xml
  • JDK (Java Util Logging):logging.properties

日志级别

日志级别从高到低:TRACE < DEBUG < INFO < WARN < ERROR < FATAL

如果设置为 WARN ,则低于 WARN 的信息都不会输出。

这里我们介绍Spring Boot 整合 Logback的方式

Logback是由log4j创始人设计的又一个开源日志组件。

logback是springboot默认的日志组件

一、项目结构

在这里插入图片描述

二、Maven依赖

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

三、TestController

package com.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    
    
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @GetMapping("/test")
    public void test() {
    
    
        for (int i = 0; i < 2000; i++) {
    
    
            log.error("hello");
            log.info("hello");
        }
    }
}

四、Logback配置文件logback-spring.xml

模板如下,更具自己项目情况适当修改

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--日志输出路径-->
    <property name="LOG_HOME" value="/data/logging/logs"/>

    <!--控制台日志输出配置-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!--对输出日志进行格式化-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--此处设置字符集-->
            <charset>UTF-8</charset>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} (%file:%line\) [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>


    <!--日志文件配置info-->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
        所以我们使用下面的策略,可以避免输出 Error 的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤 Error-->
            <level>ERROR</level>
            <!--匹配到就禁止-->
            <onMatch>DENY</onMatch>
            <!--没有匹配到就允许-->
            <onMismatch>ACCEPT</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/system_info.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <MaxHistory>5</MaxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--日志输出编码格式化-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--日志文件配置error-->
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--设置日志级别,过滤掉info日志,只输入error日志-->
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/system_error.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <MaxHistory>1</MaxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--日志输出编码格式化-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
        </encoder>
    </appender>

    <!--指定最基础的日志输出级别-->
    <root level="INFO">
        <appender-ref ref="consoleLog"/>
    </root>
    <!--name 扫描包的位置-->
    <logger name="com.demo" level="INFO">
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </logger>
</configuration>

多环境日志输出

<configuration>
    ...

    <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
    <springProfile name="test,dev">
        <logger name="springboot.log.demo.controller" level="DEBUG" additivity="false">
            <appender-ref ref="consoleLog"/>
        </logger>
    </springProfile>

    <!-- 生产环境. -->
    <springProfile name="prod">
        <logger name="springboot.log.demo.controller" level="INFO" additivity="false">
            <appender-ref ref="consoleLog"/>
        </logger>
    </springProfile>
</configuration>

当application.yml设置环境为test时,激活log为test配置;设置为prod时,激活log配置为prod配置:

spring:
  profiles:
    active: test

<encoder>表示对日志进行编码:

  • %d{HH: mm:ss.SSS}——日志输出时间
  • %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
  • %-5level——日志级别,并且使用5个字符靠左对齐
  • %logger{36}——日志输出者的名字
  • %msg——日志消息
  • %n——平台的换行符
  • ThresholdFilter为系统定义的拦截器,例如:我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中,可以保证文件里只有Error级别日志。

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考:https://www.cnblogs.com/mr-yang-localhost/p/8284317.html

猜你喜欢

转载自blog.csdn.net/y1534414425/article/details/109377148