2

我有一个将请求路由到“实时”或“测试”系统的 servlet。

servlet 根据 URI 路径知道这一点。我想将日志写在两个单独的文件中 1 用于实时测试。

所以我知道我需要使用 mdc

所以...

class MyServlet ... {
    Logger logger = LoggerFactory.getLogger("com.xxx.abc");

    HttpServletRequest(...)
    {
        if(path contains "live")
            MDC.put("production", "Live");
        else
            MDC.put("production", "Test");

        logger.info("Request processed...");
    }
}

在我的 logback.xml 中,我有两个附加程序。如何告诉记录器根据测试或实时的 MDC 值选择正确的附加程序?

4

1 回答 1

0

在这里回答一个老问题,但这看起来是 Logback 的SiftingAppender的完美候选者。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="SIFTER" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>production</key>
            <defaultValue>unknown</defaultValue>
        </discriminator>
        <sift>
            <appender name="FILE-${production}" class="ch.qos.logback.core.FileAppender">
                <file>${production}.log</file>
                <layout class="ch.qos.logback.classic.PatternLayout">
                    <pattern>...</pattern>
                </layout>
            </appender>
        </sift>
    </appender>

    <root level="ALL">
        <appender-ref ref="SIFTER" />
    </root>
</configuration>

的值production将被替换为日志文件名。因此,包含 MDC 值的日志事件production=LiveLive.log通过FILE-Liveappender 写入,包含 MDC 值的日志事件将通过appenderproduction=Test写入。Test.logFILE-Test

于 2017-08-15T08:18:45.033 回答