有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

编译器构造在编译时禁用Java中的日志记录

我有一些Java代码,为了调试的目的,我想用日志消息插入这些代码。但是,最终(编译的)生产代码不应包含任何日志记录,因为这会降低执行时间。Java中有没有办法在编译时禁用记录器

我不怕在运行时启用/禁用的记录器的log方法中进行检查会增加内存占用

if (logging==enabled) {// do logging}

但我希望避免在生产代码中使用如下参数构造:

Logger.log("undefined state" + state + " @ " + new Date());

我正在使用Sun的Java编译器


共 (6) 个答案

  1. # 1 楼答案

    if(logger.isDebugEnabled()) {
      logger.debug(expression);
    }
    

    我使用的每个日志框架都要求您使用上述模式,以避免对日志表达式进行不必要的计算

  2. # 2 楼答案

    可以使用Proguard对java类文件进行后处理,并使用-assumenosideeffects选项删除日志调用。Android最常用的方法是:

    -assumenosideeffects class android.util.Log {
        public static *** d(...);
        public static *** v(...);
    }
    

    要删除对Log.d(TAG, "message")等的所有调用

  3. # 3 楼答案

    一种方法是在log方法之外进行检查。与您提到的几乎相同的检查,但您自己进行:

    if (LOGGER.isLoggable(Level.DEBUG)) {
        LOGGER.log("undefined state" + state + " @ " + new Date());
    }
    

    此方法可用于任何日志记录级别。有关更多信息,请参见Logger#isLoggable(Level)。 请注意,这是避免对数方法参数构造的推荐方法

  4. # 5 楼答案

    没有一种内在的方式使这成为可能。您可能需要使用Java Preprocessor

  5. # 6 楼答案

    您是否考虑过使用{}占位符的slf4j方法。这允许延迟构建toString(),这意味着日志。调试(…)如果禁用调试日志记录,则成本较低

    log.debug("in loop() - a={}, b={}", a, b);