适配SLF4J wrapper的日志库实现选型及跨依赖日志冲突解决
适配方案及SLF4J实现选择
方案1:保留现有Log4j技术栈,选用slf4j-log4j12作为SLF4J绑定
这是改造成本最低的方案,不需要切换现有应用的日志框架,操作步骤如下:
- 先清理classpath下的冲突依赖:移除之前引入的
logback-classic.jar、log4j-slf4j-impl.jar,同时排除第三方工具xyz中自带的SLF4J绑定实现,保证全局只有一个SLF4J绑定 - 调整Log4j配置实现日志隔离,避免第三方日志进入应用日志文件:
配置核心是为第三方工具的日志单独设置logger,关闭日志向上传递的additivity属性,单独绑定对应输出文件的appender即可,参考配置片段:
# 假设第三方xyz工具的所有日志都在com.xyz包下 log4j.logger.com.xyz=DEBUG, xyzDebugAppender, xyzEngineAppender log4j.additivity.com.xyz=false # Debug日志输出配置 log4j.appender.xyzDebugAppender=org.apache.log4j.RollingFileAppender log4j.appender.xyzDebugAppender.File=./logs/Debug.log log4j.appender.xyzDebugAppender.layout=org.apache.log4j.PatternLayout log4j.appender.xyzDebugAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c - %m%n log4j.appender.xyzDebugAppender.filter.threshold=DEBUG # 引擎日志输出配置 log4j.appender.xyzEngineAppender=org.apache.log4j.RollingFileAppender log4j.appender.xyzEngineAppender.File=./logs/engine.log log4j.appender.xyzEngineAppender.layout=org.apache.log4j.PatternLayout log4j.appender.xyzEngineAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c - %m%n log4j.appender.xyzEngineAppender.filter.threshold=INFO
方案2:切换为logback作为SLF4J绑定
如果想升级日志框架为logback,也可以实现需求,操作步骤如下:
- 清理冲突依赖:排除classpath下所有其他SLF4J绑定(包括
slf4j-log4j12、log4j-slf4j-impl),同时排除第三方工具xyz中自带的log4j依赖 - 引入桥接包和logback绑定:
- 引入
log4j-over-slf4j:将第三方工具调用log4j的日志全部桥接到SLF4J API - 引入
logback-classic作为唯一的SLF4J绑定实现
- 引入
- 调整logback配置,为第三方工具的日志单独配置logger,设置
additivity="false",单独指定对应日志文件的appender即可,实现逻辑和上述Log4j配置一致。
内容的提问来源于stack exchange,提问作者Swapnil Patil
相关产品推荐
相关产品推荐

