在程序開發過程中,LOG是廣泛使用的用來記錄程序執行過程的機制,它既可以用於程序調試,也可以用於產品運營中的事件記錄。在Android系統中,提供了簡單、便利的LOG機制,開發人員可以方便地使用。在平時開發過程中經常需要與log打交道,所以很有必要了解log的使用方法及簡單的原理。
1、Linux內核的log輸出
在標准的Linux內核開發過程中,使用 printk ,這是一個與printf輸出打印齊名的函數,同樣提供格式化輸出功能,只是其有
打印級別且將信息保存到 /proc/kmsg 日志中,使用cat命令查看其信息[cat /proc/kmsg]
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#deinfe KERN_ERR "<3>" /* error conditions */
#deinfe KERN_WARNING "<4>" /* warning conditions */
#deinfe KERN_NOTICE "<5>" /* normal but significant condition */
#deinfe KERN_INFO "<6>" /* informational */
#deinfe KERN_DEBUG "<7>" /* debug-level messages */
2、android中log輸出
Android系統在用戶空間中提供了輕量級的logger日志系統,它是在內核中實現的一種設備驅動,與用戶空間的logcat工具配合使用能夠方便地跟蹤調試程序。
Android系統中的C/C++日志接口是通過宏來使用的。在system/core/include/android/log.h定義了日志的級別:
/*
* Android log priority values, in ascending priority order.
*/
typedef enum android_LogPriority {
ANDROID_LOG_UNKNOWN = 0,
ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;
為了使用方便,在system/core/include/cutils/log.h定義了相對應的宏:
#define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
#define LOGD(...) ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
#define LOGI(...) ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
#define LOGW(...) ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
#define LOGE(...) ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
因為如果需要使用log輸出,包含其頭文件:#include <cutils/log.h> 並link其動態庫:liblog.so 即可
#define LOG_TAG "XX_LOG_TAG" // 這裡可以定義其輸出的TAG
#include <cutils/log.h>
JAVA層打印:
import android.util.Log;
private static final String TAG = "XX_LOG_TAG";
Log.e(TAG, "This is the error log printed by Log.i in android user space.");