我正在研究创建一个新记录器以在内部保存日志语句直到发生错误的想法。
所以在我正在处理的系统中,它是一个序列过程(没有并行工作,有一个设定的起点和终点)。我希望将我的 info() 行缓冲在内存中,最后如果发生错误,将它们清除,或者如果它成功则不要打扰记录它们。
我不太担心内存使用,它一次只有 15 行(跨多个类)。 但由于它每秒可以处理 100 个项目(每个项目创建 15 行),日志记录可能会因为不需要的数据而变得冗长。
另一个选项是记录到一个主文件,可以被拖尾。 然后如果发生错误,将最后一个缓冲区刷新到 ERROR 日志。
在我创建自己的之前,有没有人知道 SLF4J-LogWriter 或 LOG4J-Appender 已经这样做了?
我可以看到 http://sling.apache.org (org.apache.sling.scripting.core.impl.LogWriter) 已经做了类似的事情,但可能需要我破解代码。
谢谢 杰夫·波特
最佳答案
我对 log4j 和 logback 做了同样的事情; AFAIK,没有现成的解决方案。
为了获得额外的实用性,我的实现缓冲了所有级别的日志消息,您可以配置每个级别保留的消息数。
记录错误时,我会按顺序转储所有消息。
一些评论:
- 每层创建一个缓冲区。这使得在每个级别保留 N 条消息变得非常简单(其中 N 取决于级别;您通常需要比 INFO 消息更多的 DEBUG 消息)。
- 您需要一个
AtomicInteger
或AtomicLong
来为每条消息提供唯一的 ID。稍后您将需要它来将它们从不同的缓冲区中排序。 - 您将需要使用 DEBUG 阈值运行根记录器,因为任何附加程序都不会看到低于根记录器级别的消息。
- 您必须为所有其他附加程序配置一个阈值过滤器。
- 由于大部分操作都在内存中(几乎没有日志消息会写入磁盘),这实际上并不像听起来那么糟糕。
- 这在 logback 中实现起来要简单得多。比 log4j。
关于java - log4j 附加程序 : buffered holder: only write to file on error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13342801/