java - Log4j2 无 GC 异步记录器 : passing mutable objects

标签 java logging log4j log4j2

我使用的是 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/

相关文章:

python - Flask - 如何使用 RotatingFileHandler 将 werkzeug 日志写入日志文件?

java - 如何创建 log4j 包装并获取正确的日志

Java:在 Windows 中增加堆大小不会生效

java - Jqueryui - Datepicker - 日期范围偏移

java - 绘制圆圈内刻的字符串

Java:使用 BufferedWriter 数组(或其他方式?)写入多个文件

Python 记录器未打印出 'extra' 字典信息

hadoop - 用于日志分析的 Amazon MapReduce 最佳实践

java - 如何在log4j中禁用DEBUG?

java - log4j xml配置错误