java - slf4j-log4j 在传递给异步记录器之前将对象转换为字符串

标签 java logging slf4j log4j2 tostring

我正在寻找记录对网络服务的请求和响应。我正在使用带有底层 log4j2 实现的 slf4j。我的记录器语句如下所示。

LOGGER.info("{}",new CustomObject(request,response,param1,param2));

我已经在所有必要的对象和 CustomObject 类中实现了 toString 方法来记录该对象的所有属性。

我看到在将日志消息传递给异步记录器之前调用了 CustomObject 的 toString 方法。

自定义对象的序列化/toString 方法调用是否可以推迟到实际记录发生时?

最佳答案

这是设计使然:如果一个对象被记录下来,它可能在后台线程记录它之前发生变化,并且您最终会得到一个与您预期不同的日志条目。

在您的示例中,您的应用程序不包含对 CustomObject 的引用,因此它无法更改,但 Log4j2 无法知道这一点,因此它采用了保守的方法。

有一个system property关闭它,但使用它意味着 all 记录的对象必须有效地不可变,否则你会发现你的日志对你说谎......(我也不是 100% 确定系统属性仍然自从 Log4j2 在版本 2.6 中成为无垃圾后就可以工作。)

更新(2017-12-09):系统属性在 2.6 后版本中仍然有效。 (但我不建议在后台线程中呈现消息,除非您非常确信应用程序不会修改记录的对象。)

关于java - slf4j-log4j 在传递给异步记录器之前将对象转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43259076/

相关文章:

java - 在Android中获取颜色常量的十六进制

java - 映射 Java DTO 作为响应

java - 如何在执行时更改log4j2中的日志路径

java - 懒人登录

java - 无法使用吗啡(mongodb)删除实体

java - 如何从输入中仅计算 4 个整数 - JAVA

java - tomcat中的logback配置

java - 在java taillistener中,如何处理更多的日志文件

android - Android 上的详细日志记录

java - 将 JUL 日志记录定向到 SLF4J 不起作用