美文网首页
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代码

    网上是用递归写的,会导致出现oom,我用这个while写了一个。 存在bug的递归写法 完整用法 这里用了2种截断...

  • 如何hook 结构体

    原生代码 hook 代码 日志打印

  • 如何hook block

    原生代码 hook 代码 日志打印

  • springboot日志体系---log4j2

    最近调试代码和运行代码的时候,一些日志打印的乱七八槽,根据日志很难快速定位到问题,感觉自己是为了打印日志而打印日志...

  • 在学习swift的一些笔记(一)

    -objective-c与swift打印日志的区别 objective-c中的日志打印代码: 第一行代码是打印的格...

  • Swift日志打印的正确姿势

    打印日志是程序员调试代码的无上利器,俗话说“不会打印日志的开发不是好码农”。但在发布环境中,日志打印又会影响代码性...

  • logback学习笔记(上)

    相信任何一位工程师都在代码中写过日志打印代码,也知道日志打印对项目的重要性,有人做过统计代码中的日志占到工程总代码...

  • Windows抓取Android和iOS手机上app的log

    一、Android篇 1.使用adb logcat抓取 打印简单日志:adb logcat 打印日志具有详细时间和...

  • Android 文件目录

    今天没事写了个Demo打印了下Android文件目录的资料,以备后用。demo设备:Android P 打印日志如...

  • 【日志】SLF4J讲解

    1.工作中遇到问题 工作发现之前的代码异常日志有问题,没有把异常的信息打印出来。打印日志的代码: 查看日志的时候,...

网友评论

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

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