Android系统开发中log的使用方法及简单的原理

所属分类: 软件编程 / Android 阅读数: 380
收藏 0 赞 0 分享
在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在Android系统中,提供了简单、便利的LOG机制,开发人员可以方便地使用。在平时开发过程中经常需要与log打交道,所以很有必要了解log的使用方法及简单的原理。

1、linux内核的log输出
在标准的linux内核开发过程中,使用printk,这是一个与printf输出打印齐名的函数,同样提供格式化输出功能,只是其有
打印级别且将信息保存到/proc/kmsg日志中,使用cat命令查看其信息[cat/proc/kmsg]
复制代码 代码如下:

<SPANstyle="COLOR:#003333;FONT-SIZE:14px">#defineKERN_EMERG"<0>"/*systemisunusable*/
#defineKERN_ALERT"<1>"/*actionmustbetakenimmediately*/
#defineKERN_CRIT"<2>"/*criticalconditions*/
#deinfeKERN_ERR"<3>"/*errorconditions*/
#deinfeKERN_WARNING"<4>"/*warningconditions*/
#deinfeKERN_NOTICE"<5>"/*normalbutsignificantcondition*/
#deinfeKERN_INFO"<6>"/*informational*/
#deinfeKERN_DEBUG"<7>"/*debug-levelmessages*/</SPAN>

2、android中log输出
Android系统在用户空间中提供了轻量级的logger日志系统,它是在内核中实现的一种设备驱动,与用户空间的logcat工具配合使用能够方便地跟踪调试程序。
Android系统中的C/C++日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别:
/*
*Androidlogpriorityvalues,inascendingpriorityorder.
*/
typedefenumandroid_LogPriority{
ANDROID_LOG_UNKNOWN=0,
ANDROID_LOG_DEFAULT,/*onlyforSetMinPriority()*/
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT,/*onlyforSetMinPriority();mustbelast*/
}android_LogPriority;

为了使用方便,在system/core/include/cutils/log.h定义了相对应的宏:
#defineLOGV(...)((void)LOG(LOG_VERBOSE,LOG_TAG,__VA_ARGS__))
#defineLOGD(...)((void)LOG(LOG_DEBUG,LOG_TAG,__VA_ARGS__))
#defineLOGI(...)((void)LOG(LOG_INFO,LOG_TAG,__VA_ARGS__))
#defineLOGW(...)((void)LOG(LOG_WARN,LOG_TAG,__VA_ARGS__))
#defineLOGE(...)((void)LOG(LOG_ERROR,LOG_TAG,__VA_ARGS__))
因为如果需要使用log输出,包含其头文件:#include<cutils/log.h>并link其动态库:liblog.so即可
#defineLOG_TAG"XX_LOG_TAG"//这里可以定义其输出的TAG
#include<cutils/log.h>
JAVA层打印:
importandroid.util.Log;
privatestaticfinalStringTAG="XX_LOG_TAG";
Log.e(TAG,"ThisistheerrorlogprintedbyLog.iinandroiduserspace.");

3、盒子上如何获取log
a、进入shell获取log
adbkill-server
adbconnectdest-ip
adbshell【登录shell】
mount-oremount/system/system【改变权限】
logcat>>1.log
命令行输入CTRL+C回到cmd命令行,adbpullpath/1.log
b、直接在cmd命令行获取log
adbconnect连上后;
adbshell
adblogcat>>path/1.log
操作完毕后
命令行输入CTRL+C回到cmd命令行,adbpullpath/1.log
c、在terminal终端直接输出log
回车切到shell
logcat[此时即可看到打印]

4、Eclipse环境下运行(安装了Android插件),那么直接可以在Eclipse就可以查看了
 

5、常用技巧
1、logcat中会打印【输出级别+LOG_TAG名字+进程字+打印的信息】可以充分利用这些信息分析问题
I/SystemServer(939):ActivityManager
I/ActivityManager(939):Memoryclass:96
E/AndroidRuntime(939):ErrorreportingWTF
第一列由Log.i(e/w..决定)或者LOGI/LOGE/LOGW...
第二列由LOG_TAG/TAG(JAVA)中决定,可以对于同一组模块前相同的前缀[xxx]funtion这种命名
第三列是系统进程号getpid()这值,打印线程值pthread_slef()

最后的就是自行增加的打印信息
2、调效效率或者执行时间
1、建议重点的打印增加前缀,方便查找。以[######]
2、直接利用logcat输出时间,调试执行速度,分析效率
logcat-vtime【Displaythedate,invocationtime,priority/tag,andPIDoftheoriginatingprocess.】
更多精彩内容其他人还在看

android byte[] 和short[]转换的方法代码

这篇文章主要介绍了android byte[] 和short[]转换的方法代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android获取应用程序大小的方法

这篇文章主要介绍了Android获取应用程序大小的方法,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android获取其他包的Context实例代码

这篇文章主要介绍了Android获取其他包的Context实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android放大镜的实现代码

这篇文章主要介绍了Android放大镜的实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android 读取Properties配置文件的小例子

这篇文章主要介绍了Android 读取Properties配置文件的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android通讯录开发之删除功能的实现方法

这篇文章主要介绍了Android通讯录开发之删除功能的实现方法,有需要的朋友可以参考一下
收藏 0 赞 0 分享

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享
查看更多