Android开发为了统一管理调试log功能自定义了DebugLog类,并处理了超长log显示不完整的情况。
同时可以快速定位Log代码处
实现代码如下
/**
* log类
* 通过gradle配置启/禁用: buildConfigField("Boolean","DebugLogEnable","true")
*/
public class DebugLog {
public final static boolean I = BuildConfig.DebugLogEnable;
public final static boolean V = BuildConfig.DebugLogEnable;
public final static boolean D = BuildConfig.DebugLogEnable;
public final static boolean W = BuildConfig.DebugLogEnable;
public final static boolean E = BuildConfig.DebugLogEnable;
public final static boolean sourceCodeLocation = BuildConfig.DEBUG;
// 显示web api 返回内容
private final static boolean isHttpResponse = true;
public static boolean showHttpResponse() {
return BuildConfig.DebugLogEnable? isHttpResponse : false;
}
private final static boolean isHttpRequest = false;
public static boolean showHttpRequest() {
return BuildConfig.DebugLogEnable? isHttpRequest : false;
}
// default tag
public static String strBaseTag = "DebugLog";
static String className;//类名
static String methodName;//方法名
static int lineNumber;//行数
/**
* 获取文件名、方法名、所在行数
* @param sElements
*/
private static void getMethodNames(StackTraceElement[] sElements){
className = sElements[1].getFileName();
methodName = sElements[1].getMethodName();
lineNumber = sElements[1].getLineNumber();
}
private static String tagCat(String tag) {
return new StringBuilder(strBaseTag).append("[").append(tag).append("]").toString();
}
public static void i(String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (I) handleLog(level_i, strBaseTag, log);
}
public static void i(Object tag, String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (I)
handleLog(level_i, tagCat(tag.toString()), log);
}
public static void v(String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (V) handleLog(level_v, strBaseTag, log);
}
public static void v(Object tag, String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (V)
handleLog(level_v, tagCat(tag.toString()), log);
}
public static void d(String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (D) handleLog(level_d, strBaseTag, log);
}
public static void d(Object tag, String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (D)
handleLog(level_d, tagCat(tag.toString()), log);
}
public static void w(String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (W) handleLog(level_w, strBaseTag, log);
}
public static void w(Object tag, String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (W)
handleLog(level_w, tagCat(tag.toString()), log);
}
public static void e(String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (E) handleLog(level_e, strBaseTag, log);
}
public static void e(Object tag, String log) {
if(sourceCodeLocation)
{
getMethodNames(new Throwable().getStackTrace());
}
if (E)
handleLog(level_e, tagCat(tag.toString()), log);
}
private static void handleLog(int level, String tag, String msg) {
if (msg == null) return;
try {
String tagCodeSource=sourceCodeLocation?("-"+methodName+"("+className+":"+lineNumber+")"):"";
int strLength = msg.length();
int start = 0;
int LOG_MAXLENGTH = 2048;
int end = LOG_MAXLENGTH;
while (end < strLength) {
String subString = msg.substring(start, end);
switch(level)
{
case level_d:
Log.d(tag+tagCodeSource,subString);
break;
case level_e:
Log.e(tag+tagCodeSource,subString);
break;
case level_i:
Log.i(tag+tagCodeSource,subString);
break;
case level_v:
Log.v(tag+tagCodeSource,subString);
break;
case level_w:
Log.w(tag+tagCodeSource,subString);
break;
}
start = end;
end = end + LOG_MAXLENGTH;
}
String subString =msg.substring(start, strLength);
switch(level)
{
case level_d:
Log.d(tag+tagCodeSource,subString);
break;
case level_e:
Log.e(tag+tagCodeSource,subString);
break;
case level_i:
Log.i(tag+tagCodeSource,subString);
break;
case level_v:
Log.v(tag+tagCodeSource,subString);
break;
case level_w:
Log.w(tag+tagCodeSource,subString);
break;
}
}catch (Exception e)
{
e.printStackTrace();
}
}
// log level
private static final int level_i = 1;
private static final int level_v = 2;
private static final int level_d = 3;
private static final int level_w = 4;
private static final int level_e = 5;
}