文章目录
日志等级
日志等级可快速配置该日志在配置的环境下是否会输出。
cpp
typedef enum android_LogPriority {
/** For internal use only. */
ANDROID_LOG_UNKNOWN = 0,
/** The default priority, for internal use only. */
ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
/** Verbose logging. Should typically be disabled for a release apk. */
ANDROID_LOG_VERBOSE,
/** Debug logging. Should typically be disabled for a release apk. */
ANDROID_LOG_DEBUG,
/** Informational logging. Should typically be disabled for a release apk. */
ANDROID_LOG_INFO,
/** Warning logging. For use with recoverable failures. */
ANDROID_LOG_WARN,
/** Error logging. For use with unrecoverable failures. */
ANDROID_LOG_ERROR,
/** Fatal logging. For use when aborting. */
ANDROID_LOG_FATAL,
/** For internal use only. */
ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;
日志分类
每个日志类型都有自己的 RingBuffer。
常规的日志 __android_log_write 不带 log_id 分类参数,默认是往 main 中写入。
c
typedef enum log_id {
/** For internal use only. */
LOG_ID_MIN = 0,
/** The main log buffer. This is the only log buffer available to apps. */
LOG_ID_MAIN = 0,
/** The radio log buffer. */
LOG_ID_RADIO = 1,
/** The event log buffer. */
LOG_ID_EVENTS = 2,
/** The system log buffer. */
LOG_ID_SYSTEM = 3,
/** The crash log buffer. */
LOG_ID_CRASH = 4,
/** The statistics log buffer. */
LOG_ID_STATS = 5,
/** The security log buffer. */
LOG_ID_SECURITY = 6,
/** The kernel log buffer. */
LOG_ID_KERNEL = 7,
/** For internal use only. */
LOG_ID_MAX,
/**
* Let the logging library choose the best log target in cases where it's
* unclear. This is useful if you're generic library code that can't know
* which log your caller should use.
*/
LOG_ID_DEFAULT = 0x7FFFFFFF
} log_id_t;
liblog 的使用
c
#include <android/log.h>
// 输出字符串
__android_log_write(ANDROID_LOG_DEBUG, "v_gal", "Button clicked");
__android_log_print(ANDROID_LOG_DEBUG, "v_gal", "Player score: %d", score);
配置发送给 logd 的日志等级
liblog 库会读取 Property 来获取日志显示等级,确定当前日志级别是否需要发送给 logd。
源码路径:system/logging/liblog/properties.cpp
相关函数:
c
static int __android_log_level(const char* tag, size_t tag_len)
该函数会读取四个 Property 来判断:
log.tag.<TAG>persist.log.tag.<TAG>log.tagpersist.log.tag
如果没有给 tag 设置任何属性,则系统的默认等级为 INFO:
shell
$ getprop | grep log.tag
[log.tag.stats_log]: [I]
可以通过修改 Property 来修改发送日志的行为:
shell
$ setprop log.tag.<TAG> DEBUG
则 <TAG> 标签 DEBUG 及以上等级日志均会发送给 logd。
logcat
logcat 从 logd 中读取日志,由于 logd 有 8 个分类的 RingBuffer,可以通过 --buffer 选项来选择:
mainradioeventssystemcrashstatssecuritykerneldefaultall
shell
$ logcat --buffer=crash
如果不设置 buffer,则默认为 default,包含 main, system, crash, kernel。
查看和设置 RingBuffer 大小:
shell
### 查看 RingBuffer 的大小
$ logcat --buffer-size
### 设置 RingBuffer 的大小
$ logcat --buffer=main --buffer-size=256K
shell
### 清除 RingBuffer 中的日志
$ logcat --clear
shell
### -d:执行命令后立刻退出,而不是持续监听
### -s: 静默所有日志
### <tag>[:priority]:只打印标签为 <tag>,并且优先级为 priority 以上的日志
$ logcat -d -s <tag>[:priority]