Android如何确定用于logcat消息的缓冲区?

not*_*bit 5 c++ java android buffer logcat

按照标准,Android logcat系统有4种不同的环形缓冲区:

main
system
radio
events

# and alias & groups:
all      -- all available logs
default  -- main
crash    -- n/a
Run Code Online (Sandbox Code Playgroud)

但是,在AOS 6+上似乎还有其他缓冲区:

# logcat --help
...
  -b <buffer>     Request alternate ring buffer, 'main', 'system', 'radio',
                  'events', 'crash' or 'all'. Multiple -b parameters are
                  allowed and results are interleaved. The default is
                  -b main -b system -b crash.
...
Run Code Online (Sandbox Code Playgroud)

和android logcat.cpp源代码,似乎暗示还有其他的,如:

security 
kernel
Run Code Online (Sandbox Code Playgroud)

通常在java应用程序中,将消息放入mainlogcat的方法是使用:Log.i(TAG, msg).

所以问题是: Android如何确定用于各种logcat消息的缓冲区?

(特别感谢AOS源代码的具体参考.)

然后一个自然的后续问题是,你如何看到或启用其他隐藏的缓冲区?

not*_*bit 5

我不喜欢回答我自己的问题,但我找到了一些答案,还有一些非常好的笔记。

首先,各种与日志相关的 (Java) 源文件位于: platform_frameworks_base/core/java/android/util/和: platform_frameworks_base/telephony/java/android/telephony/

EventLog.java   # EVENT Log:  These diagnostic events are for system integrators, not application authors.
Log.java        # MAIN Log:   Where user app logcat goes from:  Log.v() Log.d() Log.i() Log.w() and Log.e()
Slog.java       # SYSTEM Log: Primarily for use by coding running within the system process.
Rlog.java       # RADIO Log:  All radio, wifi, bluetooth etc. related logs. Also scrubs personal info from appearing in logs. 
Run Code Online (Sandbox Code Playgroud)

与相关文件:

EventLogTags.java       # Deprecated! (Use EventLog)
LocalLog.java           # log(), dump(), reverseDump(), ReadOnlyLocalLog()
LogPrinter.java         #  decides what buffer to print to: LOG_ID_<buffer_name>
LogWriter.java          #  decides priority and TAG
TimingLogger.java       # A utility class to help log timings splits throughout a method call.
Run Code Online (Sandbox Code Playgroud)

日志缓冲区在Log.java 中通过以下方式标识:

public static final int LOG_ID_MAIN = 0;
public static final int LOG_ID_RADIO = 1;
public static final int LOG_ID_EVENTS = 2;
public static final int LOG_ID_SYSTEM = 3;
public static final int LOG_ID_CRASH = 4;
Run Code Online (Sandbox Code Playgroud)

在操作系统中,日志记录由以下属性控制:

setprop log.tag.<YOUR_LOG_TAG> <LEVEL>

并在文件中/data/local.prop

log.tag.<YOUR_LOG_TAG>=<LEVEL>

此外,我发现了有趣的评论。

日志:

就详细程度而言,从最少到最多的顺序是 ERROR、WARN、INFO、DEBUG、VERBOSE。除非在开发期间,否则永远不应将 Verbose 编译到应用程序中。调试日志被编译但在运行时被剥离。错误、警告和信息日志始终保留。

提示:不要忘记,当您拨打电话时

Log.v(TAG, "index=" + i);

当您构建要传递到 Log.d 的字符串时,编译器使用 StringBuilder 并且至少发生三个分配:StringBuilder 本身、缓冲区和 String 对象。实际上,还有另外一个缓冲区分配和复制,对gc 的压力更大。这意味着如果您的日志消息被过滤掉,您可能正在做大量工作并产生大量开销。

事件日志:

访问系统诊断事件记录。系统诊断事件用于记录某些系统级事件(例如垃圾收集、活动管理器状态、系统看门狗和其他低级活动),这些事件可以在系统开发过程中自动收集和分析。

不是主要的“logcat”调试日志({@link android.util.Log})!这些诊断事件适用于系统集成商,而不是应用程序作者。

事件使用对应于 /system/etc/event-log-tags 的整数标签代码。它们携带一个或多个 int、long 或 String 值的负载。event-log-tags 文件定义了每个类型代码的负载内容。