 Android日志消息的生(sheng)成
							時間:2018-09-25      來源:未知
							Android日志消息的生(sheng)成
							時間:2018-09-25      來源:未知 
							日志是(shi)故(gu)障處理(li)重要(yao)的(de)部分(fen),但(dan)是(shi)它難以實現,特別是(shi)在那些使用兩個不同機(ji)器進(jin)行(xing)開(kai)發和(he)(he)執行(xing)的(de)移動平臺上(shang)。Android有一個擴展日志框架,用于對系統范圍內Android系統本(ben)身的(de)信息(xi)及應用程序的(de)信息(xi)集中做日志。它還(huan)提供了一組用戶級應用程序以查看和(he)(he)過濾(lv)這(zhe)些日志
Android 日(ri)(ri)(ri)志(zhi)框架是(shi)名字為logger的(de)內(nei)核(he)模塊。隨時隨地地對平臺上(shang)的(de)任何信(xin)息進行日(ri)(ri)(ri)志(zhi)會產生大量信(xin)息,從(cong)而使得查看(kan)和分析浙西(xi)日(ri)(ri)(ri)志(zhi)變(bian)得非(fei)常困(kun)難(nan)。為了簡化這個過程,Android日(ri)(ri)(ri)志(zhi)框架吧日(ri)(ri)(ri)志(zhi)消息分成4個日(ri)(ri)(ri)志(zhi)緩(huan)沖(chong)區
Main 主要(yao)應用(yong)程序(xu)的日志信息
Event 系(xi)統事件(jian)
Radio Radio 相關(guan)的日志信息
System 調(diao)試(shi)時產(chan)生的低級(ji)系統(tong)調(diao)試(shi)信息
這4個緩沖區(qu)以偽設備的(de)形式保(bao)(bao)存(cun)(cun)在(zai)(zai)dev/log系統目錄下。因(yin)為(wei)移(yi)動平臺上(shang)的(de)I/O操作(zuo)代價(jia)很大,所(suo)以日志信(xin)息(xi)要保(bao)(bao)存(cun)(cun)在(zai)(zai)內(nei)(nei)存(cun)(cun)中(zhong)(zhong)(zhong),而不能保(bao)(bao)存(cun)(cun)在(zai)(zai)永(yong)久(jiu)性存(cun)(cun)儲(chu)(chu)器(例如磁盤中(zhong)(zhong)(zhong))。為(wei)了有(you)效的(de)控制對存(cun)(cun)儲(chu)(chu)日志信(xin)息(xi)的(de)保(bao)(bao)存(cun)(cun)在(zai)(zai)內(nei)(nei)存(cun)(cun)中(zhong)(zhong)(zhong)
存儲空(kong)間的充分(fen)利用
MAIN,RADIO,SYSTEM 64kb
256KB 的(de)日志緩沖區(qu)
開發(fa)者不希望直(zhi)接與(yu)logger內核模(mo)塊進(jin)行交互,Android運行庫(ku)系統(tong)提供了一組API調用(yong)以便(bian)于java代(dai)(dai)碼(ma)(ma)和原生(sheng)代(dai)(dai)碼(ma)(ma)想(xiang)logger內核模(mo)塊發(fa)送日志信(xin)息。通過android/log.h頭文件(jian)來展(zhan)示原生(sheng)代(dai)(dai)碼(ma)(ma)的日志API。為(wei)了使用(yong)日志函數(shu),原生(sheng)代(dai)(dai)碼(ma)(ma)需要先向(xiang)包含該(gai)頭文件(jian)。
 #include
除(chu)了要包含合(he)適的頭文(wen)件,還需要動態修改(gai)Android.mk文(wen)件從而(er)將原(yuan)生模塊與(yu)日志庫進(jin)行(xing)鏈(lian)接,可以通(tong)過使用構建系統變量(liang)LOCAL_LDLIBS完成操作,
LOCAL_LALIBS += -llog
此(ci)語法必(bi)須在include前面
日志消息
通過日志API發送給logger模塊的(de)每個日志條目(mu)都具有(you)以下字段:
Priority:取(qu)值分別為(wei)verbose,debug,info,warning,error和fatal,表示日志(zhi)的重要程(cheng)度,支持的日志(zhi)優先級在android/log.h頭文件(jian)中聲(sheng)明,
支(zhi)持的日志優(you)先(xian)級
typedef enmu android_LogPriority
{
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR
ANDROID_LOG_FATAL,
}android_LogPriority;
生(sheng)成簡單的日志消(xiao)息
_android_log_write(ANDROID_LOG_WARN,"hello-jni","warning log.");
生成格式化的日志消息
_android_log_print(ANDROID_LOG_ERROR,"hello-jni",
"Failed with errno %d",erron);
//參數分(fen)別是日志優(you)先級(ji),日志標簽和日志消息
3、_android_log_vprint:粗糊了參(can)數(shu)傳(chuan)遞(di)方式外,其他功能與(yu)_android_log_print 函數(shu)完(wan)全相(xiang)同,_android_log_vprint函數(shu)用va_list傳(chuan)遞(di)附加參(can)數(shu),而_android_log_print函數(shu)中以連續(xu)參(can)數(shu)的凡是改為傳(chuan)遞(di)參(can)數(shu),如果想要調用日志(zhi)函數(shu)時傳(chuan)遞(di)給當前函數(shu)的參(can)數(shu)個數(shu)動(dong)態變化時,該函數(shu)的優勢(shi)就(jiu)會體(ti)現(xian)出來。
void log_verbose(const char* format,...)
{
va_list args;
va_start(args,format);
_android_log_vprint(ANDROID_LOG_VERBOSS,"hello-jni",format,args);
va_end(args);
}
void example()
{
log_verbose("Error is now %d",error);
}

