更新:重新设置问题和标题:
我一直认为,昂贵的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
因此,即使禁用了日志记录,日志记录也能工作。这是安卓系统中的错误还是我的测试代码中的错误?
是否有其他方法可以确定调试(或其他日志级别之一)是否处于活动状态?
我使用日志级别为verbose的eclipse logcat视图,并从eclipse开始测试,运行为android应用程序
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
,则内部的代码永远不会运行。