美文网首页
android日志超长打印 无bug代码

android日志超长打印 无bug代码

作者: 吉凶以情迁 | 来源:发表于2021-12-17 15:37 被阅读0次

    网上是用递归写的,会导致出现oom,我用这个while写了一个。

    
     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的递归写法

    
    
    
        /**
         * 分段打印较长的文本
         *
         * @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);
            }
        }
    
    

    完整用法

    
    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,


    image.png

    相关文章

      网友评论

          本文标题:android日志超长打印 无bug代码

          本文链接:https://www.haomeiwen.com/subject/amuifrtx.html