2011-10-30 42 views
11

当我为Android应用程序编写日志包装器时,我注意到了Android Log.isLoggable方法的奇怪行为。执行下面的代码:Log.isLoggable是否返回错误的值?

final String TAG = "Test"; 
Log.v(TAG, "verbose is active: " + Log.isLoggable(TAG, Log.VERBOSE)); 
Log.d(TAG, "debug is active: " + Log.isLoggable(TAG, Log.DEBUG)); 
Log.i(TAG, "info is active: " + Log.isLoggable(TAG, Log.INFO)); 
Log.w(TAG, "warn is active: " + Log.isLoggable(TAG, Log.WARN)); 
Log.e(TAG, "error is active: " + Log.isLoggable(TAG, Log.ERROR)); 

产生以下的logcat输出:

VERBOSE/Test(598): verbose is active: false 
DEBUG/Test(598): debug is active: false 
INFO/Test(598): info is active: true 
WARN/Test(598): warn is active: true 
ERROR/Test(598): error is active: true 

为什么我得到详细和调试不活跃,虽然我产生使用详细和调试日志记录这些输出?

回答

6

无论当前日志级别是什么,所有日志级别都写入logcat。 isLogabble()方法可用作应用程序的优化,以防止将不需要的日志语句发送到logcat。即使日志记录设置为详细(请参阅https://developer.android.com/studio/debug/am-logcat.html),也可以使用adb logcat命令过滤日志记录级别的子集。

+0

断开的链接,请更新。 –

2

您应该使用

if (Log.isLoggable(TAG, Log.VERBOSE)) { 
    Log.v(TAG, "verbose is active: " + Log.isLoggable(TAG, Log.VERBOSE)); 
} 
12

如果你读Log.isLoggable()的信息,你会发现默认的日志记录级别是INFO。小于此值(DEBUGVERBOSE)将导致此方法返回false。这就是为什么你的结果输出显示这两个为false

所有Log.*调用都记录到logcat。调用Log.isLoggable()只是一种调整日志记录的方法。这不是必需的。通常情况下,您会在实际拨打Log.*之前致电Log.isLoggable()以确定是否记录。

如果您选择使用prop文件或adb,您可以根据TAG调整日志记录。关于这一点的好处是,您可以动态地在您的应用程序中为每个人TAG启用/关闭/关闭日志记录,而无需手动注释日志行或实施自己的检查。

0

无论Log.isloggable()返回什么,LOG都将始终打印在logcat中。