如何根据“类别”拆分回滚日志

时间:2013-07-12 15:34:25

标签: logging logback mdc

我有一个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中,我有两个appender。如何根据测试或实时的MDC值告诉记录器选择正确的appender?

1 个答案:

答案 0 :(得分: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=Live的日志事件将通过Live.log appender写入FILE-Live,并且包含MDC值production=Test的日志事件将写入{{ 1}}通过Test.log appender。