简书链接:android日志超长打印无bug代码 文章字数:359,阅读全文大约需要1分钟
网上是用递归写的,会导致出现oom,我用这个while写了一个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public static void debug(String TAG,String content) { int startPos = 0; int endPos = Math.min(MAX_LENGTH, content.length()); String current; // System.out.println("startPos:"+startPos+",endPos:"+endPos+",totalLen:"+content.length()+",currentlen:"); while (true) { current = content.substring(startPos, endPos); startPos = endPos; int surplusLen = content.length() -endPos;//current.length();//startPos; endPos = startPos+Math.min(MAX_LENGTH, surplusLen); System.out.println("after:" + current+",startPos:"+startPos+",endPos:"+endPos+",totalLen:"+content.length()+",currentlen:"+current.length()); System.out.println(TAG+":"+current); if(current.length()<MAX_LENGTH||endPos==current.length()||startPos==endPos){ break; } //不用递归了 } }
存在bug的递归写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /** * 分段打印较长的文本 * * @param tag 标志 * @param content 内容 */ public static void debugLarge(String tag, String content ) { if (!BuildConfig.DEBUG) { return; } if (content.length() > MAX_LENGTH) { String part = content.substring(0, MAX_LENGTH); Log.d(tag, part); part = content.substring(MAX_LENGTH, content.length()); if ((content.length() - MAX_LENGTH) > MAX_LENGTH) { int pos = 0; debugLarge(tag, part); } else { Log.d(tag, part); } } else { Log.d(tag, content); } }
完整用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class HttpLog implements HttpLoggingInterceptor.Logger { @Override public void log(String message) { if (message != null && message.length() < DebugUtil.MAX_LENGTH) { DebugUtil.debug("HttpLogInfo", message); } else { int keepLen = Math.min((DebugUtil.MAX_LENGTH/2)-30,message.length()); String start = message.substring(0, keepLen); // 取左边 keepLen个 , 再取右边 keepLen个 int indexSecond = message.length() - keepLen; if(indexSecond<keepLen){ indexSecond=Math.min(message.length(),keepLen/2);//如果index的位置到了左边,就直接把右边拿过来。 } String end = message.substring(indexSecond); int cutcount = keepLen + indexSecond;// DebugUtil.debug("HttpLogInfo", start + "|截断了中间" + cutcount + "个字符|" + end); } } }
这里用了2种截断法,如果是base64的post参数,这打印会导致大量数据,实在不行完全可以做阉割操作。 阉割操作可以保证 数据格式头部和尾部基本上完整的,除非多个base64,