繁体   English   中英

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

[英]How does Android determine which buffer to use for logcat messages?

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

main
system
radio
events

# and alias & groups:
all      -- all available logs
default  -- main
crash    -- n/a

但是,在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.
...

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

security 
kernel

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

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

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

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

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

首先,各种与日志相关的(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. 

与相关文件:

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.

日志缓冲区在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;

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

setprop log.tag.<YOUR_LOG_TAG> <LEVEL>

并在文件/data/local.prop

log.tag.<YOUR_LOG_TAG>=<LEVEL>

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

MAIN日志:

详细程度的顺序,从最小到最多,是ERROR,WARN,INFO,DEBUG,VERBOSE。 除了在开发期间,不应该将详细编译到应用程序中。 调试日志在运行时编译但被剥离。 始终保留错误,警告和信息日志。

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

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

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

EVENT日志:

访问系统诊断事件记录。 系统诊断事件用于记录某些系统级事件(例如垃圾收集,活动管理器状态,系统监视器和其他低级活动),这些事件可在系统开发期间自动收集和分析。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM