![](/img/trans.png)
[英]Does Android SDK logcat show custom Log.d() messages in the same order in which they are created?
[英]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.