我正在使用log4j版本2.10.0
我正在尝试使用混合异步和同步记录器设置无gc日志记录(因此它通过xml配置配置了一些<AsyncLogger>
标记)。问题是:如果我将一个可变对象传递给异步记录器怎么办?它会先创建一条消息,然后将其传递给后台,还是只在后台创建它,这意味着它可以记录已经更改过的对象?如果我将所有记录器设置为异步(通过使用AsyncLoggerContextSelector
而不是AsyncLogger
xml标签的属性),行为是否会有所不同?
对象是可变的,因为我希望将来重用它们,例如,而不是创建新对象。
我看到了这个问题:slf4j-log4j converts objects to string before passing to Asynchronus logger。 但我相信无gc行为可能与异步不同(正如它在该问题的答案中提到的那样)。
答案 0 :(得分:1)
Log4j2将在从日志记录方法返回之前在应用程序线程中呈现消息,以确保写入日志文件的内容是调用记录器时的值。
这开箱即用,包含所有异步日志记录方法(异步appender以及两种异步记录器)。使用无垃圾日志记录时,其工作方式类似,唯一的区别是Log4j2内部使用的数据结构。在将消息传递给后台线程之前呈现消息的事实是相同的。
有一个系统属性可以在后台线程中呈现消息,但除非您非常确信应用程序不会修改已记录的对象,否则我不会建议这样做。