带有logstash结构化参数的CommonsRequestLoggingFilter用法

ulydmbyx  于 2022-12-09  发布在  Logstash
关注(0)|答案(1)|浏览(185)

在我的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中使用的记录器?或者其他想法?
多谢了

fruv7luv

fruv7luv1#

您无法覆写CommonsRequestLoggingFilter中的logger,因为它是最终的。
你至少有两个选择。
第一个方法是创建一个扩展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/

相关问题