适用于 Android 的良好日志记录技术

Posted

技术标签:

【中文标题】适用于 Android 的良好日志记录技术【英文标题】:Good Logging Techniques for Android 【发布时间】:2013-04-16 18:27:53 【问题描述】:

我希望向我正在接管的 android 应用程序引入一些日志记录。我希望能够在开发过程中引用这个日志文件,如果客户在程序生产过程中遇到问题,我希望得到一份日志副本。

由于这将在生产中,我希望将日志文件制作成滚动日志,这样它就不会消耗太多资源。

在一些 android 示例中,我注意到 import android.util.Log;。我很好奇这是否是 android 的标准日志记录方式。如果没有,有什么好的方法(例如,我在用 java 编码时真的很喜欢 log4j。)?

    android.util.log 可以像我要求的那样做滚动日志吗?

    android.util.Log 默认写入哪里?

    如果只是为了控制台,有没有办法将其写入 android 设备上的滚动日志文件,如果程序出现问题,可以通过电子邮件发送该文件?

【问题讨论】:

Start Here 【参考方案1】:

android.util.log 可以像我要求的那样做滚动日志吗?

1) 不像您要求的那样。日志会滚动,但会针对设备上的所有应用程序,而不仅仅是您的应用程序。

android.util.Log 默认写入到哪里?

2) Android日志系统,可通过logcat查看。如果您熟悉它,可以将其想象为 Windows 事件日志。我会下载一个 logcat 程序并滚动浏览您的系统日志以熟悉它们。

如果只是为了控制台,有没有办法将其写入 android 设备上的滚动日志文件,如果程序出现问题,可以通过电子邮件发送?

3) 您可以将自己的滚动日志写入文件系统,然后通过电子邮件发送。但是,您必须实现此功能。您还可以尝试查看是否有任何 3rd 方日志记录工具/库可以满足您的需求。

【讨论】:

【参考方案2】:

首先。默认情况下,您不应在生产代码中启用大量日志记录。我们已经通过编写默认日志类的扩展来解决它,如下所示。

使用它,日志记录在开发代码中默认开启,在生产代码中默认关闭。您可以编写一些小的隐藏启用程序,以便您的客户可以在必要时激活日志记录。

第二次使用应用程序来存储和检索日志!试试CatLog 或类似的。

祝你好运!

public class MyLog 

    private static boolean m_Enabled = BuildConfig.DEBUG;

    public MyLog() 

    

    public static void e(String tag, String msg) 
        if (m_Enabled) Log.e(tag, msg);
    

    public static void w(String tag, String msg) 
        if (m_Enabled) Log.w(tag, msg);
    

    public static void i(String tag, String msg) 
        if (m_Enabled) Log.i(tag, msg);
    

    public static void d(String tag, String msg) 
        if (m_Enabled) Log.d(tag, msg);
    

    public static void v(String tag, String msg) 
        if (m_Enabled) Log.v(tag, msg);
    

    public static void enable() 
        m_Enabled = true;
    

    public static void disable() 
        m_Enabled = false;
    

    public static boolean isEnabled() 
       return m_Enabled;
    

【讨论】:

我认为如果您正在做最少的日志记录并且您想用它来调试代码的所有部分,这是一个很好的实现。例如,我可能不想为某些区域实现调试,而我会为其他区域实现(logcat 可能会拥塞)。出于性能原因,我想我宁愿有一个 if(DEBUG) Log....; 。我将使用上述实现进行额外的方法调用。 我支持你。此外,在尝试取消引用某些对象以打印到日志时,您不会冒 NPE 的风险。缺点是代码因大量 if(...) 语句而变得臃肿。我多么怀念 C/C++ 和定义!【参考方案3】:

有文档和示例说明如何使用标准 Log.X And​​roid 调用和“logCat”在 android 设备上执行大小有界的滚动日志 - 例如参见 here 和 here

【讨论】:

以上是关于适用于 Android 的良好日志记录技术的主要内容,如果未能解决你的问题,请参考以下文章

是否有适用于 Haskell 的简单颜色启用记录器?

GWT 日志记录设置

haproxy日志记录在哪

日志记录/安全注意事项和敏感数据

.NET Core使用Nlog记录日志

如何在 C++ 中完全省略 CBC 日志记录?