当我为我的android应用程序编写日志包装器时,我注意到了一个androids 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
虽然我使用详细和调试日志记录生成这些输出,但为什么我会得到详细信息并且调试无效?
答案 0 :(得分:13)
如果您阅读Log.isLoggable()上的信息,您会发现默认日志记录级别为INFO
。任何小于(DEBUG
和VERBOSE
)的内容都会导致此方法返回false
。这就是您的结果输出将这两个显示为false
。
所有Log.*
次调用都会记录到logcat中。调用Log.isLoggable()
只是一种调整日志记录的方法。这不是必需的。通常,您会在实际Log.isLoggable()
来电之前致电Log.*
以确定是否记录。
如果您选择,可以使用prop文件或通过adb调整每TAG
的日志记录。关于这一点的好处是,您可以为应用程序中的每个TAG
动态启用/关闭/关闭日志记录,而无需手动注释日志行或执行您自己的检查。
答案 1 :(得分:6)
无论当前日志级别是什么,所有日志级别都将写入logcat。 isLogabble()
方法可用作应用程序的优化,以防止将不需要的日志语句发送到logcat。您还可以使用adb logcat
命令过滤日志记录级别的子集,即使日志记录设置为详细(请参阅https://developer.android.com/studio/debug/am-logcat.html)。
答案 2 :(得分:2)
你应该使用
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "verbose is active: " + Log.isLoggable(TAG, Log.VERBOSE));
}
答案 3 :(得分:0)
无论Log.isloggable()返回什么,LOG都将始终在logcat中打印。