Log4j登录调用类

时间:2015-11-26 09:54:38

标签: java logging log4j

我在一个项目中使用Log4j,根据调用类所在的包将其日志重定向到多个不同的文件。但是,我的项目有一些在整个项目中使用的util类,我希望他们的日志是根据调用类附加到适当的日志。如果出现错误,我可以抛出异常,但如果出现警告,这不是一个好主意。有没有办法根据调用类“重定向”util类的日志?

3 个答案:

答案 0 :(得分:0)

您可以使用堆栈跟踪来获取调用者(请参阅How do I find the caller of a method using stacktrace or reflection?),但这可能会影响应用程序的性能。

另一种选择是使用线程本地存储来设置当前使用的记录器 - 但在我看来,这又有点过分。

我不知道任何"标准"这样做的方式......

答案 1 :(得分:0)

我想建议你几个解决方案:

  1. 首先是将所有消息记录到同一个文件中,但根据上下文对它们加以不同的前缀,以便可以轻松过滤。过滤的一种方法是使用org.apache.log4j.NDC

  2. 其次是尝试类似this的内容。它有一个最简单的解决方案,可以将特定类的输出记录到特定的appender: - )

答案 2 :(得分:0)

如果你的项目不大并且重构不会是一个大问题,我会摆脱静态方法。这样,您可以使用注入将Logger传递给实用程序类,只要您需要它:

public class MyUtils {
  private final Logger logger;

  public MyUtils (Logger logger) {
     this.logger = logger;
  }

  public void doSomething(...) {
     // use the logger
  }
}

然后,您将在最顶层的父类中实例化实用程序类,并在子类中使用相同的实用程序类;

之类的东西
public abstract class BaseClass {

   // You can use log4j to log in different files; 
   // e.g. you would probably want all child classes of BaseClass to use the same log
   private static final Logger LOGGER = Logger.getLogger("some_log");

   // Doesn't have to be static, but one instance would be enough in this case
   private static final MyUtils UTILS = new MyUtils(LOGGER);

}

然后在子类中,您将使用如下的实用程序类:

getUtils().doSomething();