Log.isLoggable的使用
Posted 他叫小黑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log.isLoggable的使用相关的知识,希望对你有一定的参考价值。
本文将介绍怎么打印出framework源码中的log。
在android源码中,经常可以看到如下的log代码:
//Audioservice.java
private static final String TAG = "AudioService";
protected static final boolean DEBUG_VOL = Log.isLoggable(TAG + ".VOL", Log.DEBUG);
private void adjustStreamVolume(int streamType, int direction, int flags,
String callingPackage, String caller, int uid)
......
if (DEBUG_VOL) Log.d(TAG, "adjustStreamVolume() stream=" + streamType + ", dir=" + direction
+ ", flags=" + flags + ", caller=" + caller);
......
只有在Log.isLoggable返回值为true的时候,adjustStreamVolume()的log才能正常输出。那怎样才能让isLoggable才会返回true呢?
#定义
isLoggable()在源码中定义如下
/**
* Checks to see whether or not a log for the specified tag is loggable at the specified level.
*
* The default level of any tag is set to INFO. This means that any level above and including
* INFO will be logged. Before you make any calls to a logging method you should check to see
* if your tag should be logged. You can change the default level by setting a system property:
* 'setprop log.tag.<YOUR_LOG_TAG> <LEVEL>'
* Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, or SUPPRESS. SUPPRESS will
* turn off all logging for your tag. You can also create a local.prop file that with the
* following in it:
* 'log.tag.<YOUR_LOG_TAG>=<LEVEL>'
* and place that in /data/local.prop.
*
* @param tag The tag to check.
* @param level The level to check.
* @return Whether or not that this is allowed to be logged.
* @throws IllegalArgumentException is thrown if the tag.length() > 23.
*/
public static native boolean isLoggable(String tag, int level);
从定义可知:
- isLoggable默认level为Log.INFO;
- 只有 level >= INFO才能输出,即level >= INFO时isLoggable返回true,反之则返回false;
- 可以通过setprop log.tag.<YOUR_LOG_TAG> 来改变log的默认level,如adb shell setprop log.tag.AudioService.VOL D。也可以将这些属性按照log.tag.AudioService.VOL = D的形式,写入/data/local.prop中;
- tag的长度如果超过23个字符则会抛出IllegalArgumentException异常;
#使用方法
protected static final boolean DEBUG_VOL = Log.isLoggable(TAG + ".VOL", Log.DEBUG);
因为DEBUG是static的变量,所以当Log类被加载时,其值就已经设置好了。如果要使得isLoggable返回为true,那么setprop需要在Log类被加载前设置好,因此使用setprop之后需要重启对应的进程,framework属于每一个进程,那如何重启framework呢?可以使用:
adb shell stop
adb shell start
所以
方法一(机器重启后失效):
在串口中输入
setprop log.tag.AudioService.VOL D
stop
start
方法二(机器重启仍生效):
将log.tag.AudioService.VOL = D加入到/data/local.prop文件中。
后续发现加个persist关键字,重启也能生效
setprop persist.log.tag.AudioService.VOL D
以上是关于Log.isLoggable的使用的主要内容,如果未能解决你的问题,请参考以下文章
为啥Android TimingLogger 无法打印日志?