【问题标题】:How does Android determine which buffer to use for logcat messages?Android 如何确定用于 logcat 消息的缓冲区?
【发布时间】:2017-01-06 15:47:07
【问题描述】:

按照标准,Androidlogcat 系统有 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.
...

还有androidlogcat.cpp的源码,似乎暗示还有其他的,比如:

security 
kernel

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

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

(特别感谢对 AOS 源代码的具体引用。)

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

【问题讨论】:

    标签: java android c++ buffer logcat


    【解决方案1】:

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

    首先,各种与日志相关的(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.&lt;YOUR_LOG_TAG&gt; &lt;LEVEL&gt;

    并在文件 /data/local.prop 中:

    log.tag.&lt;YOUR_LOG_TAG&gt;=&lt;LEVEL&gt;

    此外,我发现了有趣的 cmets。

    MAIN 日志:

    详细程度从少到多的顺序是 错误、警告、信息、调试、详细。永远不应该编译详细 到应用程序中,开发期间除外。编译调试日志 in 但在运行时被剥离。始终保留错误、警告和信息日志。

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

    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 文件定义了每种类型代码的有效负载内容。

    【讨论】:

    • 快来回答你自己的(不好回答的)问题。 问题投票数 vs 回答投票数之前是3 / 3,现在是我投票后的4 / 4 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多