前言
一直对Android的Logger系统了解有些模糊。从Java的System.out.println(),到Android的logcat,控制台输出和Android系统输出又有什么区别?最近看到老罗的《Android系统源码情景分析》的Logger篇,觉得有必要详细了解下。
以下概念摘至《Android系统源码情景分析》的Logger篇
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日志驱动程序中写入日志,它们写入的i 之类型分别是main、system和events。特别地,如果使用android.util.Log和android.util.Slog接口写入的日志的标签值是以“RIL”开头或者等被转换为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_EVNET_STRING用来写入evnets类型的日志。无论是Java日志写入接口还是C/C++日志写入接口,它们最终都是通过运行时库层的日志路liblog来往Logger日志驱动程序中写入日志的。此外,系统还提供了一个Logcat工具来读取和显示Logger日志驱动程序中的日志。
以上介绍的Logger日志系统框架可以通过下列的图进行形象的描述
日志系统框架
Logger日志一共划分为main、system、radio和events四种类型,其中,前三种类型的日志格式是相同的,而第四种类型的日志格式稍有区别。下面我们就分别介绍它们的格式。
类型为main、system和radio的日志格式如下图所示:
类型为main、system和radio的日志格式
其中,priority表示日志的优先级,它是一个整数;tag表示日志标签,它是一个字符串;msg表示日志内容,它也是一个字符串。日志优先级和日志标签可以在显示日志时作为过滤字段使用。日志优先级按照重要程度一般划分为VERBOSE、DEBUG、INFO、WARN、ERROR和FATAL六种。
类型为events的日志格式如下图所示:
类型为events的日志格式
其中,tag表示日志标签,它是一个整数;msg表示日志内容,它是一块二进制数据,它的内容格式是由日志写入着来决定的。一般来说,这些日志内容是由一个或者多个值组层的,每个值的前面都有一个字段来描述它的类型,如下图所示:
类型为events的日志内容的格式
Logger实用介绍:
1)System.out.println(); 在安卓系统中输出的是main级别,优先级为INFO,tag为System.out的日志
2)查看main级别的日志(Adb):
Android studio logcat工具,
终端:直接查看:adb logcat;过滤:adb logcat -s 类型
3)输出日志到电脑:
adb logcat -d -v threadtime > ~/documents/logcat.txt logcat日志
adb logcat -d -b radio -v threadtime > ~/documents/radio.txt radio日志
adb logcat -d -b events -v threadtime > ~/documents/events.txt events日志
adb logcat -d -b system -v threadtime > ~/documents/system.txt system日志
4)其它指令参考这篇博文:https://blog.csdn.net/linliang815/article/details/77773087