Spring Boot+Log4j2日志过滤:按Marker筛选特定设备日志
解决方案:Spring Boot + Log4j2 实现设备日志按需过滤
核心思路
通过Log4j2的过滤器组合实现两个核心规则:
- 所有不带设备Marker的日志(与设备消息无关的日志)全部记录
- 仅记录携带指定设备Serial Marker的设备消息日志
步骤1:确认代码中Marker使用逻辑
你的现有代码逻辑可行,MarkerFactory.getMarker()是线程安全且会缓存Marker实例的,高并发场景下可以直接使用:
public void someMethod(String serial) { Marker deviceMarker = org.slf4j.MarkerFactory.getMarker(serial); // 普通日志(无Marker,将被全部记录) log.info("A log message I want to find each time"); // 设备相关日志(带Marker,仅指定Serial会被记录) log.debug(deviceMarker, "Device message from serial: {}", serial); }
步骤2:配置Log4j2过滤器(XML示例)
在src/main/resources/log4j2.xml中配置Appender,通过过滤器链实现需求:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Properties> <!-- 配置要监控的设备Serial,支持多个用逗号分隔,如"DEVICE001,DEVICE002" --> <Property name="MONITORED_SERIALS">DEVICE001</Property> </Properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <!-- 过滤器链:先处理无Marker日志,再过滤指定Marker的日志 --> <Filters> <!-- 规则1:无Marker的日志直接通过 --> <MarkerFilter marker="*" onMatch="NEUTRAL" onMismatch="ACCEPT"/> <!-- 规则2:仅允许指定Serial的Marker日志通过 --> <MarkerFilter marker="${MONITORED_SERIALS}" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </Console> <!-- 文件输出Appender同样配置过滤器链 --> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Filters> <MarkerFilter marker="*" onMatch="NEUTRAL" onMismatch="ACCEPT"/> <MarkerFilter marker="${MONITORED_SERIALS}" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <SizeBasedTriggeringPolicy size="10MB"/> </RollingFile> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
过滤器逻辑说明
- 第一个
MarkerFilter:marker="*"匹配所有带Marker的日志,onMatch="NEUTRAL"让这类日志进入下一层过滤;onMismatch="ACCEPT"直接允许无Marker的日志通过,满足“记录所有非设备消息日志”的需求。 - 第二个
MarkerFilter:marker="${MONITORED_SERIALS}"指定要监控的设备Serial,onMatch="ACCEPT"允许匹配的Marker日志输出,onMismatch="DENY"过滤其他设备的Marker日志,实现“仅记录特定设备消息”的要求。
动态调整监控设备
无需重启应用即可修改监控的设备Serial:
- 通过JVM启动参数传递:
java -jar your-app.jar -DMONITORED_SERIALS=DEVICE003,DEVICE004
- 或在
application.properties中配置(需确保Spring Boot与Log4j2集成版本兼容):
logging.log4j2.properties.MONITORED_SERIALS=DEVICE003,DEVICE004
验证方式
启动应用后:
- 所有不带Marker的日志(如
log.info("xxx"))会正常输出 - 只有携带
MONITORED_SERIALS中指定Serial的Marker日志会被记录,其他设备的Marker日志将被过滤
内容的提问来源于stack exchange,提问作者Heiko Kendziorra
相关产品推荐
相关产品推荐

