改造-Log4j

Retrofit - Log4j

我在 java 应用程序中使用 Retrofit 来访问 api-rest。

我使用的是简单代码:

RestAdapter.Builder().setEndpoint(uri).setLogLevel(RestAdapter.LogLevel.HEADES_AND_ARGS).setConverter(new GsonConverter(gson)).setClient(httpClient).build();

是否可以将改装日志映射到 log4j?

RestAdapter.Builder 有方法 setLog(Log) 获取 RestAdapter.Log 接口作为参数。此界面如下所示:

 /** Simple logging abstraction for debug messages. */
  public interface Log {
    /** Log a debug message to the appropriate console. */
    void log(String message);
  }

您可以将 LogLevel 设置为 f.e。 FULL 并创建 class 包装 log4j 并实现 Log 接口并在 log(String) 方法中记录您的日志,但您将获得所有日志作为字符串。无法查看是从哪个级别来的日志。

包装示例

public class ExampleLog4J implements RestAdapter.Log {
    private static final Logger logger = logger.getLogger(ExampleLogger.class)
    ExampleLog4J(){
    }
    @Override
    public void log(String message) {
        log.info("Retrofit# "+message);
    }
}

并且在创建 RestAdapter 的地方使用:

new RestAdapter.Builder().setLog(new ExampleLog4J()).

您可以执行如下操作:

new RestAdapter.Builder()
    .setLogLevel(LOGGER.isDebugEnabled() ? retrofit.LogLevel.FULL : retrofit.LogLevel.BASIC)
    .setLog(LOGGER.isDebugEnabled() ? LOGGER::debug : LOGGER::info)

retrofit.LogLevel 用于指定您需要从 Retrofit 获得多少详细的日志记录。

retrofit.RestAdapter.Log 的实现被传递给 RestAdaptersetLog()RestAdapter 在这种情况下将其所有内部日志记录委托给 log4j Logger。

这里 LOGGER 是你要像下面这样初始化的东西

private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(SomeClass.class);

LOGGER::debug in Java 8 等同于下面匿名的 class

 new retrofit.RestAdapter.Log() {
      @Override
      public void log(String message) {
          LOGGER.debug(message);
      }
 }

你也可以使用okhttp的日志,beta2版retrofit中引入的即将上线的2.6.0版本的快照目前运行良好,你可以在本指南中看到如何实现它https://futurestud.io/blog/retrofit-2-log-requests-and-responses/ 非常易于使用和实施。