自定义的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("需要打印的内容");
}
}
接下来是如何判断是否是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();
}
}