从0到1学SpringCloud——03 快速集成logback日志

一、前言

本篇主要讲解关于springboot集成logback精简配置。

主要内容分为三部分:

1、log日志文件记录配置

2、根据包路径对log日志进行过滤

3、追踪日志的实现方式

二、指定logback.xml位置

在application.properties中可以指定logback.xml的位置,例如:

server.port=8081
logging.config=classpath:config/logback.xml

三、logback.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!--彩色日志-->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <property name="LOG_PATH" value="logs"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_PATTERN"
              value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %replace(%msg){'^(.{5000}).*$', '$1'}%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- 跟踪日志-->
    <appender name="TRACE" class="com.zhufeng.base.log.api.appender.TraceLogConsoleAppender"/>

    <!-- 控制台日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <immediateFlush>false</immediateFlush>
        </encoder>
    </appender>

    <!-- 业务日志 -->
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <immediateFlush>false</immediateFlush>
        </encoder>
        <file>${LOG_PATH}/zhufeng-biz.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/zhufeng-biz.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!--            <maxFileSize>${LOG_FILE_MAX_SIZE:-500MB}</maxFileSize>-->
<!--            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>-->
            <maxFileSize>30</maxFileSize>
            <maxHistory>50M</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 错误日志 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <immediateFlush>false</immediateFlush>
        </encoder>
        <file>${LOG_PATH}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/err.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!--            <maxFileSize>${LOG_FILE_MAX_SIZE:-500MB}</maxFileSize>-->
<!--            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>-->
            <maxFileSize>30</maxFileSize>
            <maxHistory>50M</maxHistory>
        </rollingPolicy>
        <!-- 过滤出ERROR级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="ASYNC-CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="CONSOLE"/>
        <neverBlock>true</neverBlock>
    </appender>

    <appender name="ASYNC-FILE_ALL" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE_ALL"/>
        <neverBlock>true</neverBlock>
    </appender>

    <appender name="ASYNC-FILE_ERROR" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE_ERROR"/>
        <neverBlock>true</neverBlock>
    </appender>

    <!-- 日志级别 -->
    <root level="INFO">
        <appender-ref ref="ASYNC-CONSOLE"/>
        <appender-ref ref="ASYNC-FILE_ALL"/>
        <appender-ref ref="ASYNC-FILE_ERROR"/>
<!--        <appender-ref ref="TRACE"/>-->
    </root>

    <!-- 日志过滤 -->
    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
    <logger name="org.springframework.boot.web.embedded.tomcat" level="OFF"/>
<!--    <logger name="com.zhufeng.web" level="ERROR"/>-->
</configuration>

日志级别说明:

Log4j一般有八个级别,优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL。
一般只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。

四、测试代码

package com.zhufeng.web.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * @ClassName: UserController
 * @Description UserController演示
 * @author 月夜烛峰
 * @date 2022/7/21 14:01
 */
@Slf4j
@RestController
@RequestMapping("user")
public class UserController {

    @RequestMapping("info")
    public String userInfo(){
        log.info("打印用户inf信息...");
        log.debug("打印debug信息...");
        log.error("打印error信息...");
        return "yueyezhufeng";
    }
}

测试代码中分别打印info日志、debug日志、error日志,启动项目进行测试:

控制台只打印了info日志和error日志,这是因为在logback.xml中日志级别指定为info

<!-- 日志级别 -->
<root level="INFO"> 

运行一段时间,后台会生成对应的日志文件,并且按时间、大小进行分割,并且进行日志压缩。

五、日志内容过滤

把logback.xml最后一行注释放开

 <logger name="com.zhufeng.web" level="ERROR"/>

在包路径com.zhufeng.web下打印的日志信息,低于ERROR级别的都不会打印,如下:

而且在logback的配置中也可以过滤其他中间件或第三方的日志信息,比如注释掉logback.xml中的以下信息:

 <logger name="org.springframework.boot.web.embedded.tomcat" level="OFF"/>

控制台打印信息如下:

六、追踪日志 

在一些分布式系统,为了能够汇总日志信息方便统一查询,会做类似ELK处理。

归根结底就是为了汇总日志信息,这里可以通过trace记录方式来实现。

把logback.xml中的以下部分的注释放开

<!--        <appender-ref ref="TRACE"/>-->

在logback.xml中自定义trace实现类

<!-- trace日志-->
<appender name="TRACE" class="com.zhufeng.base.log.api.appender.TraceLogConsoleAppender"/>

TraceLogConsoleAppender代码:

package com.zhufeng.base.log.api.appender;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

/**
 * @ClassName: TraceLogConsoleAppender
 * @Description 自定义trace日志
 * @author 月夜烛峰
 * @date 2022/8/2 10:17
 */
public class TraceLogConsoleAppender extends AppenderBase<ILoggingEvent> {

    public TraceLogConsoleAppender() {
    }

    @Override
    protected void append(ILoggingEvent event) {
        //获取日志信息,可通过ELK进行日志抽取,也可记录到数据库进行分析等
        //打印信息所在类的完整路径
        String loggerName = event.getLoggerName();
        System.out.println("loggerName:"+loggerName);
        //日志信息
        String message = event.getFormattedMessage();
        System.out.println("message:"+message);
        //日志级别
        String level = event.getLevel().toString();
        System.out.println("level:"+level);
    }
}

为了方便区分log在控制台的打印信息,此处临时用System.out.println代替。生产中此处可以实现MQ接口或者数据库日志入库。

运行效果:

这里把包路径、日志信息、日志级别分别打印了出来,后续可以调用统一接口把日志信息进行汇总,并且不影响原有的日志打印。

此时如果不想在本地环境中存储日志文件,可以把logback.xml中的以下配置放开:

<!--        <maxFileSize>${LOG_FILE_MAX_SIZE:-500MB}</maxFileSize>-->
<!--        <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>-->

把以下内容注释:

<maxFileSize>30</maxFileSize>
<maxHistory>50M</maxHistory>

共有两处,分别注释掉,此时在本地只是生成文件,文件内容为空。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月夜烛峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值