Android.util.Log中的Bug或特性?- Log.isLoggable(DEBUG) = false但Log.d()未被禁用

5

更新:重构了问题和标题:

我一直认为,可以通过像这样询问日志是否活动来优化昂贵的Android日志记录方法

    import android.util.Log;

    if (Log.isLoggable("MyContext", Log.DEBUG))
    {
        Log.d("MyContext", "my logging: " + callExpensiveCalculation());
    }

然而,当我尝试在Android 2.2模拟器上运行时,我的Log.d()从未被调用。

因此,我尝试了这段代码:

    Log.v(MY_CONTEXT, "VERBOSE logging is active: " + Log.isLoggable(MY_CONTEXT, Log.VERBOSE));
    Log.d(MY_CONTEXT, "DEBUG logging is active: " + Log.isLoggable(MY_CONTEXT, Log.DEBUG));
    Log.i(MY_CONTEXT, "INFO logging is active: " + Log.isLoggable(MY_CONTEXT, Log.INFO));
    Log.w(MY_CONTEXT, "WARN logging is active: " + Log.isLoggable(MY_CONTEXT, Log.WARN));
    Log.e(MY_CONTEXT, "ERROR logging is active: " + Log.isLoggable(MY_CONTEXT, Log.ERROR));

令我惊讶的是,我得到了

02-27 19:05:43.015: V/MyContext(334): VERBOSE logging is active: false
02-27 19:05:43.015: D/MyContext(334): DEBUG logging is active: false
02-27 19:05:43.015: I/MyContext(334): INFO logging is active: true
02-27 19:05:43.015: W/MyContext(334): WARN logging is active: true
02-27 19:05:43.015: E/MyContext(334): ERROR logging is active: true

即使日志记录被禁用,日志记录仍然可以工作。这是 Android 还是我的测试代码中的错误?

是否还有其他方法可以找出调试(或其他日志级别)是否处于活动状态?

我使用 Eclipse logcat 视图,并使用 verbose 日志级别从 Eclipse 启动测试。


这是在简单运行Android应用程序还是调试Android应用程序期间发生的? - John Giotta
"Run As Android Application" 的输出与 "Run As" 是否有区别? - k3b
结果对于“Debug As Android Application”是相同的,“DEBUG logging is active: false”。 - Goo
2
同样的问题在这里。https://dev59.com/sGsz5IYBdhLWcg3wYGgz - Goo
2
只是一点小建议:更加优雅和策略性的方法是在项目发布阶段使用Proguard删除所有日志调用。参考链接 - yorkw
1个回答

3

isLoggable 实际上只是为方便起见为某些标签提供了一个标志。 它实际上不会执行任何操作来禁用日志记录。 您的第一个代码块是正确的:

if (Log.isLoggable("MyContext", Log.DEBUG))
{
    Log.d("MyContext", "my logging: " + callExpensiveCalculation());
}

这个方法将根据isLoggable返回的结果是true还是false来决定是否记录日志。然而,如果您没有检查isLoggable,则会发生以下情况:

Log.d(MY_CONTEXT, "DEBUG logging is active: " + Log.isLoggable(MY_CONTEXT, Log.DEBUG));

无论您是否调用它,它都会记录日志,而不管isLoggable返回什么。简而言之,如果您想基于该标志启用/禁用日志记录,则需要在记录日志的每个位置进行检查。 if语句是让您跳过不必要日志的部分。如果if从句为false,则内部代码永远不会运行。


我仍然不明白这是如何工作的:按照文档中所说,“每个标签的默认级别都设置为INFO。这意味着任何高于或等于INFO的级别将被记录”,Log.isLoggable("MyContext", Log.DEBUG)默认情况下不应该返回false吗?但是它却对我返回了true - sschuberth
这让我感到困惑。为什么Log.d()不在内部检查日志级别?在其他日志框架中,像“if(logLevelEnabled(Loglevel.DEBUG))”这样的东西只有在您不浪费性能创建日志消息时才有用。但是这甚至是Log.isLoggable的一个参数。 - Heinzlmaen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接