如何在不大量修改代码的情况下给Logback日志添加版本号标记
日志自动添加版本号的解决方案
方案一:修改Logback配置(最省事,不用碰代码)
这是最直接的办法,完全不用改业务代码,直接在日志输出格式里加版本号就行,分两种玩法:
1. 硬编码版本号
直接改你的Pattern,把版本号放在日志最前面,比如:
<appender name="LOGSTASH" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 把你的版本号放在开头,比如v1.2.3 --> <Pattern>v1.2.3 %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%wEx</Pattern> </encoder> </appender>
好处:啥代码都不用改,配置完就生效;坏处:版本更新时得同步改这个配置文件。
2. 动态读取版本号(推荐)
如果用Maven/Gradle构建,可以让版本号自动注入,不用手动改配置:
- Maven:启动项目时加JVM参数
-Dapp.version=${project.version}(pom.xml里的版本号会自动替换) - Gradle:同理,启动命令加
-Dapp.version=${project.version}
然后改Logback配置,读取这个系统属性:
<appender name="LOGSTASH" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 读取app.version,没读到就显示unknown --> <Pattern>${app.version:-unknown} %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%wEx</Pattern> </encoder> </appender>
好处:版本号和构建版本同步,不用手动维护;坏处:需要构建工具配合加启动参数。
方案二:自动加Marker(适合必须用Marker的场景)
如果业务要求必须用Marker实现,不用逐行改代码的话,可以写个TurboFilter自动给日志加Marker:
步骤1:写自定义Filter类
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; import org.slf4j.Marker; import org.slf4j.MarkerFactory; public class VersionMarkerFilter extends TurboFilter { // 这里可以改成从系统属性读版本号,比如System.getProperty("app.version", "unknown") private static final Marker VERSION_MARKER = MarkerFactory.getMarker("v1.2.3"); @Override public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { // 如果日志没带Marker,自动加上我们的版本Marker再输出 if (marker == null) { logger.log(VERSION_MARKER, level, format, params, t); return FilterReply.DENY; // 阻止原日志输出,避免重复打日志 } return FilterReply.NEUTRAL; // 已有Marker的日志正常处理 } }
步骤2:在Logback配置里注册Filter
<configuration> <!-- 注册刚才写的Filter,注意替换成你的包路径 --> <turboFilter class="com.yourcompany.yourproject.VersionMarkerFilter" /> <appender name="LOGSTASH" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 用%marker输出Marker内容 --> <Pattern>%marker %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%wEx</Pattern> </encoder> </appender> <!-- 其他日志配置... --> </configuration>
总结
优先选方案一,零代码改动,简单高效;如果必须用Marker,再考虑方案二。
内容的提问来源于stack exchange,提问作者NastyDiaper
相关产品推荐
相关产品推荐

