android log笔记

一、添加log

1 java

import android.util.Log

//在需要打印Log的地方执行Log.v,Log.d,Log.i,Log.w,Log.e.

private static final String LOG_TAG = "MY_LOG_TAG";

Log.i(LOG_TAG, "This is the log printed by Log.i in android user space.");

Log.e(LOG_TAG, "xxxxxxxxxxx" + mFileName, e);

cc++

#include <cutils/log.h>

在需要调用Log的地方执行:ALOGV,ALOGD,ALOGI,ALOGW,ALOGE

ALOGE("This is the log printed by LOGV in android user space.");//输出到main缓冲区

SLOGE("xxxxxxxxxxxxxxxxxx"); //输出到system缓冲区

还需要修改 Android.mk

LOCAL_SHARED_LIBRARIES := liblog

LOCAL_C_INCLUDES += system/core/include //可不用

3 libcore

System.out.println("##### xxxxxxxxxxxx #######   ");


二 抓log 

logcat本身是android的shell的一个命令,你可以通过“adb shell”进入shell后执行logcat命令,也可以通过"adb logcat"直接运行。
语法:
[adb] logcat [<option>] ... [<filter-spec>] ...
选项
-b  <buffer> 指定要查看的日志缓冲区,可以是 system , events  , radio,main  . 默认值是 system和main  。
-c  清楚屏幕上的日志. 
-d  输出日志到屏幕上. 
-f  <filename> 指定输出日志信息的<filename> ,默认是stdout . 
-g  输出指定的日志缓冲区,输出后退出. 
-n  <count> 设置日志的最大数目<count> .,默认值是4,需要和 -r 选项一起使用。 
-r   <kbytes> 每<kbytes> 时输出日志,默认值为16,需要和-f 选项一起使用. 
-s  设置默认的过滤级别为silent. 
-v   <format> 设置日志输入格式,默认的是brief 格式,要知道更多的支持的格式,参看Controlling Log Output 
参数<filter-spec>
参数<filter-spec>用于对某类的tag的 日志输出进行过滤。每一个输出的Android日志信息都有一个tag和它的优先级.
日志的标签是系统部件原始信息的一个简要的标志。这个tag就是Log.i,Log.d,Log.i,Log.w,Log.e,Log.wtf系列函数中的tag.
对于 System.out.print 系列函数所对于的tag,其实就是"System.out"
<filter-spec>以“tag:priority”的形式来对日志输出进行过滤的
优先级priority有以下几种,按照从低到高顺利排列如下:
— Verbose (lowest priority) 对应于Log.i()系列函数
D  — Debug 对应于Log.d()系列函数
I  — Info 对应于Log.i()系列函数
W  — Warning 对应于Log.w()系列函数
E  — Error 对应于Log.e()系列函数
F  — Fatal 对应于Log.wtf()系列函数
S  — Silent (highest priority, on which nothing s ever printed)
在运行logcat的时候在前两列的信息中你就可以看到 logcat 的标签列表和优先级别,它是这样标出的:<priority>/<tag> .
<filter-spec>中的优先级是指显示 该优先级即其以上优先级得日志 比如对于 robin:D 表示显示tag为 robin 的所有 Debug及其以上优先级 的日志。<filter-spec>只是的针对某类的tag的日志进行过滤,如果有多个针对同一个tag的过滤的话,以最后一个为准。另外对于tag,可以使用通配符。对于在tag中没有使用统配符的<filter-spec>,我称它为显式的日志过滤器;而对于在tag中使用统配符的,我称它它为隐式的日志过滤器。如果这两种过滤器有对着同一个tag的过滤的话,以显示的日志过滤器为准。如果是同一种的话(显式/隐式),以后一个为准。
因为<filter-spec>只是指明了对某一类tag应该进行如何过滤 它没说明的其他tag,将采用系统默认的方式(*:V),即全部输出 。我们可以通过选项" -s "来设置<filter-spec>中没有说明的 tag 来都不输出,相当于" *.S "
实例1
adb logcat -s robin:i
这样将显现tag为robin的Info及以上优先级的所有的日志。该命令等同于 adb logcat robin:i *:S
-b 选项
该选项用于指定要操作的日志缓冲区,可以是 system , events  , radio , main  .它们分别对应Android手机上 /dev/log 文件夹下的 system , events  , radio , main 日志文件 。系统默认的是 system main  。该选项可以出现多次,以指定多个日志缓冲去。
比如:
adb logcat -b system -b main -b events -b radio -s robin:i
日志输出的开头几行说明了你当前查看的哪些日志缓冲区,比如上面的语句的前几行就是:
--------- beginning of /dev/log/radio
--------- beginning of /dev/log/events
--------- beginning of /dev/log/system
--------- beginning of /dev/log/main
其实“ adb logcat -s robin:i ”相当于“ adb logcat -b system -b main -s robin:i ”。
main 缓冲区: 我们的Log.i,Log.d,Log.i,Log.w,Log.e,Log.wtf系列函数及 System.out.print 系列函数以及 System.erro.print 系列都输出到了 main 缓冲区。因此我们一般用默认的就足够了。
events 缓冲区: events 缓冲区对应的日志文件 /system/etc/event-log-tags ,使用android.util.EventLog生成的日志就输出到该缓冲区。
android.database.sqlite.SQLiteDatabase logTimeStat() 函数就是使用 EventLog 来进行日志输出的
system 缓冲区:  通过 system/core/include/cutils/log.h中的 SLOGD() 就是把日志输出到 System 日志缓冲。
关于此的更多内容请阅读《 在Android的c/c++代码中使用LOG
radio 缓冲区:调试ril时候会用到
-c 选项
该选项用于清空你所指定的日志缓冲区。应该就是清除其对应的日志文件
-s 选项
该选项将把 tag 的默认过滤级别设置为 silent ,这样tag默认就不显示。系统把tag的默认过滤级别是设置为Verbose,这样其tag默认就是要显示的。
-f 选项
该选项指定输出日志信息的<filename> ,默认是stdout . 但是这里的文件是指android系统上的文件。如果我们想把日志输出到本地window系统的话,请采用如下形式的命令:
adb logcat -s robin:i>1.log
这样日志就输出了你的window的当前目录的1.log文件中。
-v 选项
日志信息包括了许多元数据域包括标签和优先级。可以通过 -v选项 可以用来指定 日志的输出格式,以显示出特定的元数据域。
brief  —  Display priority/tag and PID of originating process (the default format).显示prority/tag,产生日志的进程的id,和日志消息本身。它是日志默认的输出格式。
process  —  Display PID only.显示priority,产生日志的进程的id,和日志消息本身
tag  —  Display the priority/tag only.显示prority/tag,和消息本身
thread  —  Display process:thread and priority/tag only.显示priority,线程和日志消息本身
raw  —  Display the raw log message, with no other metadata fields.只显示消息本身
time  —  Display the date, invocation time, priority/tag, and PID of the originating process.显示产生日志的时间,prority/tag,产生日志的进程Id,和日志消息本身。
long  —  Display all metadata fields and separate messages with a blank lines.显示产生日志的时间,prority/tag,产生日志的进程Id,和日志消息本身。但是日志消息本身另其一行进行显示。每个日志之间空一行。
当启动了 logcat  ,你可以通过-v 选项来指定输出格式:
[adb] logcat [-v <format>]
实例2:
adb logcat  -v time  -s robin:v
注意是通过 -v 选项 来设置输出格式.

三 log等级以及动态log

1 log等级

Verbose: 开发调试过程中一些详细信息,不应该编译进产品中,只在开发阶段使用。

Debug: 用于调试的信息,编译进产品,但可以在运行时关闭。

Info:例如一些运行时的状态信息,这些状态信息在出现问题的时候能提供帮助。

Warn:警告系统出现了异常,即将出现错误。

Error:系统已经出现了错误。

InfoWarnError这三个等级的Log的警示作用依次提高,需要一直保留。这些信息在系统异常时能提供有价值的分析线索。


2 动态log

2.1 通过版本控制

2.1.1 java 部分

import android.os.Build;

import android.util.Log

final public Boolean isEng =Build.TYPE.equals("eng");

if (isEng)

 Log.v(LOG_TAG,LOG_MESSAGE);

2.1.2 c c++部分

#include<cutils/log.h>

char value[PROPERTY_VALUE_MAX];

int isEng=0;

property_get("ro.build.type",value, "user");

isEng=strcmp(value, "eng");

if (isEng)

 ALOGV();

2.2  默认不开启,通过终端命令开启。

2.2.1 Java部分:

import android.util.Log

final String TAG=”MyActivity”;

final public Boolean LOG_DEBUG = Log.isLoggable(TAG, Log.DEBUG);

if (LOG_DEBUG)

  Log.d(LOG_TAG,LOG_MESSAGE);

运行时开启log: 在终端输入:setprop log.tag.MyActivity DEBUG

运行时关闭log: 在终端输入:setprop log.tag.MyActivity INFO

2.2.2 c、c++部分:

#include<cutils/log.h>

#defineLOG_CTL debug.MyActivity.enablelog

charvalue[PROPERTY_VALUE_MAX];

int isDebug=0;

property_get(LOG_CTL,value, "0");

isDebug=strcmp(value,"1");

if (isDebug)

  ALOGD();

运行时开启log: 在终端输入:setpropdebug.MyActivity.enablelog 1

运行时关闭log: 在终端输入:setpropdebug.MyActivity.enablelog 0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值