在我的SpringBoot应用程序中,我使用CommonsRequestLoggingFilter记录所有无法执行的请求,它运行得很好:
CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter() {
@Override
protected boolean shouldLog(HttpServletRequest request) {
}
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
this.logger.debug(message);
}
};
但是,为了在Kibana环境下更容易地进行调试,我想在核心日志中添加几个信息。在我的代码中的其他地方,我像这样使用StructuredArguments
,它运行得很好:
this.logger.debug(message, keyValue("foo","bar"));
但是在CommonsRequestLoggingFilter内部,使用的记录器是org.apache.commons.logging.Log,这不允许我向日志添加任何参数。
是否有任何方法覆盖CommonsRequestLoggingFilter中使用的记录器?或者其他的想法?
非常感谢
发布于 2022-02-23 17:05:48
您不能在logger
中覆盖CommonsRequestLoggingFilter
,因为它是最终的。
你至少有两个选择。
第一种方法是创建一个扩展AbstractRequestLoggingFilter
的新类,并使用它而不是CommonsRequestLoggingFilter
。在这个新的班级里,你可以做你想做的事:
org.slf4j.Logger yourLogger = LoggerFactory.getLogger("MyRequestLoggingFilter");
...
@Override
protected void afterRequest(HttpServletRequest request, String message) {
yourLogger.debug(message, keyValue("foo","bar"));
}
要继续按原样使用所有内容,可以使用MDC
,向记录器添加新的键/值。这不是一回事,但它会记录值。例如,您可以扩展CommonsRequestLoggingFilter
并将值放在MDC中,或者在每个“上下文”中添加值,这样记录器就会记录它们。
扩展CommonsRequestLoggingFilter
的示例
@Override
protected void afterRequest(HttpServletRequest request, String message) {
MDC.put("orderId", "123");
super.afterRequest(request, message);
MDC.remove("orderId");
}
如果使用JSON记录器,则这个方面或多或少是这样的:
{
...
"message": "Some message",
...
"orderId": "123"
}
这些示例是从下一个链接中获取的,您还可以在其中获得更多详细信息:https://www.innoq.com/en/blog/structured-logging/
https://stackoverflow.com/questions/71130584
复制相似问题