slf4j-log4j 在传递给异步记录器之前将对象转换为字符串
slf4j-log4j converts objects to string before passing to Asynchronus logger
我正在寻找记录对 Web 服务的请求和响应。我正在使用带有底层 log4j2 实现的 slf4j。我的记录器语句如下所示。
LOGGER.info("{}",new CustomObject(请求,响应,param1,param2));
我已经在所有必要的对象和 CustomObject class 中实现了 toString 方法来记录该对象的所有属性。
我看到在将日志消息传递给异步记录器之前调用了 CustomObject 的 toString 方法。
是否可以将自定义对象的序列化/toString 方法调用推迟到实际记录发生时?
这是设计使然:如果一个对象被记录,它可能在后台线程记录它之前发生变异,并且您最终会得到一个与您预期不同的日志条目。
在您的示例中,您的应用程序不持有对 CustomObject 的引用,因此它无法更改,但 Log4j2 无法知道这一点,因此它采用了保守的方法。
有一个 system property 可以关闭它,但使用它意味着 所有 记录的对象必须有效地不可变,否则你会发现你的日志在骗你。 ..(我也不是 100% 确定系统 属性 仍然有效,因为 Log4j2 在版本 2.6 中变得无垃圾。)
更新(2017-12-09):系统属性在post2.6版本中仍然有效。 (但我不建议在后台线程中呈现消息,除非您非常确信应用程序不会修改记录的对象。)
我正在寻找记录对 Web 服务的请求和响应。我正在使用带有底层 log4j2 实现的 slf4j。我的记录器语句如下所示。
LOGGER.info("{}",new CustomObject(请求,响应,param1,param2));
我已经在所有必要的对象和 CustomObject class 中实现了 toString 方法来记录该对象的所有属性。
我看到在将日志消息传递给异步记录器之前调用了 CustomObject 的 toString 方法。
是否可以将自定义对象的序列化/toString 方法调用推迟到实际记录发生时?
这是设计使然:如果一个对象被记录,它可能在后台线程记录它之前发生变异,并且您最终会得到一个与您预期不同的日志条目。
在您的示例中,您的应用程序不持有对 CustomObject 的引用,因此它无法更改,但 Log4j2 无法知道这一点,因此它采用了保守的方法。
有一个 system property 可以关闭它,但使用它意味着 所有 记录的对象必须有效地不可变,否则你会发现你的日志在骗你。 ..(我也不是 100% 确定系统 属性 仍然有效,因为 Log4j2 在版本 2.6 中变得无垃圾。)
更新(2017-12-09):系统属性在post2.6版本中仍然有效。 (但我不建议在后台线程中呈现消息,除非您非常确信应用程序不会修改记录的对象。)