最近接到一个需求,想把指定的日志信息保存到指定的日志文件里
开发思路,既然是指定的日志,那么对日志信息进行过滤,过滤完写入到指定文件不就好了吗
贴代码
package com.xxx;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class CustomLogFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
// 这里实现你的过滤逻辑
// 例如,只接受包含特定字符串的日志记录
String message = event.getFormattedMessage();
System.out.println(message);
if (message.contains("要过滤的关键词")) {
return FilterReply.ACCEPT;
} else {
return FilterReply.DENY;
}
}
}
符合过滤关键词的放行,否则拒绝
编写日志附件器,这是个spring很好的设计
package com.xxx;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.encoder.Encoder;
import ch.qos.logback.core.rolling.RollingFileAppender;
import java.io.File;
import java.io.IOException;
public class CustomAppender extends RollingFileAppender<ILoggingEvent> {
public Layout layout;
public CustomAppender() {
// 初始化操作,如果需要的话
}
@Override
public void start() {
if (this.encoder == null) {
// 如果没有设置 Encoder,可以设置一个默认的
this.encoder = new PatternLayoutEncoder();
}
if (this.layout == null) {
// 如果没有设置 Layout,可以设置一个默认的
this.layout = new PatternLayout();
}
super.start();
}
@Override
public void stop() {
super.stop();
// 清理工作,如果需要的话
}
@Override
protected void append(ILoggingEvent event) {
if (this.isStarted()) {
// 调用父类的 append 方法来处理日志事件
super.append(event);
}
}
// 可以添加额外的方法来设置文件路径等
}
最后配置logback-spring.xml
<!--日志输出格式-->
<property name="CUSTOM_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} %msg%n"/>
<!--日志输出路径-->
<property name="CUSTOM_FILE_PATH" value="D:/logs/custom/custom-%d{yyyy-MM-dd}.%i.log.gz"/>
<!-- 定义自定义Appender -->
<appender name="CustomAppender" class="com.xxx.CustomAppender">
<file>D:/logs/custom.log</file>
<!-- 设置日志格式 -->
<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动, 即可以根据时间和文件大小进行拆分 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志输出位置 可相对、和绝对路径 -->
<fileNamePattern>
<!-- 下面中的%d表示安装天进行拆分日志文件,%i表示当某一天中日志文件大小超过 MaxFileSize标签规定的大小,i的取值会从1,2,3.....n这样的进行命令差分后的文件-->
${CUSTOM_FILE_PATH}
</fileNamePattern>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且<maxHistory>是30天,
则只保存最近30天的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 -->
<maxHistory>30</maxHistory>
<!--按照文件大小进行拆分-->
<MaxFileSize>10MB</MaxFileSize>
<!-- 超出删除老文件 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- 设置日志输出格式 -->
<pattern>${CUSTOM_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 添加自定义过滤器 -->
<filter class="com.xxxx.CustomLogFilter" />
</appender>
<!-- 日志输出级别 yml配置优先 -->
<root level="INFO">
<appender-ref ref="CustomAppender"/>
</root>
启动项目,需求搞定
效果如下