在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在Android系统中,提供了简单、便利的LOG机制,开发人员可以方便地使用。在这一篇文章中,我们简单介绍在Android内核空间和用户空间中LOG的使用和查看方法。
一. 内核开发时LOG的使用。Android内核是基于Linux Kerne 2.36的,因此,Linux Kernel的LOG机制同样适合于Android内核,它就是有名的printk,与C语言的printf齐名。与printf类似,printk提供格式化输入功能,同时,它也具有所有LOG机制的特点--提供日志级别过虑功能。printk提供了8种日志级别(<linux/kernel.h>):
-
#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*/
printk的使用方法:
printk(KERN_ALERT"This is the log printed by printk in linux kernel space.");
KERN_ALERT表示日志级别,后面紧跟着要格式化字符串。
在Android系统中,printk输出的日志信息保存在/proc/kmsg中,要查看/proc/kmsg的内容,参照在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)一文,在后台中运行模拟器:
USER-NAME@MACHINE-NAME:~/Android$ emulator &
启动adb shell工具:
USER-NAME@MACHINE-NAME:~/Android$ adb shell
查看/proc/kmsg文件:
root@android:/ # cat /proc/kmsg
二. 用户空间程序开发时LOG的使用。Android系统在用户空间中提供了轻量级的logger日志系统,它是在内核中实现的一种设备驱动,与用户空间的logcat工具配合使用能够方便地跟踪调试程序。在Android系统中,分别为C/C++ 和Java语言提供两种不同的logger访问接口。C/C++日志接口一般是在编写硬件抽象层模块或者编写JNI方法时使用,而Java接口一般是在应用层编写APP时使用。
Android系统中的C/C++日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别:
-
-
-
-
typedefenumandroid_LogPriority{
-
ANDROID_LOG_UNKNOWN=0,
-
ANDROID_LOG_DEFAULT,
-
ANDROID_LOG_VERBOSE,
-
ANDROID_LOG_DEBUG,
-
ANDROID_LOG_INFO,
-
ANDROID_LOG_WARN,
-
ANDROID_LOG_ERROR,
-
ANDROID_LOG_FATAL,
-
ANDROID_LOG_SILENT,
-
}android_LogPriority;
在system/core/include/cutils/log.h中,定义了对应的宏,如对应于ANDROID_LOG_VERBOSE的宏LOGV:
-
-
-
-
-
-
#ifndefLOG_TAG
-
#defineLOG_TAGNULL
-
#endif
-
-
-
-
-
#ifndefLOGV
-
#ifLOG_NDEBUG
-
#defineLOGV(...)((void)0)
-
#else
-
#defineLOGV(...)((void)LOG(LOG_VERBOSE,LOG_TAG,__VA_ARGS__))
-
#endif
-
#endif
-
-
-
-
-
-
-
-
-
-
#ifndefLOG
-
#defineLOG(priority,tag,...)\
-
LOG_PRI(ANDROID_##priority,tag,__VA_ARGS__)
-
#endif
-
-
-
-
-
#ifndefLOG_PRI
-
#defineLOG_PRI(priority,tag,...)\
-
android_printLog(priority,tag,__VA_ARGS__)
-
#endif
-
-
-
-
-
-
-
#defineandroid_printLog(prio,tag,fmt...)\
-
__android_log_print(prio,tag,fmt)
因此,如果要使用C/C++日志接口,只要定义自己的LOG_TAG宏和包含头文件system/core/include/cutils/log.h就可以了:
#define LOG_TAG "MY LOG TAG"
#include <cutils/log.h>
就可以了,例如使用LOGV:
LOGV("This is the log printed by LOGV in android user space.");
再来看Android系统中的Java日志接口。Android系统在Frameworks层中定义了Log接口(frameworks/base/core/java/android/util/Log.java):
-
................................................
-
-
publicfinalclassLog{
-
-
................................................
-
-
-
-
-
publicstaticfinalintVERBOSE=2;
-
-
-
-
-
publicstaticfinalintDEBUG=3;
-
-
-
-
-
publicstaticfinalintINFO=4;
-
-
-
-
-
publicstaticfinalintWARN=5;
-
-
-
-
-
publicstaticfinalintERROR=6;
-
-
-
-
-
publicstaticfinalintASSERT=7;
-
-
.....................................................
-
-
publicstaticintv(Stringtag,Stringmsg){
-
returnprintln_native(LOG_ID_MAIN,VERBOSE,tag,msg);
-
}
-
-
publicstaticintv(Stringtag,Stringmsg,Throwabletr){
-
returnprintln_native(LOG_ID_MAIN,VERBOSE,tag,msg+'\n'+getStackTraceString(tr));
-
}
-
-
publicstaticintd(Stringtag,Stringmsg){
-
returnprintln_native(LOG_ID_MAIN,DEBUG,tag,msg);
-
}
-
-
publicstaticintd(Stringtag,Stringmsg,Throwabletr){
-
returnprintln_native(LOG_ID_MAIN,DEBUG,tag,msg+'\n'+getStackTraceString(tr));
-
}
-
-
publicstaticinti(Stringtag,Stringmsg){
-
returnprintln_native(LOG_ID_MAIN,INFO,tag,msg);
-
}
-
-
publicstaticinti(Stringtag,Stringmsg,Throwabletr){
-
returnprintln_native(LOG_ID_MAIN,INFO,tag,msg+'\n'+getStackTraceString(tr));
-
}
-
-
publicstaticintw(Stringtag,Stringmsg){
-
returnprintln_native(LOG_ID_MAIN,WARN,tag,msg);
-
}
-
-
publicstaticintw(Stringtag,Stringmsg,Throwabletr){
-
returnprintln_native(LOG_ID_MAIN,WARN,tag,msg+'\n'+getStackTraceString(tr));
-
}
-
-
publicstaticintw(Stringtag,Throwabletr){
-
returnprintln_native(LOG_ID_MAIN,WARN,tag,getStackTraceString(tr));
-
}
-
-
publicstaticinte(Stringtag,Stringmsg){
-
returnprintln_native(LOG_ID_MAIN,ERROR,tag,msg);
-
}
-
-
publicstaticinte(Stringtag,Stringmsg,Throwabletr){
-
returnprintln_native(LOG_ID_MAIN,ERROR,tag,msg+'\n'+getStackTraceString(tr));
-
}
-
-
..................................................................
-
-
publicstaticnativeintprintln_native(intbufID,
-
intpriority,Stringtag,Stringmsg);
-
}
因此,如果要使用Java日志接口,只要在类中定义的LOG_TAG常量和引用android.util.Log就可以了:
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的输出,可以配合logcat工具。如果是在Eclipse环境下运行模拟器,并且安装了Android插件,那么,很简单,直接在Eclipse就可以查看了:
如果是在自己编译的Android源代码工程中使用,则在后台中运行模拟器:
USER-NAME@MACHINE-NAME:~/Android$ emulator &
启动adb shell工具:
USER-NAME@MACHINE-NAME:~/Android$ adb shell
使用logcat命令查看日志:
root@android:/ # logcat
这样就可以看到输出的日志了。
分享到:
相关推荐
在Android系统中,提供了简单、便利的LOG机制,开发人员可以方便地使用。在平时开发过程中经常需要与log打交道,所以很有必要了解log的使用方法及简单的原理。1、linux内核的log输出 在标准的linux内核开发过程中,...
示范如何在android工程中使用log4j记录日志
android.util.Log is the most usable library of the Android. But, when the app released on the market, some important information is clearly forgotten by the developer. All logs are disabled by Debug...
在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Android Log有一定的帮助.
Android NDK开发 log4cpp
adb抓Android系统log指令,日常分析刷机问题使用
Log4a is an mmap based, high-performance, highly available Android log collection framework | Log4a 是一个基于 mmap, 高性能、高可用的 Android 日志收集框架
Graylog client for Android devices Graylog is a rsyslog web interface based on Ruby On Rails: http://github.com/lennartkoopmann/Graylog Watch your favorite errors now mobile on your android device! :)...
Android log4j使用DemoAndroid log4j使用DemoAndroid log4j使用DemoAndroid log4j使用Demo
Android开发时使用到了log4j 1. android-logging-log4j 2. 所依赖的apache的log4j库
1 在LogUtlis方法的第一个参数中填this可以输出当前类的名称,特别是在匿名内部类使用也可以输出当前类名。 如 : LogUtils.i(this,”这是一个实用的日志工具类”) 或 LogUtils.i(类名.class,”这是一个实用的日志...
Android Log系统介绍 (基于Android N). 从调用 Log.d("xxx", "test") 到你从logcat中看到它的输出, 这中间都发生了什么? native代码中的"ALOG/ALOGD/ALOGE"等的"宏函数"log都打到哪里去了? 什么是 kernel log? 请看...
Log4Android2PCv2.3.7
Android中Log相关流程介绍
shell 脚本抓取android logcat和kernel log,以及删除旧的log,通过prop控制输出规则
对想深入研究Android中Log的实现机制的同志有用,在此分享给大家
当Android代码java层发生崩溃的时候,会将崩溃信息收集起来
快速打log的插件 模块快捷键为:ctrl + shift + L 例如新开一行,输入xzw,按下快捷键,将自动输入: Log.d("xzw","AccessSort:appendToEnd("+sortedMethods+"):140"); 以上包括tag,类名,函数名,参数,所在...