我正在寻找记录对网络服务的请求和响应。我正在使用带有底层 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/