Android Log System

文章目录

    • 日志等级
    • 日志分类
    • [liblog 的使用](#liblog 的使用)
    • [配置发送给 logd 的日志等级](#配置发送给 logd 的日志等级)
    • logcat

日志等级

日志等级可快速配置该日志在配置的环境下是否会输出。

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 来判断:

  1. log.tag.<TAG>
  2. persist.log.tag.<TAG>
  3. log.tag
  4. persist.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 选项来选择:

  1. main
  2. radio
  3. events
  4. system
  5. crash
  6. stats
  7. security
  8. kernel
  9. default
  10. all
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]
相关推荐
心平气和量大福大5 小时前
android-控件-搜索框SearchView
android·gitee
2601_962177135 小时前
【MySQL篇】聚合查询,联合查询
android·java·mysql
壮哥_icon6 小时前
【Android】批量 VectorDrawable 动态分别修改 fillColor 和 strokeColor 的踩坑与终极解决方案
android
齐天qaq7 小时前
Android 系统 APK 分区与权限
android
心平气和量大福大7 小时前
android-控件-多选框CheckBox
android·gitee
pengyu9 小时前
【Kotlin 协程修仙录 · 大乘境 · 初阶】 | 跳出三界:协程在 KMP 与后端开发中的跨平台之道
android·kotlin
XiaoLeisj9 小时前
Android Memory Profiler:堆内存指标、内存抖动与泄漏定位
android·性能优化·内存抖动·内存泄露·memory profiler
未来猫咪花9 小时前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios
古法安卓9 小时前
Android-重启流程源码解析
android·java·android studio