tomcat 访问日志中的 MDC 相关内容

MDC related content in tomcat access-logs

spring 引导应用程序的 tomcat 访问日志中是否可以提供 MDC 相关内容。

我浏览了很多博客,但到处都将 MDC 的内容记录到应用程序日志中,而不是访问日志中。

有什么方法可以将它们添加到 tomcat 访问日志模式中。

最终结论是:根据日期,访问日志不支持 MDC。

在 github 上找到它,它提供了为访问日志启用 MDC 的解决方法。

https://github.com/dropwizard/dropwizard/issues/2419

其中有一个 jira link 详细说明了解决方案。

Tomcat's documentation 中所述,AccessLogValve 使用任何传统日志框架:

This Valve uses self-contained logic to write its log files, which can be automatically rolled over at midnight each day. (The essential requirement for access logging is to handle a large continuous stream of data with low overhead. This Valve does not use Apache Commons Logging, thus avoiding additional overhead and potentially complex configuration).

格式逻辑在 AbstractAccessLogValve class, while the logic that writes to the actual log file is in the AccessLogValve.

格式化模式使用简单的%c%{param}cAccessLogElements(其中c是任意字符,param是字符串)并且可以是轻松扩展您的目的。例如,您可以添加一个元素 %{key}M,该元素 returns 与键 key:

关联的 MDC 值
import org.slf4j.MDC;

public class MDCAccessLogValve extends AccessLogValve {

    @Override
    protected AccessLogElement createAccessLogElement(String name, char pattern) {
        if (pattern == 'M') {
            return new AccessLogElement() {

                @Override
                public void addElement(CharArrayWriter buf, Date date, Request request, Response response, long time) {
                    buf.append(MDC.get(name));
                }
            };
        }
        return super.createAccessLogElement(name, pattern);
    }
}

如果你想在 Spring 引导中使用这个阀而不是标准阀,你可以在 WebServerFactoryCustomizer:

中添加阀
    @Bean
    public WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> accessLogCustomizer(Environment env) {
        return new WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory>() {

            @Override
            public void customize(ConfigurableTomcatWebServerFactory factory) {
                final MDCAccessLogValve valve = new MDCAccessLogValve();
                valve.setPattern(env.getProperty("server.tomcat.accesslog.pattern", "common"));
                factory.addEngineValves(valve);
            }
        };
    }