起因
自己一个玩耍的项目在阿里云的一个低配服务器上的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
定义的级别