一、引言
日志记录是将应用程序的操作和状态记录到辅助接口(例如文件,或者数据库,都可以)的过程。然而,软件开发人员并不十分重视日志记录。其实有用的日志可以为开发人员(特别是当有人必须调试/维护别人的代码时)在试图理解代码的作用时提供巨大帮助。一些开发人员说堆栈跟踪是人们应该需要的,但这与事实相去甚远。堆栈跟踪很棒,可以告诉您哪里出了什么问题,但它们无法告诉您最初是如何到达那里的。当然,您可以通过断点跟踪执行,但是,盲目进入会使整个过程比实际应该和可能更耗时。
总而言之,不管你需要训练人工智能模型,还是需要编写可靠软件程序,我都十分建议你在开发过程中添加日志记录,以便更好地维护代码。
二、Android开发中为什么要用Log日志输出而不用print函数打印
很多程序员都喜欢使用System.out.println()来进行调试,因为它无比地方便。但是在Android的开发过程中,并不建议这样。使用System.out.println()很难找到打印出来的信息,因为Android的输出实在是太多,一不留神这刚print出来的东西就没了(被其它Log输出顶上去)。更官方的原因是System.out.println()没有打印的级别区分,也没有日志标签,同时还不方便保存到文件当中。
用Log的话就可以很好地使用日志标签和进行日志级别的区分,同时在Android开发环境中的Logcat添加过滤器很好地定位打印的信息。
三、Android日志输出的不同方法
日志输出方法 | 日志级别 | 备注 |
Log.v() | verbose | 打印琐碎、意义较小的日志信息 |
Log.d() | debug | 打印一些调试信息 |
Log.i() | information | 打印一些比较重要的数据 |
Log.w() | warn | 打印一些警告信息 |
Log.e() | error | 打印程序中的错误信息 |
上面有五种方法打印日志,请大家按照日志级别来进行打印,不要用错(例如通过Log.e方法打印琐碎信息)。
四、日志打印Demo
为了说明日志打印的简单方法,这里写一个Demo:在Activity里面打印5条日志,这些日志的级别分别被设置为v、d、i、w和e。代码如下:
package com.cs.blackbox;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.Timer;
import java.util.TimerTask;
public class LogPrintActivity extends AppCompatActivity {
private static final String TAG = "Log--------->>>>";
TimerTask task = new TimerTask() {
@Override
public void run() {
//TODO
Log.v(TAG, "v: I am a robot, and testing the log print function.");
Log.d(TAG, "d: I am a robot, and testing the log print function.");
Log.i(TAG, "i: I am a robot, and testing the log print function.");
Log.w(TAG, "w: I am a robot, and testing the log print function.");
Log.e(TAG, "e: I am a robot, and testing the log print function.");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log_print);
Timer timer = new Timer();
timer.schedule(task, 5000, 5000);
}
}
这里说一下程序中的一些常量和变量,其中常量TAG = "Log--------->>>>"是日志打印的标记,通过Logcat日志筛选的功能,你可以快速定位到自己的程序输出。使用方法如下:
1、Android Studio开发环境的底部点击“Logcat”
2、在搜索框中输入你的TAG,而且右边选择“Show only selected application”。
3、然后你就可以看到你自定义的日志输出了。
这里说明一下“Verbose”的意思,选择了它是指Logcat窗口显示“v、d、i、w和e”等全部级别类型的日志,而如果你在箭头那里选择了“Debug”,那么Logcat窗口就会只显示“d、i、w和e”等四个级别类型的日志。同理,当你选择了“Info”,Logcat窗口只显示“i、w和e”等三个级别类型的日志;当你选择了“Warn”,Logcat窗口只显示“w和e”等两个级别类型的日志;而当你选择“Error”时,Logcat窗口就会只显示“e”级别类型的日志。
说到这里,我终于明白别人为什么喜欢用Log.e()来打印程序输出,因为如果你选择Log.v或者Log.d的话,别人或者别的app打印的那些不重要的日志也会被显示出来,导致自己想要看到的日志打印输出很难找到。
但无论如何,建议还是通过区分级别来打印日志会好点。
五、参考资料
1、An introduction to logging for programmers
3、郭霖,第一行代码Android第3版