log4j -adaptive日志级别功能

时间:2011-05-06 13:57:49

标签: logging log4j

不想重新发明轮子,所以我想知道是否有任何记录系统已经支持了我建议做的事情。

背景 我正在开发一个非常大的系统,成千上万的用户可以在任何给定时间访问服务器。 周围有很多基础设施,所以你可以想象通过阅读这样一个生态系统中的日志来调查罕见的错误。

我们的系统使用log4j。

问题的主要根源是,当遇到未知错误时,原始实现者相当“经济”,温和地说。当然,DEBUG级别在大多数情况下都会有所帮助,但当然,生产日志仅设置为ERROR级别:(

现在我正在努力为我们的孩子创造一个更美好的世界,并希望扩展日志记录系统,以便对日志级别更加“宽容”。

我想到的是这样的:
由于周围的DEBUG级别日志(ER之前的N和ERROR日志之后的M)可能包含重要数据,为什么不降低ERROR周围系统的日志级别。

我的想法:

  1. 让我们假设为系统设置了ERROR日志级别
  2. 使用某种大小为X的翻转日志缓冲区。每个日志都会进入并转发到log4j。
  3. 当缓冲区获得ERROR日志时,它还可以输出N个前一个和下一个M下一个日志消息的上下文
    1. 人为地将日志级别提升到ERROR状态(并注意到当然)或
    2. 只需通过注入的ERROR日志记录该上下文
  4. 有一些问题需要解决,但总的来说它可以发挥作用。

    有什么想法吗?

    干杯

1 个答案:

答案 0 :(得分:2)

BufferingForwardingAppender 可能是一个解决方案。与示例关联的文档说明“这意味着只有在记录了WARN级别或更高级别的消息时才会传递事件。任何级别的最多512个(BufferSize)先前的消息也将被传递以提供上下文信息。未发送的邮件将被丢弃。“

请参阅:http://logging.apache.org/log4net/release/config-examples.html#buffering

对于繁忙的Web应用程序,这可能不是最好的方法。在大多数情况下,您对与导致ERROR的特定会话或请求关联的日志消息感兴趣。由于一个请求通常由单个线程处理,因此可以通过为日志消息保留“每线程”缓冲区来实现。通过添加servlet过滤器,每当服务器开始处理来自客户端的新请求时,就可以清除缓冲区。

或者甚至更好的是保持(如果内存使用不是问题)每个HTTPSession的缓冲区。这样,您实际上可以获得调试信息,不仅针对导致问题的请求,还针对之前的请求(以帮助确定用户正在做什么)