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)方法即可。