美文网首页
android网络日志打印(记录)

android网络日志打印(记录)

作者: 懒死你算了 | 来源:发表于2018-09-20 15:22 被阅读0次

    OkHttp拦截类(继承Interceptor )

    public class OkHttpLoggerInterceptor implements Interceptor {

        //定义字符类型为UTF-8

        private static final Charset UTF8 = Charset.forName("UTF-8");

        @Override

        public Responseintercept(Chain chain)throws IOException {

            //获取请求

            Request request = chain.request();

            {

                //获取请求体

                RequestBody requestBody = request.body();

                //获取请求头

                Headers headers = request.headers();

                //判断请求体是否为空

                boolean hasRequestBody = requestBody !=null;

                //开始打印请求体日志

                LogUtil.e("┎━━━━━ request start ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

                LogUtil.e("┃" + request.url() +"  " + request.method());

                if (hasRequestBody) {

                    //请求体不为空

                    if (requestBody.contentType() !=null) {

                    //请求体格式类型不为空则打印(用来判断请求体字符类型还是咋样,不太清楚用途,自行看源码)

                        LogUtil.e("┃contentType: " + requestBody.contentType());

                    }

    if (requestBody.contentLength() != -1) {

                        //请求体长度不为-1则打印

                        LogUtil.e("┃contentLength: " + requestBody.contentLength());

                    }

    }

    for (int i =0; i < headers.size(); i++) {

                    //打印请求头

                    String name = headers.name(i);

                    if (!"Content-Type".equalsIgnoreCase(name) && !"Content-

                    Length".equalsIgnoreCase(name))

                    LogUtil.e("┃" + headers.name(i) +":" + headers.value(i));

                }

    if (!hasRequestBody) {

                    //请求体为空打印结束语

                    LogUtil.e("┖━━━━━ request end ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

                }else if (bodyEncoded(request.headers())) {

                    LogUtil.e("┖━━━━━ request end ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +" 

                    (encoded body omitted)");

                }else {

                    //打印请求体内容

                    Buffer buffer =new Buffer();

                    requestBody.writeTo(buffer);

                    MediaType contentType = requestBody.contentType();

                    String bufferString = buffer.readString(UTF8);

                    if (contentType !=null &&"json".equals(contentType.subtype())) {

                        //是json格式打印

                        LogUtil.eJson(bufferString);

                    }

                    LogUtil.e(bufferString);

                    LogUtil.e("┖━━━━━ request end ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ " + 

                    requestBody.contentLength());

                }

    }

    {

                long startNs = System.nanoTime();

                //获取响应

                Response response = chain.proceed(request);

                //获取响应时间

                long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);

                //获取响应体

                ResponseBody responseBody = response.body();

                long contentLength = responseBody.contentLength();

                //开始打印响应体日志

                LogUtil.e("┎━━━━━ response start ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

                LogUtil.e("┃" + response.request().url() +"  " + response.code() +"  " + 

                response.message() +" (" + tookMs +"ms" +"" +')');

                //获取响应头

                Headers headers = response.headers();

                for (int i =0; i < headers.size(); i++) {

                //全部打印出来

                    LogUtil.e("┃" + headers.name(i) +":" + headers.value(i));

                }

    if (!HttpHeaders.hasBody(response)) {

                    //响应体为空打印结束语

                    LogUtil.e("┖━━━━━ response end ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

                }else if (bodyEncoded(response.headers())) {

                    LogUtil.e("┖━━━━━ response end ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

                    (encoded body omitted)");

                }else {

                    //响应体只能获取一次,所以不能用string()

                    //String source = responseBody.string().trim();

                    //获取响应体资源(用source()方法获取响应体内容不会影响响应体的传输)

                    BufferedSource source = responseBody.source();

                    source.request(Long.MAX_VALUE); // Buffer the entire body.

                    Buffer buffer = source.buffer();

                    if (contentLength !=0) {

                        MediaType contentType = responseBody.contentType();

                        String bufferString = buffer.clone().readString(UTF8);

                        if (contentType !=null &&"json".equals(contentType.subtype())) {

                            //是json格式

                            LogUtil.eJson(bufferString);

                        }

                            LogUtil.e("┃" + bufferString);

                    }

                            LogUtil.e("┖━━━━━ response end ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ " 

                            + buffer.size() +"-byte body)");

                }

                            return response;

            }

    }

        /*请求头编码格式???不是很清楚用途*/

        private boolean bodyEncoded(Headers headers) {

            String contentEncoding = headers.get("Content-Encoding");

            return contentEncoding !=null && !contentEncoding.equalsIgnoreCase("identity");

        }

    }

    日志打印类

    public final class LogUtil {

    private static final boolean isDebug =true;

        private final String RAILA ="┎┖━┃";

        private static final String LEFT_TOP_RAILA ="┎";

        private static final String LEFT_BOTTOM_RAILA ="┖";

        private static final String LEFT_RAILA ="┃";

        /*正常日志*/

        public static void e(String logs) {

    if (isDebug) {

        Log.e(getRandom(), logs);

            }

    }

    /*打印有调用类的日志*/

        public static void eSuper(String logs) {

            if (isDebug) {

                StackTraceElement[] elements = Thread.currentThread().getStackTrace();

                for (int i =0; i < elements.length; i++) {

                    if (elements[i].getClassName().equals(LogUtil.class.getName())) {

    Log.e(getRandom(), LEFT_TOP_RAILA +"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

    //                    Log.e(getRandom(), LEFT_RAILA + elements[i + 1].getFileName());

                        Log.e(getRandom(), LEFT_RAILA + elements[i] +"");

                        Log.e(getRandom(), LEFT_RAILA + elements[i +1] +"");

                    }

    }

    Log.e(getRandom(), "┠━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

                Log.e(getRandom(), LEFT_RAILA + logs);

                Log.e(getRandom(), LEFT_BOTTOM_RAILA +"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

            }

    }

    /*正常日志*/

        public static void eNormal(String tag, String logs) {

    if (isDebug) {

    Log.e(tag, logs);

            }

    }

    /*打印json格式的日志*/

        public static void eJson(String logs) {

    if (isDebug) {

    Log.e(getRandom(), LEFT_RAILA + JsonFormatter.jsonFormat(logs));

            }

    }

    /*有调用类的tag*/

        private static StringgetTAG() {

    StackTraceElement[] elements = Thread.currentThread().getStackTrace();

            for (int i =0; i < elements.length; i++) {

    if (elements[i].getClassName().equals(LogUtil.class.getName())) {

    String name = elements[i +2].getFileName() +getRandom();

                    return name;

                }

    }

    return null;

        }

    /*获取一万以内的随机数*/

        private static StringgetRandom() {

    int random = (int) ((Math.random() *9 +1) *10000);

            return random +"";

        }

    }

    json打印格式父类

    public class JsonFormatter {

    static final JsonFormatterformatter =findJsonFormatter();

        public static StringjsonFormat(String logs) {

    try {

    return formatter.format(logs);

            }catch (Exception e) {

    return "";

            }

    }

    Stringformat(String logs) {

    return "";

        }

    private static JsonFormatterfindJsonFormatter() {

    JsonFormatter gsonFormatter = GsonFormatter.buildIfSupported();

            if (gsonFormatter !=null) {

    return gsonFormatter;

            }

    JsonFormatter jsonFormatter = OrgJsonFormatter.buildIfSupported();

            if (jsonFormatter !=null) {

    return jsonFormatter;

            }

    return new JsonFormatter();

        }

    }

    json打印格式子类(Gson)

    public class GsonFormatterextends JsonFormatter {

    private final GsonGSON =new GsonBuilder().setPrettyPrinting().create();

        private final JsonParserPARSER =new JsonParser();

        @Override

        Stringformat(String logs) {

    return GSON.toJson(PARSER.parse(logs));

        }

    protected static GsonFormatterbuildIfSupported(){

    try {

    Class.forName("com.google.gson.Gson");

                return new GsonFormatter();

            }catch (ClassNotFoundException e) {

    return null;

            }

    }

    }

    json打印格式子类(JSONObject)

    public class OrgJsonFormatterextends JsonFormatter {

    @Override

        Stringformat(String logs) {

    try {

    return new JSONObject(logs).toString(4);

            }catch (JSONException e) {

    return "";

            }

    }

    protected static OrgJsonFormatterbuildIfSupported() {

    try {

    Class.forName("org.json.JSONObject");

                return new OrgJsonFormatter();

            }catch (ClassNotFoundException e) {

    return null;

            }

    }

    }

    若用其他json库同上处理

    相关文章

      网友评论

          本文标题:android网络日志打印(记录)

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