在android的java代码中自定义log

android中java代码打印的log只有从tag来区分代码是那个模块的,android中带的Log函数也无法打印log信息所在的函数名和所在的行数等信息,这样看log不是很方便,于是想向c中获取函数名和行数的宏放到java的log中,这样打印的log 一眼就能函数log所在的文件 函数名 和行数,马上就能定位到log的具体位置,而且在android中用adb 打印的log在终端上显示的都是白色,将不同的log信息添加不同的颜色,这样看log会更方便,于是我对android中的Log等函数进行了一下封装,封装后的log可以实现上述的功能。

一下是封装的代码:

public final class log {
    //当前文件名 行号 函数名
    public static String getFileLineMethod() {
    StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
    StringBuffer toStringBuffer = new StringBuffer("[").append(
    traceElement.getFileName()).append(" | ").append(
    traceElement.getLineNumber()).append(" | ").append(
    traceElement.getMethodName()).append("()").append("]");
    return toStringBuffer.toString();
    }
    // 当前文件名
    public static String _FILE_() {
    StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
    return traceElement.getFileName();
    }
 
    // 当前方法名
    public static String _FUNC_() {
    StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
    return traceElement.getMethodName();
    }
 
    // 当前行号
    public static int _LINE_() {
    StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
    return traceElement.getLineNumber();
    }
 
    // 当前时间
    public static String _TIME_() {
    Date now = new Date(0);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    return sdf.format(now);
 
    }
     
    public static void v(String msg) {
        StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
        StringBuffer toStringBuffer = new StringBuffer("[").append(
        traceElement.getFileName()).append(" | ").append(
        traceElement.getLineNumber()).append(" | ").append(
        traceElement.getMethodName()).append("()").append("]");
        String TAG = toStringBuffer.toString();
        Log.v(TAG, msg);
    }
    public static  void d(String msg) {
        StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
        StringBuffer toStringBuffer = new StringBuffer("[").append(
        traceElement.getFileName()).append(" | ").append(
        traceElement.getLineNumber()).append(" | ").append(
        traceElement.getMethodName()).append("()").append("]");
        String TAG = toStringBuffer.toString();
         
        Log.d("\033[0;34m" + TAG , msg + "\033[0m");
    }
     
    public static void i(String msg) {
        StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
        StringBuffer toStringBuffer = new StringBuffer("[").append(
        traceElement.getFileName()).append(" | ").append(
        traceElement.getLineNumber()).append(" | ").append(
        traceElement.getMethodName()).append("()").append("]");
        String TAG = toStringBuffer.toString();
        Log.i("\033[0;32m" + TAG,msg + "\033[0m");
    }
     
    public static void w(String msg) {
        StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
        StringBuffer toStringBuffer = new StringBuffer("[").append(
        traceElement.getFileName()).append(" | ").append(
        traceElement.getLineNumber()).append(" | ").append(
        traceElement.getMethodName()).append("()").append("]");
        String TAG = toStringBuffer.toString();
        Log.w("\033[0;33m" + TAG,msg + "\033[0m");
     }
 
     public static void e(String msg) {
        StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
        StringBuffer toStringBuffer = new StringBuffer("[").append(
        traceElement.getFileName()).append(" | ").append(
        traceElement.getLineNumber()).append(" | ").append(
        traceElement.getMethodName()).append("()").append("]");
        String TAG = toStringBuffer.toString();
        Log.e("\033[0;31m" + TAG,msg + "\033[0m");
     }
}

这段代码你可以自己定义到一个文件中 如log.java 放到你要开发的代码中直接调用log.d log.e等相应函数就可以了,你也可以放到frameworks层中的系统的Log.java中,只需要在Log.java里的d、e等函数里做一下上述修改,然后在调用jni函数println_native 就可以了。

c和c++中的可以用相应的宏就可以了,相对来说简单的多。c c++自定义的log函数看下篇文章。

打印的log截图:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值