log4j:输出文件取决于源调用类

Ant*_*kov 5 java log4j

假设我有一个公共类,其logger由其名称初始化:

public class SomeCalculationLogic {
private static final Log log = LogFactory.getLog(SomeCalculationLogic .class);

public void doCalculation() {
    log.info("doing calculations...");
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类由两个逻辑上不同的流使用 - 比如从类"BackgroundTask"和"UserRequest"调用它.如何使SomeCalculationLogic的记录器的输出重定向到不同的日志文件(如background.log和main.log),具体取决于调用类是什么?

Pét*_*rök 3

我看到三种可能的方法:

  • 如果将所有消息记录到同一个文件中但根据上下文添加不同的前缀就足够了,以便它们变得易于过滤,那么您可以使用嵌套的诊断上下文,如我之前的答案中所述,
  • 如果您绝对需要有单独的日志文件,您可以使用两个不同的记录器和关联的附加程序对您的类进行子类化,正如 Xavier 建议的那样(不幸的是,他的解决方案无法按原样工作),
  • 或者尝试这个替代解决方案

子类化解决方案的有效实现如下所示:

public class SomeCalculationLogic {
  protected abstract Log getLog();

  public void doCalculation() {
    getLog().info("doing calculations...");
    ...
  }
}

public class BackgroundCalculationLogic extends SomeCalculationLogic {
  private static Log log = LogFactory.getLog(BackgroundCalculationLogic.class);

  protected Log getLog() {
    return log;
  }
}

public class UserRequestCalculationLogic extends SomeCalculationLogic {
  private static Log log = LogFactory.getLog(UserRequestCalculationLogic.class);

  protected Log getLog() {
    return log;
  }
}
Run Code Online (Sandbox Code Playgroud)