🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Android提供的Logger日志系统是基于内核中的Logger日志驱动程序实现的,它将日志记录保存在内核空间中。为了有效地利用内存空间,Logger日志驱动程序在内部使用一个环形缓冲区来保存日志。因此,当Logger日志驱动程序中的环形缓冲区满了之后,新的日志就会覆盖旧的日志。 由于新的日志会覆盖旧的日志,因此,Logger日志驱动程序根据日志的类型以及日志的输出量来对日志记录进行分类,避免重要的日志被不重要的日志覆盖,或者数据量大的日志覆盖数据量小的日志。日志的类型一共有四种,它们分别是main、system、radio和events。在Logger日志驱动程序中,这四种类型的日志分别通过/dev/log/main、/dev/log/system、/dev/log/radio和/dev/log/events四个设备文件来访问。 类型为main的日志是应用程序级别的,而类型为system的日志是系统级别的。由于系统级日志要比应用程序级日志重要,因此,把它们分开来记录,可以避免系统级日志被应用程序级日志覆盖。类型为radio的日志是与无线设备相关的,它们的量很大,因此,把它们单独记录在一起,可以避免它们覆盖其他类型的日志。类型为events的日志是专门用来诊断系统问题的,应用程序开发者不应该使用此种类型的日志。 Android系统在应用程序框架层中提供了android.util.Log、android.util.Slog和android.util.EventLog三个Java接口来往Logger日志驱动程序中写入日志,它们写入的日志类型分别为main、system和events。特别地,如果使用android.util.Log和android.util.Slog接口写入的日志的标签值是以“RIL”开头或者等于“HTC_RIL”、“AT”、“GSM”、“STK”、“CDMA”、“PHONE”和“SMS”时,它们就会被转换为radio类型的日志写入到Logger日志驱动程序中。相应地,Android系统在运行时库层也提供了三组C/C++宏来往Logger日志驱动程序中写入日志。其中,宏LOGV、LOGD、LOGI、LOGW和LOGE用来写入main类型的日志,宏SLOGV、SLOGD、SLOGI、SLOGW和SLOGE用来写入system类型的日志,宏LOG_EVENT_INT、LOG_EVENT_LONG和LOG_EVENT_STRING用来写入events类型的日志。无论是Java日志写入接口还是C/C++日志写入接口,它们最终都是通过运行时库层的日志库liblog来往Logger日志驱动程序中写入日志的。此外,系统还提供了一个Logcat工具来读取和显示Logger日志驱动程序中的日志。 以上介绍的Logger日志系统框架可以通过图4-1来形象地描述。 ![Logger日志系统框架](https://box.kancloud.cn/4c824fc80051df7d24dcfb3168da6721_573x508.jpg =573x508) 在本章内容中,我们首先介绍Logger日志系统的日志格式,然后分析Logger日志驱动程序、运行时库层的日志库liblog、C/C++和Java日志写入接口的实现,最后分析日志读取工具Logcat的实现。