Log4j2 GC-Free异步记录器:传递可变对象

时间:2017-12-07 10:05:59

标签: java logging log4j log4j2

我正在使用log4j版本2.10.0

我正在尝试使用混合异步和同步记录器设置无gc日志记录(因此它通过xml配置配置了一些<AsyncLogger>标记)。问题是:如果我将一个可变对象传递给异步记录器怎么办?它会先创建一条消息,然后将其传递给后台,还是只在后台创建它,这意味着它可以记录已经更改过的对象?如果我将所有记录器设置为异步(通过使用AsyncLoggerContextSelector而不是AsyncLogger xml标签的属性),行为是否会有所不同?

对象是可变的,因为我希望将来重用它们,例如,而不是创建新对象。

我看到了这个问题:slf4j-log4j converts objects to string before passing to Asynchronus logger。 但我相信无gc行为可能与异步不同(正如它在该问题的答案中提到的那样)。

1 个答案:

答案 0 :(得分:1)

Log4j2将在从日志记录方法返回之前在应用程序线程中呈现消息,以确保写入日志文件的内容是调用记录器时的值。

这开箱即用,包含所有异步日志记录方法(异步appender以及两种异步记录器)。使用无垃圾日志记录时,其工作方式类似,唯一的区别是Log4j2内部使用的数据结构。在将消息传递给后台线程之前呈现消息的事实是相同的。

有一个系统属性可以在后台线程中呈现消息,但除非您非常确信应用程序不会修改已记录的对象,否则我不会建议这样做。