LogCat详解、工具类

来源:互联网 发布:中国国库有多少钱知乎 编辑:程序博客网 时间:2024/06/06 08:58

我们来学习一下如何使用Android 的日志工具吧。
Android中的日志工具类是Log(android.util.Log),这个类中提供了如下几个方法来供我们打印日志。
1. Log.v()
这个方法用于打印那些最为琐碎的,意义最小的日志信息。对应级别verbose,是
Android 日志里面级别最低的一种。
2. Log.d()
这个方法用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助
的。对应级别debug,比verbose 高一级。
3. Log.i()
这个方法用于打印一些比较重要的数据,这些数据应该是你非常想看到的,可以帮
你分析用户行为的那种。对应级别info,比debug 高一级。
4. Log.w()
这个方法用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好
去修复一下这些出现警告的地方。对应级别warn,比info 高一级。
5. Log.e()
这个方法用于打印程序中的错误信息,比如程序进入到了catch 语句当中。当有错
误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级
别error,比warn 高一级。
其实很简单,一共就五个方法,当然每个方法还会有不同的重载,但那对你来说肯定不
是什么难理解的地方了。我们现在就在HelloWorld 项目中试一试日志工具好不好用吧。
打开HelloWorldActivity,在onCreate()方法中添加一行打印日志的语句,如下所示:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.hello_world_layout);Log.d("HelloWorldActivity", "onCreate execute");}

Log.d 方法中传入了两个参数,第一个参数是tag,一般传入当前的类名就好,主要用于对打印信息进行过滤。第二个参数是msg,即想要打印的具体的内容。
现在可以重新运行一下HelloWorld 这个项目了,仍然是右击HelloWorld 项目→Run As
→Android Application。等程序运行完毕,可以看到LogCat 中打印信息如图

eclipse中的

androidstudio中的

其中你不仅可以看到打印日志的内容和Tag 名,就连程序的包名、打印的时间以及应用
程序的进程号都可以看到。如果你的LogCat 中并没有打印出任何信息,有可能是因为你当
前的设备失去焦点了。这时你只需要进入到DDMS 视图,在Devices 窗口中点击一下你当前
的设备,打印信息就会出来了。
另外不知道你有没有注意到,你的第一行代码已经在不知不觉中写出来了,我也总算是
交差了。
1.4.3 为什么使用Log 而不使用System.out
我相信很多的Java 新手都非常喜欢使用System.out.println()方法来打印日志,不知道你
是不是也喜欢这么做。不过在真正的项目开发中,是极度不建议使用System.out.println()方
法的!如果你在公司的项目中经常使用这个方法,就很有可能要挨骂了。
为什么System.out.println()方法会这么遭大家唾弃呢?经过我仔细分析之后,发现这个
方法除了使用方便一点之外,其他就一无是处了。方便在哪儿呢?在Eclipse 中你只需要输
入syso,然后按下代码提示键,这个方法就会自动出来了,相信这也是很多Java 新手对它
钟情的原因。那缺点又在哪儿了呢?这个就太多了,比如日志打印不可控制、打印时间无法
确定、不能添加过滤器、日志没有级别区分……
听我说了这些,你可能已经不太想用System.out.println()方法了,那么Log 就把上面所
说的缺点全部都做好了吗?虽然谈不上全部,但我觉得Log 已经做得相当不错了。我现在就
来带你看看Log 和LogCat 配合的强大之处。
首先在LogCat 中是可以很轻松地添加过滤器的,你可以在图1.21 中看到我们目前所有
的过滤器。


献上一个自定义的LogCat工具类
可以看到,我们在LogUtil 中先是定义了VERBOSE、DEBUG、INFO、WARN、ERROR、
NOTHING 这六个整型常量,并且它们对应的值都是递增的。然后又定义了一个LEVEL 常
量,可以将它的值指定为上面六个常量中的任意一个。
接下来我们提供了v()、d()、i()、w()、e()这五个自定义的日志方法,在其内部分别调用
了Log.v()、Log.d()、Log.i()、Log.w()、Log.e()这五个方法来打印日志,只不过在这些自定
义的方法中我们都加入了一个if 判断,只有当LEVEL 常量的值小于或等于对应日志级别值
的时候,才会将日志打印出来。
这样就把一个自定义的日志工具创建好了,之后在项目里我们可以像使用普通的日志工
具一样使用LogUtil,比如打印一行DEBUG 级别的日志就可以这样写:
LogUtil.d(“TAG”, “debug log”);
打印一行WARN 级别的日志就可以这样写:
LogUtil.w(“TAG”, “warn log”);
然后我们只需要修改LEVEL 常量的值,就可以自由地控制日志的打印行为了。比如让
LEVEL 等于VERBOSE 就可以把所有的日志都打印出来,让LEVEL 等于WARN 就可以只
打印警告以上级别的日志,让LEVEL 等于NOTHING 就可以把所有日志都屏蔽掉。
使用了这种方法之后,刚才所说的那个问题就不复存在了,你只需要在开发阶段将
LEVEL 指定成VERBOSE,当项目正式上线的时候将LEVEL 指定成NOTHING 就可以了。

public class LogUtil {    public static final int VERBOSE = 1;    public static final int DEBUG = 2;    public static final int INFO = 3;    public static final int WARN = 4;    public static final int ERROR = 5;    public static final int NOTHING = 6;    public static final int LEVEL = VERBOSE;    public static void v(String tag, String msg) {        if (LEVEL <= VERBOSE) {            Log.v(tag, msg);        }    }    public static void d(String tag, String msg) {        if (LEVEL <= DEBUG) {            Log.d(tag, msg);        }    }    public static void i(String tag, String msg) {        if (LEVEL <= INFO) {            Log.i(tag, msg);        }    }    public static void w(String tag, String msg) {        if (LEVEL <= WARN) {            Log.w(tag, msg);        }    }    public static void e(String tag, String msg) {        if (LEVEL <= ERROR) {            Log.e(tag, msg);        }    }}

欢迎关注我Github : @ 我的github

原创粉丝点击