Android 自定义的mylog

30 篇文章 0 订阅

自定义的MyLog

1、为什么需要自定义一个MyLogger?

以Log.d为例,可以看到需要传入两个参数,分别是tag和message。tag用来过滤其他log从而找到自己需要的那条log。

public static int d(String tag, String msg) {
    return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
}

因此在每个需要打log的类,你都需要自己创建一个tag用于过滤,如下所示。

public class MainActivity extends AppCompatActivity {

    public static final String TAG="MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG,"需要打印的内容");

    }
}

自己写demo的时候还好,只有一两个activity还不算太麻烦,如果当你在公司的activity或者各种各样的类数量一多,这样子就显得很麻烦和复杂。

此外,还不能够快速地定位这个日志在哪,如果有多个log使用的同一个tag,此时还需要自己手动地找,十分地不方便。

最后安全性的问题,如果是自己的demo倒无所谓,但是如果是企业级的app,上线以后的控制台如果能够轻松的看到打印出的log日志,无疑是十分不安全的,因此要区别是否是debug开发和上线的状态,如果是正式上线的环境,则不能够打印输出。

因此需要自定义一个Mylogger。它需要实现的功能总结为以下几点

1)不需要每次额外创建Tag。

2)能够快速地定位到这个日志的所在位置。

3)能够区别是否是debug环境。

2、具体实现

这里仅仅以log.d为例。

这里可以直接将1、2需求和在一起。

public class MyLogger {
		 private static String className;
     private static String methodName;
     private static int lineNumber;
			
		 //根据类名、所在行数、所在的方法名创建唯一的tag
     private static String createTag() {
        StringBuilder builder = new StringBuilder();
        builder.append(className)
                .append(":")
                .append(lineNumber)
                .append("<")
                .append(methodName).append(">");

        return builder.toString();
    }
		public static void d(String message) {
				getTagInfo(new Throwable().getStackTrace());
        Log.d(createTag(), message);
    }
    //获取这条log所在的类名、所在行数、所在的方法名信息
		 private static void getTagInfo(StackTraceElement[] sElements) {
        className = sElements[1].getFileName();
        methodName = sElements[1].getMethodName();
        lineNumber = sElements[1].getLineNumber();
    }

}

可以看到最终的效果图,可以看到两种调用方式的区别。

public class MainActivity extends AppCompatActivity {

    public static final String TAG="MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG,"需要打印的内容");

        MyLogger.d("需要打印的内容");
    }
}

image-20201104120006608

image-20201104120130508

接下来是如何判断是否是debug环境或者是release环境。这里可以借助BuildConfig.DEBUG,这个值在debug模式下为true,release模式下为false。

因此最终完成的代码如下所示。

public class MyLogger {
    private static String className;
    private static String methodName;
    private static int lineNumber;


    //根据类名、所在行数、所在的方法名创建唯一的tag
    private static String createTag() {
        StringBuilder builder = new StringBuilder();
        builder.append(className)
            .append(":")
            .append(lineNumber)
            .append("<")
            .append(methodName).append(">");

        return builder.toString();
    }
    public static void d(String message) {
        //如果不是debug模式,则返回
        if(!BuildConfig.DEBUG) return;
        getTagInfo(new Throwable().getStackTrace());
        Log.d(createTag(), message);
    }
    //获取这条log所在的类名、所在行数、所在的方法名信息
    private static void getTagInfo(StackTraceElement[] sElements) {
        className = sElements[1].getFileName();
        methodName = sElements[1].getMethodName();
        lineNumber = sElements[1].getLineNumber();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值