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}c
AccessLogElement
s(其中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);
}
};
}
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. ThisValve
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}c
AccessLogElement
s(其中c
是任意字符,param
是字符串)并且可以是轻松扩展您的目的。例如,您可以添加一个元素 %{key}M
,该元素 returns 与键 key
:
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);
}
};
}