如何提供2个Retrofit界面宽度不同的日志级别?
问题描述:
我的问题是关于应该打印出多少OkHttp日志。
在我的应用程序的某些屏幕上,有太多的API调用 - > logcat被淹没,所以我想限制/关闭日志,除了一次性调试如何提供2个Retrofit界面宽度不同的日志级别?
我是新来的匕首2和依赖注入,已经跟在this tutorial之后。
我有工作的下面,但我不知道是否有任何不好的做法存在或是否可以进一步改进:
(大约有20个改造API接口/在我的应用程序20个不同的端点)
@Module
public class NetModule {
private String mBaseUrl;
private final HttpLoggingInterceptor LOGGING_FULL = new HttpLoggingInterceptor().setLevel
(HttpLoggingInterceptor
.Level.BODY);
private final HttpLoggingInterceptor LOGGING_HEADERS = new HttpLoggingInterceptor().setLevel
(HttpLoggingInterceptor
.Level.HEADERS);
// Constructor needs one parameter to instantiate.
public NetModule(String baseUrl) {
this.mBaseUrl = baseUrl;
}
@Provides
@Singleton
OkHttpClient.Builder provideOkHttpClientBuilder() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//...
return builder;
}
@Provides
@Singleton
Retrofit.Builder provideRetrofitBuilder() {
return new Retrofit.Builder()
.baseUrl(mBaseUrl);
}
@Provides
@Singleton
Api1 provideApi1(OkHttpClient.Builder okHttpClientBuilder, Retrofit.Builder retrofitBuilder) {
if (BuildConfig.DEBUG || !BuildConfig.FLAVOR.equals(FLAVOUR_PRODUCTION)) {
okHttpClientBuilder.addInterceptor(LOGGING_HEADERS);
}
return retrofitBuilder.client(okHttpClientBuilder.build()).build().create(Api1.class);
}
@Provides
@Named("logging_full")
@Singleton
Api1 provideApi1FullLog(OkHttpClient.Builder okHttpClientBuilder, Retrofit.Builder retrofitBuilder) {
if (BuildConfig.DEBUG || !BuildConfig.FLAVOR.equals(FLAVOUR_PRODUCTION)) {
okHttpClientBuilder.addInterceptor(LOGGING_FULL);
}
return retrofitBuilder.client(okHttpClientBuilder.build()).build().create(Api1.class);
}
//... Repeats for Api2, Api3, ..., Api20
}
用法:
1)在大多数情况下,记录体不需要这样:
@Inject
Api1 api1;
2)。在一些情况下,需要记录体则:
@Inject
@Named("logging_full")
Api1 api2;
答
我认为这是一个过度工程的解决方案。如果在http拦截器层需要不同的行为,则不必处理Api,httpclient或其他任何其他实例。
这将是我对您的问题的第一种方法。
1)使用单一实例的API和OkHttpClient单个实例(无多匕首提供商)
2)具备调试一个拦截,并没有进行生产。这样你就避免了if(Build.DEBUG)
逻辑。
3)每个端点
interface YourApi {
@Headers("YourCustomLoggingHeader: HEADERS")
@GET("/your_path")
ReturnType yourApiMethod(ParamType p);
}
4)如果拦截注射(调试版本)添加自定义首部,然后检查在截距法报头,并相应地记录。
@Override public Response intercept(Chain chain) throws IOException {
String headerValue = chain.request().headers().get("YourCustomLoggingHeader");
if(TextUtils.isEmpty(headervalue)){
return = chain.proceed(request);
}
// TODO remove header for real request
switch(headerValue){
case "HEADERS":
//TODO log headers
break;
case "BODY":
//TODO log body
break;
}
}
这是伪代码,因为我不在IDE上。
感谢@RobertEstivill,但你也错过了点:)我不关心包含/排除HTTP头。我关心的是应该打印出多少OkHttp日志。在某些屏幕上,有太多的API调用 - > logcat被泛滥,所以我想限制/关闭日志,除了一次性调试 – ericn
Header用作per/endpoint配置。当然,您也可以将所有请求属性的日志记录行为(例如:路径)。但具有外部配置的属性是更明显的选项。如果您需要在运行时更改行为,那么您将不得不坚持HttpLogginInterceptor实例并修改它的状态,以便在调用之间表现不同 –