利用此线程中生成的日志记录事件

时间:2020-01-06 16:18:35

标签: log4j2

我们都知道日志消息对调试有用。但是有时伐木被埋在成堆的无用的其他信息之下。对于某些繁忙的服务器尤其如此。

我打算为系统维护提供一些REST端点,并希望收集所有日志消息并通过HTTP连接发送回去。 REST响应 IS 收集的日志。所有的日志记录点都已经存在。

我的想法是在REST请求的开头添加自定义Appender,然后再将其删除:

@GET
public void request (@Context HttpServletResponse response) {
    Appender appender = new SpecialThisThreadOnlyAppender(response.getWriter())
    rootLogger.addAppender(appender);
    try {
        request0();
    } finally {
        rootLogger.removeAppender(appender);
    }
}

是否已经有SpecialThisThreadOnlyAppender可以使用(无论使用哪个名称),还是这种情况会导致滥用log4j引擎?

1 个答案:

答案 0 :(得分:2)

这是一个有趣的主意,但我很难确定其用途。您正在创建一个REST请求,该请求返回日志作为其响应。但是在那种情况下,REST请求应该做什么?它不返回应该执行的request0的结果,这对于想要使用此终结点的应用程序有什么用?基本上,它仅在curl或Postman中有用。为了有用,这可能需要将您要调用的服务方法接受为uri中的参数,但是几乎可以肯定,您永远都不想在生产环境中使用这样的终结点。

大多数人通过将相关器添加到日志事件来解决此问题。有关Log4j Audit如何支持它的信息,请参见Log4j Audit Request Context,但您不必使用它来实现它,因为它仅使用Log4j的ThreadContext来捕获相关数据。如果在每个请求中都包含一个唯一的RequestId,并为每个用户都包含一个唯一的SessionId(而不是HTTP会话ID),则可以假设使用诸如ELK之类的日志聚合功能来捕获所有相同的信息。

此外,如果理论上使用相关器,则可以基于相关器之一使用RoutingAppender路由到不同的位置。

以下是使用相关器的其他链接:Fish Tagging LogsLogging Each Action of Every User