【问题标题】:Differentiate logging informations of multiple instances of the same class区分同一类的多个实例的日志信息
【发布时间】:2018-08-16 07:09:30
【问题描述】:

我正在尝试使用 Log4j2 记录 Java 程序的某些类实例的方法调用链。每个实例的行为会根据它们接收的输入而有所不同(显然)。

我面临的问题是区分每个实例的日志消息,以便轻松重建我正在谈论的方法调用链。 除了记录每个方法的进入和离开,这是我使用的默认记录模式,我还尝试过:

  1. 在日志中添加方法调用参数:信息太少,可读性差;
  2. 添加有关方法行为的更多信息:过于冗长且可读性差;
  3. 向所有日志消息添加实例哈希码,这将变成类似LOG.trace("{} - Leaving constructor(index:{})", System.identityHashCode(this), index);:很好的解决方案,但我必须向所有日志方法添加一些样板代码,这会使代码的可读性降低;
  4. 使用每个实例的记录器(所以不是每个类/静态的记录器)并在记录器名称中添加实例哈希码(所以记录器名称将是Classname@hashcode):似乎是干净代码术语中的最佳解决方案,但我没有找到任何方法为多个 loggere 声明记录器设置(如记录阈值),即所有名称以 Classname 开头的记录器。

您认为哪一个是最好的解决方案,或者您有其他建议吗?

【问题讨论】:

  • 如果你把它设为Classname.hashcode 而不是Classname@hashcode,log4j 将采用与package.class 相同的方式,因此你应该能够在Classname 上设置日志记录属性并让实例继承它们。
  • 虽然这是一种解决方法,但它就像一个魅力!谢谢!只是要知道:我正在使用像 ClassName.@hashCode 这样的记录器名称。

标签: java logging log4j2 code-readability


【解决方案1】:

对于这个要求,您可以轻松地使用嵌套线程上下文:查看https://logging.apache.org/log4j/2.x/manual/thread-context.html 中的“Fish Tagging”。

摘录:

ThreadContext.push(UUID.randomUUID().toString()); // Add the fishtag;

logger.debug("Message 1");
.
.
.
logger.debug("Message 2");
.
.
ThreadContext.pop();

【讨论】:

  • 您能更好地解释您的解决方案吗?我不知道此功能,因此我已阅读您提供的链接,但 ThreadContext 信息链接到正在运行的线程而不是单个对象实例。也许我可以在每个方法的日志语句之前添加一个ThreadContext.push 和一个ThreadContext.pop(),但这与问题中解释的第三个解决方案相比没什么大不了的。
  • 通常,您会在处理开始时推送,然后再弹出。您可以在方法入口时推送当前实例的哈希码并在退出时弹出。 ThreadContext 包含所有推送的条目,因为它是一个堆栈。
猜你喜欢
  • 2023-04-09
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2013-05-26
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多