4

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

所以在我正在研究的系统中,它是一个序列过程(没有并行工作,具有设定的起点和终点)。我想让我的 info() 行缓冲在内存中,如果发生错误,最后将它们刷新,或者如果它成功则不要费心记录它们。

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

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

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

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

谢谢杰夫波特

4

1 回答 1

3

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

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

当记录错误时,我按顺序转储所有消息。

一些评论:

  • 每个级别创建一个缓冲区。这使得在每个级别保留 N 条消息变得非常简单(其中 N 取决于级别;您通常需要比 INFO 消息更多的 DEBUG 消息)。
  • 您将需要一个AtomicIntegerorAtomicLong给每条消息一个唯一的 ID。稍后您将需要将它们从不同的缓冲区中排序。
  • 您将需要使用 DEBUG 阈值运行根记录器,因为任何附加程序都不会看到低于根记录器级别的消息。
  • 您必须在所有其他附加程序中配置一个阈值过滤器。
  • 由于大多数操作都是在内存中进行的(几乎没有日志消息会写入磁盘),这实际上并没有听起来那么糟糕。
  • 这在logback中实现比 log4j 简单得多。
于 2012-11-12T14:55:38.420 回答