Log4j2的RoutingAppender的通配符模式

hve*_*iga 6 java logging log4j log4j2

我试图使用Log4j2的新RoutingAppender基于MDC(Log4j2中的ThreadContext)路由不同的日志.我想做的是以下内容:

  • 如果MDC映射有$ contextId - >追加到$ contextId appender(特定日志)
  • 如果MDC没有$ contextId - >追加到主appender(通用日志)

我想在标记中使用通配符模式实现此目的,然后使用for contextId($ {ctx:contextId})中的key参数进行过滤,并使用默认(不带键参数)作为主appender,但是我没有知道哪个值是那个通配符.

任何帮助表示赞赏,也许我正在走错路.我一直在阅读关于过滤器但似乎没有按我的意愿工作.

谢谢!

hve*_*iga 2

感谢 Remko 的链接,我找到了一个临时解决方案,直到 Log4j2 的人员改进该功能。解决方案是同时使用 RoutingAppender 和 Filters。这就是我的 log4j2 配置的样子(我定义了属性,但我没有在此处显示它们):

<appenders>
    <appender name="applicationAppender" type="RollingFile" fileName="${logFileName}" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
        <layout type="PatternLayout" pattern="${logPattern}" />
        <Policies>
            <TimeBasedTriggeringPolicy />
            <SizeBasedTriggeringPolicy size="${logFileSize}" />
        </Policies>
        <DefaultRolloverStrategy max="${logFileCount}" />
    </appender>

    <Routing name="contextSpecificAppender">
        <Routes pattern="$${ctx:contextId}">
            <Route>
                <appender name="Rolling-${ctx:contextId}" type="RollingFile" fileName="logs/${ctx:contextId}.log" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
                    <layout type="PatternLayout" pattern="${logPattern}" />
                    <Policies>
                        <TimeBasedTriggeringPolicy />
                        <SizeBasedTriggeringPolicy size="${logFileSize}" />
                    </Policies>
                    <DefaultRolloverStrategy max="${logFileCount}" />
                </appender>
            </Route>
        </Routes>
    </Routing>
</appenders>

<loggers>
    <root level="info">
        <appender-ref ref="contextSpecificAppender">
            <ThreadContextMapFilter onMatch="DENY" onMismatch="ACCEPT">
                <KeyValuePair key="contextId" value="" />
            </ThreadContextMapFilter>
        </appender-ref>
        <appender-ref ref="applicationAppender">
            <ThreadContextMapFilter onMatch="ACCEPT" onMismatch="DENY">
                <KeyValuePair key="contextId" value="" />
            </ThreadContextMapFilter>
        </appender-ref>
    </root>
</loggers>
Run Code Online (Sandbox Code Playgroud)

我所做的是根据我想要记录的附加程序调用 ThreadContext.put("contextId", "") 或 ThreadContext.put("contextId", "something") 。我希望狂野的功能能够尽快实现,但与此同时,这个解决方案对我来说已经足够了。

谢谢!