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

k3b*_*k3b 5 debugging logging android

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

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

    import android.util.Log;

    if (Log.isLoggable("MyContext", Log.DEBUG))
    {
        Log.d("MyContext", "my logging: " + callExpensiveCalculation());
    }
Run Code Online (Sandbox Code Playgroud)

但是,当使用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));
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是

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
Run Code Online (Sandbox Code Playgroud)

因此,即使禁用了日志记录功能,日志记录仍然有效。这是Android还是我的测试代码中的错误?

还有另一种方法来找出调试(或其他日志级别之一)是否处于活动状态吗?

我使用eclogse logcat-view进行日志级别的详细操作,并以android-app运行的方式从eclipse开始测试

kab*_*uko 3

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

if (Log.isLoggable("MyContext", Log.DEBUG))
{
    Log.d("MyContext", "my logging: " + callExpensiveCalculation());
}
Run Code Online (Sandbox Code Playgroud)

这将记录或不记录取决于是否isLoggable返回truefalse。但是,当您这样做时(不检查isLoggable):

Log.d(MY_CONTEXT, "DEBUG logging is active: " + Log.isLoggable(MY_CONTEXT, Log.DEBUG));
Run Code Online (Sandbox Code Playgroud)

isLoggable无论您调用它会返回什么,它都会记录。简而言之,如果您想根据该标志启用/禁用日志记录,则需要在记录的所有地方进行检查if语句是让您跳过不必要的日志的部分。如果if子句是false,则内部代码永远不会运行。