我使用的是 log4j 版本 2.10.0
我正在尝试使用混合异步和同步记录器设置 gc-free 日志记录(因此它是通过带有一些 <AsyncLogger>
标签的 xml 配置进行配置的)。问题是:如果我将可变对象传递给异步记录器会怎样?它会首先创建一条消息,然后将其传递到后台,还是只会在后台创建它,这意味着它可以记录已经更改的对象?如果我使所有记录器异步(通过使用 AsyncLoggerContextSelector
而不是 AsyncLogger
xml 标记的属性),行为会有所不同吗?
这些对象是可变的,因为我想在将来重用它们,而不是创建新的对象。
我看到这个问题:slf4j-log4j converts objects to string before passing to Asynchronus logger 。 但我相信无GC行为可能与异步不同(正如在回答该问题时提到的那样)。
最佳答案
Log4j2 将在从日志记录方法返回之前在应用程序线程中呈现消息,以确保写入日志文件的内容是调用记录器时的值。
这对于所有异步日志记录方法(异步附加程序以及两种类型的异步记录器)都是开箱即用的。对于无垃圾日志记录,其工作原理类似,唯一的区别是 Log4j2 内部使用的数据结构。在将消息传递到后台线程之前渲染消息的事实是相同的。
有一个系统属性可以在后台线程中呈现消息,但我不建议这样做,除非您非常有信心应用程序不会修改已记录的对象。
关于java - Log4j2 无 GC 异步记录器 : passing mutable objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47692459/