繁体   English   中英

Log4j登录调用类

[英]Log4j log in calling class

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

您可以使用stacktrace来获取调用方(请参阅如何使用stacktrace或反射来找到方法的调用方? ),但这可能会损害应用程序的性能。

另一个选择是使用线程本地存储来设置当前使用的记录器-但我认为这又有些过头了。

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

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

  1. 首先是将所有消息登录到同一文件中,但根据上下文对其前缀不同,这样可以轻松对其进行过滤。一种过滤方法是使用org.apache.log4j.NDC

  2. 二是尝试一些像这样 它是将特定类的输出记录到特定附加程序的最简单解决方案:-)

如果您的项目不大,并且重构不会成为大问题,那么我将摆脱静态方法。 这样,您可以在任何需要的地方使用注入将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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM