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 并将值放入 M​​DC,或者在每个“上下文”中添加值,以便记录器记录它们。

扩展示例 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/