【问题标题】:Retrofit -> Log to file改造 -> 记录到文件
【发布时间】:2014-11-18 17:11:54
【问题描述】:

我正在使用自定义记录器来记录Logcat 和文件(启用文件时)。

这在接收来自测试人员的错误报告时确实很有帮助(因为我在应用程序内还有一个按钮可以发送附带日志的错误报告)。

问题:我正在使用RetroFit,但我还没有如何拦截它的日志并将它们也发送到文件,如果可能的话,使用我自己的自定义记录器。

有可能吗?

【问题讨论】:

    标签: android logging retrofit


    【解决方案1】:

    在改造 2 中:

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    ...
    HttpLoggingInterceptor.Logger fileLogger = new HttpLoggingInterceptor.Logger() {
        @Override
        public void log(String s) {
            writeToFile(s);
        }
    }
    Interceptor fileLoggerInterceptor = new HttpLoggingInterceptor(fileLogger);
    builder.addInterceptor(fileLoggerInterceptor);
    ....
    

    writeToFile 是您实际写入文件系统的位置

    例如:

    try {
        FileOutputStream outputStream = mContext.openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
        outputStream.write(data.getBytes());
        outputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • 这个实现对我帮助很大。非常感谢你。
    • 这个答案让我很头疼! Retorfit2/OkHttp 正在写入 catalina.out...
    【解决方案2】:

    您可以在构建时将 Logger 添加到 RestAdapter

    new RestAdapter.Builder()
    ... other methods
    .setLogLevel(RestAdapter.LogLevel.FULL)
    .setLog(new RestAdapter.Log() {
            @Override
            public void log(String message) {
               // code for storing logs in file
            }
        })
    .build();
    

    您应该将日志级别调整为适合您的级别

    【讨论】:

      【解决方案3】:

      以 OkHttp Logger Interceptor (https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor) 为起点是有意义的。然后将所有输出重定向到文件。因此,您将获得带有 url、标题、内容的漂亮日志。

      【讨论】:

        【解决方案4】:
           val logging = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
                    override fun log(message: String) {
                        LogUtils.d(TAG, message) //my logger which save logs into file
                    }
                }
                )
                logging.level = HttpLoggingInterceptor.Level.BODY
        
                val okHttpClient: OkHttpClient = OkHttpClient.Builder()
                    .addInterceptor(logging)
                    .build()
        

        它对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-27
          • 2011-08-09
          • 2017-09-25
          • 1970-01-01
          • 1970-01-01
          • 2012-09-21
          相关资源
          最近更新 更多