CommonsRequestLoggingFilter 与 logstash StructuredArgument 的使用
CommonsRequestLoggingFilter usage with logstash StructuredArgument
在我的 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 中使用的记录器吗?或者其他想法?
非常感谢
您不能覆盖 CommonsRequestLoggingFilter
中的 logger
,因为它是最终的。
您至少有两个选择。
第一个是创建一个扩展 AbstractRequestLoggingFilter
的新 class 并使用它代替 CommonsRequestLoggingFilter
。在这个新 class 中,您可以随心所欲:
org.slf4j.Logger yourLogger = LoggerFactory.getLogger("MyRequestLoggingFilter");
...
@Override
protected void afterRequest(HttpServletRequest request, String message) {
yourLogger.debug(message, keyValue("foo","bar"));
}
要继续按原样使用所有内容,您可以使用 MDC
,向记录器添加新的 key/values。这不是一回事,但它会记录值。例如,您可以扩展 CommonsRequestLoggingFilter
并将值放入 MDC,或者在每个“上下文”中添加值,以便记录器记录它们。
扩展示例 CommonsRequestLoggingFilter
:
@Override
protected void afterRequest(HttpServletRequest request, String message) {
MDC.put("orderId", "123");
super.afterRequest(request, message);
MDC.remove("orderId");
}
如果使用JSON logger 方面或多或少是这样的:
{
...
"message": "Some message",
...
"orderId": "123"
}
样本取自下一个link,您还可以在其中获取更多详细信息:https://www.innoq.com/en/blog/structured-logging/
在我的 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 中使用的记录器吗?或者其他想法?
非常感谢
您不能覆盖 CommonsRequestLoggingFilter
中的 logger
,因为它是最终的。
您至少有两个选择。
第一个是创建一个扩展 AbstractRequestLoggingFilter
的新 class 并使用它代替 CommonsRequestLoggingFilter
。在这个新 class 中,您可以随心所欲:
org.slf4j.Logger yourLogger = LoggerFactory.getLogger("MyRequestLoggingFilter");
...
@Override
protected void afterRequest(HttpServletRequest request, String message) {
yourLogger.debug(message, keyValue("foo","bar"));
}
要继续按原样使用所有内容,您可以使用 MDC
,向记录器添加新的 key/values。这不是一回事,但它会记录值。例如,您可以扩展 CommonsRequestLoggingFilter
并将值放入 MDC,或者在每个“上下文”中添加值,以便记录器记录它们。
扩展示例 CommonsRequestLoggingFilter
:
@Override
protected void afterRequest(HttpServletRequest request, String message) {
MDC.put("orderId", "123");
super.afterRequest(request, message);
MDC.remove("orderId");
}
如果使用JSON logger 方面或多或少是这样的:
{
...
"message": "Some message",
...
"orderId": "123"
}
样本取自下一个link,您还可以在其中获取更多详细信息:https://www.innoq.com/en/blog/structured-logging/