我在一个项目中使用Log4j,根据调用类所在的包将其日志重定向到多个不同的文件。但是,我的项目有一些在整个项目中使用的util类,我希望他们的日志是根据调用类附加到适当的日志。如果出现错误,我可以抛出异常,但如果出现警告,这不是一个好主意。有没有办法根据调用类“重定向”util类的日志?
答案 0 :(得分:0)
您可以使用堆栈跟踪来获取调用者(请参阅How do I find the caller of a method using stacktrace or reflection?),但这可能会影响应用程序的性能。
另一种选择是使用线程本地存储来设置当前使用的记录器 - 但在我看来,这又有点过分。
我不知道任何"标准"这样做的方式......
答案 1 :(得分:0)
我想建议你几个解决方案:
首先是将所有消息记录到同一个文件中,但根据上下文对它们加以不同的前缀,以便可以轻松过滤。过滤的一种方法是使用org.apache.log4j.NDC。
其次是尝试类似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();