好的,似乎至少有一种方法可以解决这个问题:
例如有 LoggingService 和 LoggingController。第一个直接使用 Log4j,第二个只是服务和整个应用程序之间的一个层。
public class LoggingService implements ILoggingService{
//other methods here.
@Override
public void warn(final Object aMessage, final Object aSender, final Throwable aThrowable) {
log(aMessage, aSender, Level.WARN, aThrowable);
}
private void log(final Object aMessage, final Object aSender, final Level aLevel, final Throwable aThrowable) {
final String className = getClassNameBy(aSender);
Logger.getLogger(className).log(className, aLevel, aMessage, aThrowable);
}
}
public class LoggingController implement ILoggingController{
//logging service is injected previously
@Override
public void warn(final Object aMessage, final Throwable aThrowable) {
loggingService.warn(aMessage, this, aThrowable);
}
}
因此,在这种情况下,您允许用户使用以下命令记录某些内容:
loggingController.warn("A warning", null);
使用这种方式:
- 用户对底层的日志功能一无所知
- 如果您不需要它,或者环境不允许,您总是可以提供一个虚拟记录器。
- 日志记录功能在整个应用程序中统一
- 类名和代码行在日志中正确显示。
- 您不能使用 Log4j 最有用的功能之一——按包/类名过滤。