加Log的讲究

         虽然有单步调试这个强大的工具来帮助程序员找出程序中的错误,但是log在某些情况下是单步调试所不能取代的。比如获取用户实际使用时发生错误的log来诊断程序的问题等。

         为了能让log更好的帮助我们诊断程序的问题,如何加log是有讲究的。

1.        每条log中需要包含输出log的级别,源文件,函数名,行号。这些信息可以帮助查看log的人员定位出这句log是从哪里打印的。

2.        log是分级别(level)的,以android.util.Log为例。Log的级别以log出现的频度由低到高(出现频度越低,log级别越高)分为ERROR, WARN, INFO,DEBUG, VERBOSE。

3.        log分级的好处

a)        诊断问题时,可以先查看有没有ERROR,WARN级别的log,快速定位问题。

b)        通过在release版本中,提高log级别来过滤掉一些不重要,但又数量众多的log。比如release版本中,log级别设为INFO,那么DEBUG,VERBOSE级别的log就不会输出。

4.        每个log级别的含义

a)        ERROR级别的log适合加在发生重大的Exception,导致程序不能正常运行

b)        WARN级别的log适合加在虽然发生一些Exception,但是程序还可以继续运行

c)        INFO级别的log适合于告诉外界程序运行阶段的重要的运行过程信息

d)        DEBUG级别的log用于在调试过程中提供丰富的信息

e)        VERBOSE级别的log一般用于会大量出现的log,比如说几个毫秒就会被执行的语句,如打印“心跳”信息。


如下的代码对android.util.Log进行简单封装,在每个log输出中增加了类名,函数名,行号信息

package util;

public class Log {

    private static final String CLASS_FORMAT = "[%50s]";
    private static final String SIMPLE_CLASS_FORMAT = "[%25s ";
    private static final String LINE_FORMAT = "%4s# ";
    private static final String METHOD_FORMAT = "%20s]";

    public static void v(String message) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        android.util.Log.v(getTAG(stacks, message),
                "[V]" + getMessage(stacks, message));
    }

    public static void i(String message) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        android.util.Log.i(getTAG(stacks, message),
                "[I]" + getMessage(stacks, message));
    }

    public static void d(String message) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        android.util.Log.d(getTAG(stacks, message),
                "[D]" + getMessage(stacks, message));
    }

    public static void w(String message) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        android.util.Log.w(getTAG(stacks, message),
                "[W]" + getMessage(stacks, message));
    }

    public static void e(String message) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        android.util.Log.e(getTAG(stacks, message),
                "[E]" + getMessage(stacks, message));
    }

    private static String getTAG(StackTraceElement[] stacks, String message) {
        if (stacks != null && stacks.length >= 2) {
            return String.format(CLASS_FORMAT, stacks[1].getClassName());
        } else {
            return "";
        }
    }

    private static String getMessage(StackTraceElement[] stacks, String message) {
        if (stacks != null && stacks.length >= 2) {
            StackTraceElement stack = stacks[1];
            String className = stack.getClassName();
            String simpleName = null;
            int dollarIndex = className.lastIndexOf('$');
            if (dollarIndex != -1) {
                simpleName = className
                        .substring(className.lastIndexOf('$') + 1);
            } else {
                simpleName = className
                        .substring(className.lastIndexOf('.') + 1);
            }
            return String.format(SIMPLE_CLASS_FORMAT, simpleName)
                    + String.format(LINE_FORMAT, stack.getLineNumber())
                    + String.format(METHOD_FORMAT, stack.getMethodName()) + " "
                    + message;
        } else {
            return message;
        }
    }
}

输出的log类似如下格式

[D][          TestAAAABBBBBBB   89#   notifyXXXXXXXXXXXX] enter
[I][          TestAAAABBBBBBB  103#   notifyXXXXXXXXXXXX] begin to open conntection
[D][          TestAAAABBBBBBB   37#                  run] enter
[D][          TestAAAABBBBBBB   62#                  run] leave
[D][          TestAAAABBBBBBB  162#   notifyXXXXXXXXXXXX] leave



提炼以下会议内容中的技术要点,并生成框架性学习路径: 知道吧?这里面一一个单位是要有讲究的,这个升级预算是L所以对于我们来讲,这个战略跟你刚才说的一定很难看。这是格式分了两类,一个空气声,一个是撞击声。 我们难就在难在哪里撞击声好吧,但是空气质量跟专业生有个什么,就是刚才讲的生固耦合,实际上我们你看我说的话,实际上这里好多东西都在这么多年没感觉而已,明白吗?所以反过来过东西震动了,它也会产生声音这一个耦合。技术。所以说这里面有两个,所以任何一个声音出来有一个空气声还是还有一个故事是这两个区别。 而我们讲的专题就是说这个东西悄悄,比如敲桌子,对不对?敲桌子,这桌子是一个震动的。所以我们所谓的撞击声什么意思呢?我们这个老板敲敲他的时候往下滑,这叫固体,能理解吗?所谓的空气声,那就我这个发音发声音,有空气声,然后就传可以传递。然后通过这个是到达底下,所以这个楼板变成什么,是不是隔层材料。 所以这两个区别是很明显的,一个是结构是固体声,一个叫空气,一句话,这两个是从哪里来的?就生源的性质来判断的。 好吧,所以这里面,所以这个声音就是说这是不是现在在空气中产生的,这个是一个撞击的,你理解了。所以这里面两个是不太一样的。 我们国家现在已经用了这两个标准来做好吧,自己得分量也有个这个数值了,也是一个基层的基层格式量,基层格式量就是说它的格式系数是要跟标准曲线,这个是这条标准曲线,然后一一那个标准就最接近。有个有有个原则,这个原则你们不一定要算。以前我们我们考试,我们我读大学的期末考试就考这玩意,天天给你一个数字。 然后你看那个寄存数是多少的,那你填那你计算烦死了,你知道吗?我们,然后他那边那个屏幕都不好,为什么呢?他只给个数,所以我们自己要描描完以后再去对一。他这个就相当于描述来,然后再移,比如这个也在这里,对不对? 那我就把它移到这个位置,最合理的位置,就是明白了,反正继承格式化你们技术团队是要跟着什么这个标准曲线进行寄存的,我这个发音不好,应该是唇蜜的声音。好吧,这是格式链,那那你们就行了。好吧,这个透射系数就是可测量,所以可测量是不是你像昨天那个讲法一样的,什么叫格式链? 就现在这个位置对不对?这个整个格式是多少,所以整体格式量是一个,所以格式量真正格式量是格式性能上系统,还有主要是这个计算机还不对,应该说格式化技能再上消能能力就消耗的能量,对不对?我在吸收,一个是隔开,不让它传输给第二个还是把它能量吸收掉,转化成热能的能力。是这样。 但是我们不管那个就等于这个更新比较就透彻了,好不好?从理想增透射能,是不是总量就等于入射能量是吧?这个理想模型,这是理想模型。知道为什么这段时间不理解吗?你们知道为什么?也就是说保管这个透射能力。为什么这里明白了,这里面是消耗能量,所以他这个时间是不可能。好吧,如果是保管时间也不等,一审法院不等。
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值