log4j appender:缓冲的持有者:只在错误时写入文件

时间:2012-11-12 11:21:24

标签: java log4j slf4j

我正在考虑创建一个新的记录器以在内部保存日志语句,直到发生错误。

所以在我正在研究的系统中,它是一个序列过程(没有并行工作,具有设置的起点和终点)。我希望将我的info()行缓冲在内存和放大器中。最后,如果发生错误,将它们清除,或者如果它成功则不要记录它们。

我不太担心内存使用,一次只有15行(跨几个类)。 但由于它可以每秒处理100个项目(每个项目创建15行),因此日志记录可能会变得冗长,而不需要的数据。

另一个选项是它可以记录到一个主文件。 然后,如果发生错误,请将最后一个缓冲区刷新为ERROR日志。

有没有人知道SLF4J-LogWriter或LOG4J-Appender在创建我自己之前已经这样做了?

我可以看到http://sling.apache.org(org.apache.sling.scripting.core.impl.LogWriter)已经做了类似的事情,但可能会要求我破解代码。

由于 杰夫波特

1 个答案:

答案 0 :(得分:2)

我为log4j和logback做了同样的事情; AFAIK,没有现成的解决方案。

为了增加实用性,我的实现缓冲了所有级别的日志消息,您可以配置每个级别保留的消息数。

记录错误时,我会按顺序转储所有邮件。

一些意见:

  • 每个级别创建一个缓冲区。这使得每个级别保留N个消息非常简单(其中N取决于级别;您通常需要比INFO消息更多的DEBUG消息)。
  • 您需要AtomicIntegerAtomicLong为每封邮件提供唯一ID。稍后您将需要将它们分类为来自不同缓冲区的订单。
  • 您需要使用DEBUG阈值运行根记录器,因为没有appender会看到根记录器级别以下的消息。
  • 您必须为所有其他appender配置阈值过滤器。
  • 由于大多数操作都在内存中(几乎没有日志消息会写入磁盘),因此实际上并没有听起来那么糟糕。
  • logback中实现比log4j更简单。