我可以在我自己的库中创建第三方库(如log4j)的“轻”依赖吗?

时间:2010-11-27 17:26:17

标签: logging proxy log4j dependency-management

我正在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 ...]
}

我的问题是:

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

1 个答案:

答案 0 :(得分:1)

使用Null实现创建interface for it,然后允许最终开发人员/用户/ admin替换其他实现。