代码之家  ›  专栏  ›  技术社区  ›  Lukas Eder

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

  •  1
  • Lukas Eder  · 技术社区  · 13 年前

    我正在维护上的数据库访问库 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 回复  |  直到 13 年前
        1
  •  1
  •   Community Egal    7 年前

    创建一个 interface for it 如果实现为空,则允许最终开发人员/用户/管理员在不同的实现中进行替换。