日志
任何高质量的 Android 应用程序都会通过应用程序日志跟踪它正在做什么。这些日志允许开发人员轻松调试帮助,以诊断应用程序正在发生的事情。可在此处找到完整的 Android 文档,但摘要如下:
基本日志记录
Log
类是编写开发人员日志的主要来源,通过指定 tag
和 message
。标记是你可以用来过滤日志消息的标识,以标识来自你的特定活动的行。只需致电
Log.v(String tag, String msg);
并且 Android 系统会向 logcat 写一条消息:
07-28 12:00:00.759 24812-24839/my.packagename V/MyAnimator: Some log messages
└ time stamp | app.package┘ | └ any tag |
process & thread ids ┘ log level┘ └ the log message
提示:
注意进程 ID 和线程 ID。如果它们是相同的 - 日志来自主/ UI 线程!
可以使用任何标记,但通常使用类名作为标记:
public static final String tag = MyAnimator.class.getSimpleName();
日志级别
Android 记录器有 6 个不同的级别,每个级别都有一定的用途:
ERROR
:Log.e()
- 用于表示严重失败,这是投掷
Exception
时打印的等级。
- 用于表示严重失败,这是投掷
WARN
:Log.w()
- 用于指示警告,主要用于可恢复的故障
INFO
:Log.i()
- 用于指示有关应用程序状态的更高级别信息
DEBUG
:Log.d()
- 用于记录在调试应用程序时有用的信息,但在运行应用程序时会妨碍这些信息
VERBOSE
:Log.v()
- 用于记录反映应用程序状态的小细节的信息
ASSERT
:Log.wtf()
- 用于记录有关不应发生的情况的信息。
- wtf 代表多么可怕的失败。
记录的动机
日志记录的动机是通过浏览应用程序中的事件链来轻松查找错误,警告和其他信息。例如,假设一个应用程序从文本文件中读取行,但错误地认为该文件永远不会为空。日志跟踪(不记录的应用程序)看起来像这样:
E/MyApplication: Process: com.example.myapplication, PID: 25788
com.example.SomeRandomException: Expected string, got 'null' instead
接下来是一堆最终导致违规行的堆栈跟踪,其中通过调试器逐步执行最终会导致问题
但是,启用了日志记录的应用程序的日志跟踪可能如下所示:
V/MyApplication: Looking for file myFile.txt on the SD card
D/MyApplication: Found file myFile.txt at path <path>
V/MyApplication: Opening file myFile.txt
D/MyApplication: Finished reading myFile.txt, found 0 lines
V/MyApplication: Closing file myFile.txt
...
E/MyApplication: Process: com.example.myapplication, PID: 25788
com.example.SomeRandomException: Expected string, got 'null' instead
快速浏览日志,很明显文件是空的。
记录时需要考虑的事项:
虽然日志记录是一个强大的工具,它允许 Android 开发人员更深入地了解其应用程序的内部工作,但日志记录确实存在一些缺点。
日志可读性:
Android 应用程序通常会同时运行多个日志。因此,每个日志都易于阅读并且仅包含相关的必要信息非常重要。
性能:
记录确实需要少量的系统资源。一般而言,这并不值得关注,但是,如果过度使用,日志记录可能会对应用程序性能产生负面影响。
安全:
最近,Google Play 市场中添加了几个 Android 应用程序,允许用户查看所有正在运行的应用程序的日志。这种非预期的数据显示可以允许用户查看机密信息。根据经验,在将应用程序发布到市场之前,请始终删除包含非公开数据的日志。
结论:
日志记录是 Android 应用程序的重要组成部分,因为它为开发人员提供了强大功能。创建有用的日志跟踪的能力是软件开发中最具挑战性的方面之一,但 Android 的 Log 类有助于使其更容易。
有关更多文档和示例,请访问 Logging 并使用 Logcat