美文网首页Android 学习Android专题Android控件使用篇
开源框架Logger & HttpLogger打造你的炫酷Log

开源框架Logger & HttpLogger打造你的炫酷Log

作者: 千夜零一 | 来源:发表于2020-11-06 16:22 被阅读0次

    引言

      使用AndroidStudio打印Log的时候很不好分辨怎么办,今天就来分享一下我常用的Logger框架,让你的Logcat清爽起来,所有的接口json数据格式化展现,妈妈再也不用担心我看Logcat看到头晕眼花了!
      本期就来带大家手把手实现炫酷的Log打印,我的代码我做主!还等什么呢?赶快@你的小伙伴一起学习吧~


    介绍

    • HttpLogger打印你的OkHttp网络请求信息!
    • Logger定义你的Logcat炫酷样式!
    • JsonUtil工具类格式化你的json串,搞定缩进+换行!!!

    效果预览


    用法

    第一步:添加依赖

    //炫酷Logger
    implementation 'com.orhanobut:logger:2.1.1'
    //okhttp网络日志拦截器
    implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0'
    

    第二步:初始化

    /**
     * @data on 2020/10/9 11:09 AM
     * @auther armStrong
     * @describe 自定义Application
     */
    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            //自定义炫酷Logger
            FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                    .showThreadInfo(true)// (Optional) Whether to show thread info or not. Default true
                    .methodCount(5)         // (Optional) How many method line to show. Default 2
                    .methodOffset(7)        // (Optional) Hides internal method calls up to offset. Default 5
                    .tag("My custom tag")   // (Optional) Global tag for every log. Default PRETTY_LOGGER
                    .build();
            Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));  // 初始化Logger
        }
    }
    

    第三步:配置文件中指定Application

    <manifest>
        <application
            ……
        android:name=".application.MyApplication"   //application为pakage名,.表明com.mydemo.xxx
        ……>
      </application>
    </manifest>
    

    第四步:在你的Retrofit+Okhttp打造网络请求框架中设置网络拦截器

    OkHttpClient.Builder builder = getDefaultBuilder();
    builder.addInterceptor(new HttpLoggingInterceptor(new HttpLogger()).setLevel(HttpLoggingInterceptor.Level.BODY));
    

    第五步:创建Http网络拦截日志打印器的实现类

    /**
     * @data on 2020/11/6 9:27 AM
     * @auther armStrong
     * @describe OkHttp网络日志拦截器实现类
     */
    public class HttpLogger implements HttpLoggingInterceptor.Logger {
        private StringBuilder mMessage = new StringBuilder();
    
        @Override
        public void log(String message) {
            // 请求或者响应开始
            if (message.startsWith("--> POST")) {
                mMessage.setLength(0);
            }
            // 以{}或者[]形式的说明是响应结果的json数据,需要进行格式化
            if ((message.startsWith("{") && message.endsWith("}"))
                    || (message.startsWith("[") && message.endsWith("]"))) {
                message = JsonUtil.formatJson(JsonUtil.decodeUnicode(message));
            }
            mMessage.append(message.concat("\n"));
            // 响应结束,打印整条日志
            if (message.startsWith("<-- END HTTP")) {
                Logger.d(mMessage.toString());
            }
        }
    }
    

    第六步:创建JsonUtil工具类,格式化json

    /**
     * @data on 2020/11/6 9:30 AM
     * @auther armStrong
     * @describe 将无序的json串处理成格式化的json
     */
    public class JsonUtil {
        /**
         * 格式化json字符串
         *
         * @param jsonStr 需要格式化的json串
         * @return 格式化后的json串
         */
    
        public static String formatJson(String jsonStr) {
            if (null == jsonStr || "".equals(jsonStr)) return "";
            StringBuilder sb = new StringBuilder();
            char last = '\0';
            char current = '\0';
            int indent = 0;
            for (int i = 0; i < jsonStr.length(); i++) {
                last = current;
                current = jsonStr.charAt(i);
                //遇到{ [换行,且下一行缩进
                switch (current) {
                    case '{':
                    case '[':
                        sb.append(current);
                        sb.append('\n');
                        indent++;
                        addIndentBlank(sb, indent);
                        break;
                    //遇到} ]换行,当前行缩进
                    case '}':
                    case ']':
                        sb.append('\n');
                        indent--;
                        addIndentBlank(sb, indent);
                        sb.append(current);
                        break;
                    //遇到,换行
                    case ',':
                        sb.append(current);
                        if (last != '\\') {
                            sb.append('\n');
                            addIndentBlank(sb, indent);
                        }
                        break;
                    default:
                        sb.append(current);
                }
            }
            return sb.toString();
        }
    
        /**
         * 添加space
         *
         * @param sb
         * @param indent
         */
        private static void addIndentBlank(StringBuilder sb, int indent) {
            for (int i = 0; i < indent; i++) {
                sb.append('\t');
            }
        }
    
    
        /**
         * http 请求数据返回 json 中中文字符为 unicode 编码转汉字转码
         *
         * @param theString
         * @return 转化后的结果.
         */
    
        public static String decodeUnicode(String theString) {
            char aChar;
            int len = theString.length();
            StringBuffer outBuffer = new StringBuffer(len);
            for (int x = 0; x < len; ) {
                aChar = theString.charAt(x++);
                if (aChar == '\\') {
                    aChar = theString.charAt(x++);
                    if (aChar == 'u') {
                        int value = 0;
                        for (int i = 0; i < 4; i++) {
                            aChar = theString.charAt(x++);
                            switch (aChar) {
                                case '0':
                                case '1':
                                case '2':
                                case '3':
                                case '4':
                                case '5':
                                case '6':
                                case '7':
                                case '8':
                                case '9':
                                    value = (value << 4) + aChar - '0';
                                    break;
                                case 'a':
                                case 'b':
                                case 'c':
                                case 'd':
                                case 'e':
                                case 'f':
                                    value = (value << 4) + 10 + aChar - 'a';
                                    break;
                                case 'A':
                                case 'B':
                                case 'C':
                                case 'D':
                                case 'E':
                                case 'F':
                                    value = (value << 4) + 10 + aChar - 'A';
                                    break;
                                default:
                                    throw new IllegalArgumentException(
                                            "Malformed   \\uxxxx   encoding.");
                            }
    
                        }
                        outBuffer.append((char) value);
                    } else {
                        if (aChar == 't')
                            aChar = '\t';
                        else if (aChar == 'r')
                            aChar = '\r';
                        else if (aChar == 'n')
                            aChar = '\n';
                        else if (aChar == 'f')
                            aChar = '\f';
                        outBuffer.append(aChar);
                    }
                } else
                    outBuffer.append(aChar);
            }
            return outBuffer.toString();
        }
    }
    

    第七步:设置你的Logcat颜色:

    AndroiStudio设置步骤
    Preference—>Editor—>ColorScheme—>AndroidLogcat中
    首先:取消Inherit values from勾选框,然后选择每个log标签的颜色,完成。

    Tips:如果你喜欢我的Logcat色系,贴出来颜色值如下:
    绿色:Debug:48BB31
    红色:Error:FF0006
    蓝色:Infor:0070BB
    白色:Verbose:BBBBBB
    黄色:Warning:BBBB23

    大功告成!

    相关文章

      网友评论

        本文标题:开源框架Logger & HttpLogger打造你的炫酷Log

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