android.util.Log中的错误或功能?-Log.isLoggable(DEBUG)=false,但未禁用Log.d()

android.util.Log中的错误或功能?-Log.isLoggable(DEBUG)=false,但未禁用Log.d(),android,debugging,logging,Android,Debugging,Logging,更新:重新制定问题和标题: 我一直认为昂贵的android日志记录方法可以通过询问日志记录是否像这样处于活动状态来优化 import android.util.Log; if (Log.isLoggable("MyContext", Log.DEBUG)) { Log.d("MyContext", "my logging: " + callExpensiveCalculation()); } 但是,在android 2.2模拟器上尝试此操作时,

更新:重新制定问题和标题:

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

    import android.util.Log;

    if (Log.isLoggable("MyContext", Log.DEBUG))
    {
        Log.d("MyContext", "my logging: " + callExpensiveCalculation());
    }
但是,在android 2.2模拟器上尝试此操作时,从未调用my 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
因此,即使日志记录被禁用,日志记录也可以工作。 这是安卓系统中的bug还是我的测试代码中的bug

是否有其他方法可以确定调试(或其他日志级别之一)是否处于活动状态


我使用日志级别详细的EclipseLogcat视图,并从eclipse开始测试,运行方式为android app

isLoggable
实际上只是一种为某些标记提供标记的机制,以方便您使用。它实际上并没有做任何事情来禁用日志记录。您的第一段代码是正确的:

if (Log.isLoggable("MyContext", Log.DEBUG))
{
    Log.d("MyContext", "my logging: " + callExpensiveCalculation());
}
这将记录或不记录,取决于
isLoggable
是否返回
true
false
。但是,当您执行此操作时(未选中isLoggable):


它将记录日志,而不管如果您调用它,isLoggable将返回什么。简而言之,如果要基于该标志启用/禁用日志记录,则需要在日志记录的任何地方执行该检查。
if
语句是允许您跳过不必要日志的部分。如果
If
子句为
false
,则内部的代码永远不会运行。

这是作为Android应用程序简单运行还是作为Android应用程序调试的过程?输出来自“作为Android应用程序运行”。两者之间有什么区别吗?对于调试和Android应用程序,结果是一样的,“调试日志记录是活动的:错误的”同样的问题,这里只是一个旁注:一个更优雅和策略性的方法是在项目发布阶段。我仍然不清楚这是如何工作的:不应该
Log.isLoggable(“MyContext”,Log.Debug)
return
false
默认情况下,正如文档中所说的“任何标签的默认级别都设置为INFO。这意味着将记录高于或包含INFO的任何级别”?但是它对我来说返回了
true
,这让我很困惑。为什么Log.d()不在内部检查日志级别?在其他日志框架中,像“if(logLevelEnabled(Loglevel.DEBUG))”这样的东西只在创建日志消息时有用,这样就不会浪费性能。但这甚至是Log.isLoggable的参数。
Log.d(MY_CONTEXT, "DEBUG logging is active: " + Log.isLoggable(MY_CONTEXT, Log.DEBUG));