我正在维护上的数据库访问库
http://jooq.sourceforge.net
,我想使用log4j进行日志记录。但是日志记录确实是我的库中一个非常可选的部分。如果log4j在客户机代码中不可用,那么我将不进行日志记录。所以我创建了一个这样的日志代理:
public final class JooqLogger {
// Initialise only once
private static boolean initialisationError = false;
// The log4j Logger reference
private Logger logger;
// Get the logger proxy for a class
public static JooqLogger getLogger(Class<?> clazz) {
JooqLogger result = new JooqLogger();
try {
result.logger = Logger.getLogger(clazz);
}
// Log4j is not found on the classpath, so ignore most of logging
catch (Throwable t) {
if (!initialisationError) {
initialisationError = true;
result.error("JooqLogger could not initialise log4j logger...");
}
}
return result;
}
// All methods from log4j Logger are available as well.
// They provide redirection and ignore all calls if log4j is not available.
public boolean isTraceEnabled() {
if (logger != null) {
return logger.isTraceEnabled();
}
else {
return false;
}
}
public void trace(Object message) {
if (logger != null) {
logger.trace(message);
}
}
// [... etc ...]
}
我的问题是:
-
这是个好主意/好做法吗?还是应该创建对log4j的“硬”依赖关系?
-
有了以上的解决方案,日志记录就不会像我直接调用log4j方法那样精确了。例如,日志文件中的日志行号或.java文件将始终是JooqLoggER的,而不是调用方的。有没有办法规避这个问题?