Logging 我可以创建一个;“轻”;在我自己的库中是否依赖第三方库(如log4j)?

Logging 我可以创建一个;“轻”;在我自己的库中是否依赖第三方库(如log4j)?,logging,proxy,log4j,dependency-management,Logging,Proxy,Log4j,Dependency Management,我正在维护一个数据库访问库,我想使用log4j进行日志记录。但是日志记录确实是我的库中非常可选的一部分。如果log4j在客户端代码中不可用,那么我就不做日志记录。因此,我创建了一个记录器代理,如下所示: public final class JooqLogger { // Initialise only once private static boolean initialisationError = false; // The log4j Logger reference

我正在维护一个数据库访问库,我想使用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 ...]
}
public final class JooqLogger{
//只初始化一次
私有静态布尔initialisationError=false;
//log4j记录器参考
私人记录器;
//获取类的记录器代理
公共静态JooqLogger getLogger(clazz类){
JooqLogger结果=新的JooqLogger();
试一试{
result.logger=logger.getLogger(clazz);
}
//在类路径上找不到Log4j,因此忽略大部分日志记录
捕获(可丢弃的t){
如果(!initialisationError){
initialisationError=true;
结果.错误(“JooqLogger无法初始化log4j logger…”);
}
}
返回结果;
}
//log4j记录器中的所有方法也可用。
//如果log4j不可用,它们提供重定向并忽略所有调用。
公共布尔值已启用(){
如果(记录器!=null){
返回logger.isTraceEnabled();
}
否则{
返回false;
}
}
公共无效跟踪(对象消息){
如果(记录器!=null){
logger.trace(消息);
}
}
//[……等……]
}
我的问题是:

  • 这是个好主意/好做法吗?还是应该在log4j上创建一个“硬”依赖项
  • 使用上述解决方案,日志记录将不会像我直接调用log4j方法那样精确。例如,日志文件中记录的行号或.java文件始终是JooqLogger的行号或.java文件,而不是调用者的行号或.java文件。有没有办法绕过这个问题

  • 使用空实现创建,然后允许最终开发人员/用户/管理员在其他实现中替换。

    使用空实现创建,然后允许最终开发人员/用户/管理员在其他实现中替换。

    这是一种有趣的方法。你知道有哪个图书馆实施了这种方法吗?我很想看一些例子AXP就是这样做的。您所需要做的就是默认使用null实现。这是一个有趣的方法。你知道有哪个图书馆实施了这种方法吗?我很想看一些例子AXP就是这样做的。您所需要做的就是默认使用null实现。