@Slf4j INFO级别打印DEBUG级别日志实现

loback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="FILE_LOG_PATTERN"
              value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %method:%L -%msg%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    
    <property name="DEBUG_FILE_PATH" value="../logs/debug.log"/>

    <!--输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!--输出到文件 -->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/adx-%d{yyyy-MM-dd}.log
            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>2GB</MaxFileSize> </triggeringPolicy> -->
    </appender>
	<!--输出DEBUG到文件 -->
    <appender name="debugAppender" class="com.a.b.c.log.TestRequestRollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${DEBUG_FILE_PATH}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${DEBUG_FILE_PATH}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>20</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>50MB</MaxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <additivityLevel class="ch.qos.logback.classic.Level">DEBUG</additivityLevel>
    </appender>


    <springProfile name="production,vpc,debugvpc,standalone,openapi,huabei">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
        <logger name="com.a.b.d" level="DEBUG" additivity="false">
            <appender-ref ref="debugAppender"/>
        </logger>
    </springProfile>
</configuration>

TestRequestRollingFileAppender

package com.a.b.c.log;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import org.springframework.context.annotation.Configuration;

import java.util.Objects;

/**
 * 继承自 {@link RollingFileAppender},当系统日志输出级别大于或等于 {@link #additivityLevel} 级别时,会将日志发送给父类处理。
 */
@Configuration
public class TestRequestRollingFileAppender<E> extends RollingFileAppender<E> {

    /**
     * 附加日志级别,当日志大于等于这个级别时,会附加到日志文件里。
     * 如果没有设置,那么按照 logger.level 来处理。
     */
    private Level additivityLevel;

    @Override
    protected void subAppend(E event) {
        if (Objects.isNull(additivityLevel) || !(event instanceof ILoggingEvent)) {
            super.subAppend(event);
        } else {
            ILoggingEvent e = (ILoggingEvent) event;
            Level level = e.getLevel();
            //是否是DEBUG日志
            if (level.equals(additivityLevel)) {
            	//如果是,满足条件调用super.subAppend(event)保存日志到文件
                if (ExchangeContext.getPluginLog() || Boolean.TRUE.equals(AdxContextFactory.get().getSspLog())) {
                    super.subAppend(event);
                }
            } 
            //不是DEBUG日志,判断是否是INFO/WARN/ERROR等
            else if (level.isGreaterOrEqual(additivityLevel)) {
                super.subAppend(event);
            }
        }
    }

    public void setAdditivityLevel(Level additivityLevel) {
        this.additivityLevel = additivityLevel;
    }
}

原理分析

以上接口实现与logback配置完毕之后,正常使用log.debug()方法打印的日志就会保存在指定的日志文件中。

正常输出到文件的配置是使用的ch.qos.logback.core.rolling.RollingFileAppender

<!--输出到文件 -->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/adx-%d{yyyy-MM-dd}.log
            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

那么使用debug调试运行代码看一下log.info/debug方法源码运行过程,最终我们知道把日志写入文件的方法是RollingFileAppender类中的subAppend(E event)方法,并且此方法允许被重写,所以我们只需要重写此方法并加上日志级别判断和需要打印debug日志逻辑判断,再调用super.subAppend(E event)方法即可。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现不同类或方法的日志打印到不同的文件中,可以按照以下步骤: 1. 在logback.xml文件中定义多个appender,每个appender代表一个日志文件。 2. 在每个appender中设置不同的文件名和日志级别。 3. 在logger中指定要输出日志的类或方法的名称,以及输出到哪个appender。 具体的配置方式如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 定义输出到控制台的appender --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 定义输出到文件1的appender --> <appender name="FILE1" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/logs/file1-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 定义输出到文件2的appender --> <appender name="FILE2" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/logs/file2-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 定义logger,输出到控制台和文件1 --> <logger name="com.example.package1" level="DEBUG"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE1"/> </logger> <!-- 定义logger,输出到文件2 --> <logger name="com.example.package2" level="INFO"> <appender-ref ref="FILE2"/> </logger> </configuration> ``` 在这个例子中,我们定义了两个appender:CONSOLE和FILE1、FILE2。CONSOLE输出到控制台,FILE1和FILE2分别输出到文件1和文件2。 然后我们分别定义了两个logger,com.example.package1和com.example.package2,分别输出到CONSOLE和FILE1,以及FILE2。 这样,如果我们想要把com.example.package1的日志输出到文件1,com.example.package2的日志输出到文件2,就可以按照以上方式进行配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值