logback.xml
Appender: 中添加自定义的filter
<!--MIlESTONE 按照每天生成日志文件 --> <appender name="PROCESS_MILESTONE_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 添加自定义的过滤一些类的logger --> <filter class="com.sea.elsa.subscribe.milestone.filter.FilterSyncLogger" /> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名 每天一归档--> <fileNamePattern>${LOG_HOME}/${LOG_PREFIX}/${LOG_PREFIX}-process-%d{yyyyMMdd}.log.%i </fileNamePattern> <!--日志文件保留天数 --> <maxFileSize>100MB</maxFileSize> <MaxHistory>7</MaxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!-- 设置过滤级别 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!-- Safely log to the same file from multiple JVMs. Degrades performance! --> <prudent>false</prudent> </appender>
// 指定不同包下输入到不同的日志文件中
<logger name="com.sea.elsa.subscribe.milestone.listener.canal" level="info" additivity="false"> <appender-ref ref="SYNC_MILESTONE_LOG" /> </logger> <!-- 日志输出级别 --> <!-- <root level="DEBUG"> --> <root level="info"> <appender-ref ref="STDOUT" /> <appender-ref ref="PROCESS_MILESTONE_LOG" /> </root>
//指定 单个 class 打印到单独文件 ( root 中不用追加,否则会重复打印)
<!-- 日志输出级别 --> <root level="info"> <appender-ref ref="INFO_FILE" /> </root> //指定单个类 <logger name="com.sea.gateway.filter.LogRequestPathRecordFilter"> level="info" additivity="false"> <appender-ref ref="REQUEST_PATH_RECORD" /> </logger>
自定义filter
package com.sea.elsa.subscribe.milestone.filter; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; public class FilterSyncLogger extends Filter<ILoggingEvent> { @Override public FilterReply decide(ILoggingEvent event) { //也可以直接指定类名 event.getLoggerName().equals("com.sea.test") if (getPackName(event.getLoggerName()).equals("com.example.bootstart.log") //指定包名 ||getPackName(event.getLoggerName()).equals("com.example.bootstart.log2")) { return FilterReply.ACCEPT; } else{ return FilterReply.DENY; } } public String getPackName(String className){ String packName = className.substring(0,className.lastIndexOf(".")); return packName; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?