public class LogUtils {
private final static String APP_TAG = "appName";
public static void v(String msg) {
if (Constant.IS_PRINT_LOG) {
Log.v(APP_TAG, getMsgFormat(msg));
}
}
public static void v(String tag, String msg) {
if (Constant.IS_PRINT_LOG) {
Log.v(tag, getMsgFormat(msg));
}
}
public static void d(String msg) {
if (Constant.IS_PRINT_LOG) {
Log.d(APP_TAG, getMsgFormat(msg));
}
}
public static void d(String tag, String msg) {
if (Constant.IS_PRINT_LOG) {
Log.d(tag, getMsgFormat(msg));
}
}
public static void i(String msg) {
if (Constant.IS_PRINT_LOG) {
Log.i(APP_TAG, getMsgFormat(msg));
}
}
public static void i(String tag, String msg) {
if (Constant.IS_PRINT_LOG) {
Log.i(tag, getMsgFormat(msg));
}
}
public static void w(String msg) {
if (Constant.IS_PRINT_LOG) {
Log.w(APP_TAG, getMsgFormat(msg));
}
}
public static void w(String tag, String msg) {
if (Constant.IS_PRINT_LOG) {
Log.w(tag, getMsgFormat(msg));
}
}
public static void e(String msg) {
if (Constant.IS_PRINT_LOG) {
Log.e(APP_TAG, getMsgFormat(msg));
}
}
public static void e(String tag, String msg) {
if (Constant.IS_PRINT_LOG) {
Log.e(tag, getMsgFormat(msg));
}
}
public static void e(String tag, String msg, Throwable e) {
if (Constant.IS_PRINT_LOG) {
Log.e(tag, getMsgFormat(msg), e);
}
}
public static void e(String msg, Throwable e) {
if (Constant.IS_PRINT_LOG) {
Log.e(APP_TAG, getMsgFormat(msg), e);
}
}
private static String getMsgFormat(String msg) {
return getFunctionName() + " : " + msg;
}
/**
* 格式 Thread:线程名 类名.方法名
*
* @return
*/
private static String getFunctionName() {
StackTraceElement[] sts = Thread.currentThread().getStackTrace();
if (sts != null) {
int index = -1;
String className = "";
for (StackTraceElement st : sts) {
if (st.isNativeMethod()) {
continue;
}
if (st.getClassName().equals(Thread.class.getName())) {
continue;
}
if (st.getClassName().equals(LogUtils.class.getName())) {
continue;
}
//com.aa.bb.类名->类名
if ((index = st.getClassName().lastIndexOf(".")) != -1) {
className = st.getClassName().substring(index + 1);
}
return "Thread:" + Thread.currentThread().getName()
+ " " + className
+ "." + st.getMethodName();
}
}
return null;
}
}
通过Constant.IS_PRINT_LOG控制log的状态:
public class Constant {
public static final boolean IS_PRINT_LOG = true;//是否打印log,true为打印,false为不打印
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LogUtils.v("内容");
setContentView(R.layout.activity_main);
}
//logcat:
2020-03-23 09:45:58.788 2241-2241/com.aa.bb V/appName: Thread:main MainActivity.onCreate : 内容
StackTraceElement表示StackTrace(堆栈轨迹)中的一个元素,属性包括方法调用者的类名、方法名、文件名以及调用的行数。
获取StackTraceElement的方法有两种,均返回StackTraceElement数组
private String declaringClass; 类名
private String methodName; 方法名
private String fileName; 文件名
private int lineNumber; 行数
StackTraceElement[] sts = Thread.currentThread().getStackTrace();
StackTraceElement st = sts[0];
String className = st.getClassName();
String methodName = st.getMethodName();
String fileName = st.getFileName();
int lineNumber = st.getLineNumber();
//如果 fileName+":"lineNumber 可在log点击行数跳转到对应代码.