You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:35:37