起因

自己一个玩耍的项目在阿里云的一个低配服务器上的docker中部署着,因为用到了mybatis plus作为ORM,打开了日志中<setting name="logImpl" value="STDOUT_LOGGING" />,结果docker的日志文件几天输出了17G的log文件。

清理mybatis日志的同时准备把java输出的日志也做一次整理,初步期望是把项目包下的日志独立输出到一个单独的文件中,又不打算脱离logback的框架,所以定制了一个logback的Filter规则。

具体规则

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

/**
 * 只输出项目包日志
 *
 * @author: p_x_c
 */
public class PackageAndThresholdFilter extends Filter<ILoggingEvent> {
    Level level;
    String prefix;

    @Override
    public FilterReply decide(ILoggingEvent event) {

        if (event.getLevel().isGreaterOrEqual(level) && StringUtils.isNotBlank(prefix) && event.getLoggerName().startsWith(prefix)) {
            return FilterReply.NEUTRAL;
        }
        return FilterReply.DENY;
    }

    public void setLevel(String level) {
        this.level = Level.toLevel(level);
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }
}

logback.xml中配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!-- 日志输出格式 -->
<property name="LOG_COMMON_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId}] - %msg%n"/>

<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${deploy.logs:-/data}/logs${deploy.log.path:-/}"/>

<!-- 日志文件大小,超过这个大小将被压缩 -->
<property name="LOG_MAX_SIZE" value="100MB"/>
<!-- APP 日志级别 -->
<property name="APP_LEVEL" value="${log.app.level:-INFO}"/>
<!-- APP Package 前缀: com.au92 -->
<property name="APP_PACKAGE" value="${deploy.package:-com.au92}"/>

<appender name="FILE_APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="com.au92.common.log.PackageAndThresholdFilter">
            <level>${APP_LEVEL}</level>
            <prefix>${APP_PACKAGE}</prefix>
        </filter>
        <file>${LOG_HOME}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/app/app-%d{yyyy-MM-dd}-%i.log.zip</fileNamePattern>
            <MaxHistory>600</MaxHistory>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>${LOG_MAX_SIZE}</MaxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_COMMON_PATTERN}</pattern>
        </encoder>
    </appender>

 <logger name="${APP_PACKAGE}" level="${APP_LEVEL}"/>

结果

app.log这个文件中只会输出 com.au92 包下的日志,且日志级别会大于 APP_LEVEL 定义的级别