xutils3有个很实用的日志输出功能,可以具体到某一行。
使用了反射(用类加载的发过获取到类的内容,如属性和方法)进行实现

 private static String generateTag() {
StackTraceElement caller = new Throwable().getStackTrace()[2];
String tag = "%s.%s(L:%d)";
String callerClazzName = caller.getClassName();
callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
tag = String.format(tag, callerClazzName, caller.getMethodName(), caller.getLineNumber());
tag = TextUtils.isEmpty(customTagPrefix) ? tag : customTagPrefix + ":" + tag;
return tag;
}
/**
* Log工具,类似android.util.Log。
* tag自动产生,格式: customTagPrefix:className.methodName(L:lineNumber),
* customTagPrefix为空时只输出:className.methodName(L:lineNumber)。
* Author: wy
* Date: 18-3-06
* Time: 下午17:26
*/
public class LogUtil {
public static String customTagPrefix = "wy_log";
private static final boolean isDebug=true;

private LogUtil() {
}

private static String generateTag() {
StackTraceElement caller = new Throwable().getStackTrace()[2];
String tag = "%s.%s(L:%d)";
String callerClazzName = caller.getClassName();
callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
tag = String.format(tag, callerClazzName, caller.getMethodName(), caller.getLineNumber());
tag = TextUtils.isEmpty(customTagPrefix) ? tag : customTagPrefix + ":" + tag;
return tag;
}

public static void d(String content) {
if (!isDebug) return;
String tag = generateTag();

Log.d(tag, content);
}

public static void d(String content, Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.d(tag, content, tr);
}

public static void e(String content) {
if (!isDebug) return;
String tag = generateTag();

Log.e(tag, content);
}

public static void e(String content, Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.e(tag, content, tr);
}

public static void i(String content) {
if (!isDebug) return;
String tag = generateTag();

Log.i(tag, content);
}

public static void i(String content, Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.i(tag, content, tr);
}

public static void v(String content) {
if (!isDebug) return;
String tag = generateTag();

Log.v(tag, content);
}

public static void v(String content, Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.v(tag, content, tr);
}

public static void w(String content) {
if (!isDebug) return;
String tag = generateTag();

Log.w(tag, content);
}

public static void w(String content, Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.w(tag, content, tr);
}

public static void w(Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.w(tag, tr);
}


public static void wtf(String content) {
if (!isDebug) return;
String tag = generateTag();

Log.wtf(tag, content);
}

public static void wtf(String content, Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.wtf(tag, content, tr);
}

public static void wtf(Throwable tr) {
if (!isDebug) return;
String tag = generateTag();

Log.wtf(tag, tr);
}

}