android日志超长打印 无bug代码

网上是用递归写的,会导致出现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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值