프로그래밍/Android

Android HTTP dump log 보기 (apache http)

freemmer 2016. 8. 25. 11:06

HTTP 통신을 할때 OkHttp3나 Retrofit2와 같은 오픈 라이브러리를 많이 사용합니다.

하지만 금융권과 같은 보수적인 프로젝트에서는 오픈 라이브러리 사용을 금지하고 Apache의 httpclient의 사용을 강제하는 경우가 있습니다.

OkHttp3나 Retrofit2와 같은 경우에는 HTTP dump log를 설정하는 Interface를 제공하기 때문에 직관적으로 설정할 수 있도록 유도하는 반면에 Apache의 경우에는 그렇지 못합니다.

하지만, 방법은 항상 있죠. 그 방법을 알아보도록 하겠습니다.

Main Application의 onCreate() 혹은 MainActivity의 onCreate()와 같이 한번만 호출되는 곳에 아래 코드를 붙혀 넣습니다.

java.util.logging.Logger.getLogger("org.apache.http.wire").setLevel(java.util.logging.Level.FINEST);
java.util.logging.Logger.getLogger("org.apache.http.headers").setLevel(java.util.logging.Level.FINEST);
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "debug");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "debug");

그리고 터미널(mac, linux)이나 명령 프롬프트(windows)를 띄워 아래의 명령을 실행합니다.

(만약 adb path가 .bash_profile에 설정되어 있지 않다면 adb가 있는 폴더로 가셔서 실행하셔야 합니다)

$ adb shell setprop log.tag.org.apache.http VERBOSE
$ adb shell setprop log.tag.org.apache.http.wire VERBOSE
$ adb shell setprop log.tag.org.apache.http.headers VERBOSE
적용한 후에 별다른 log를 찍지 않아도 logcat에 이렇게 표시됩니다.



위의 코드 조작을 Class로 만들면 아래와 같습니다.
public class DebugLogConfig {
static DalvikLogHandler activeHandler;
protected static class DalvikLogHandler extends Handler {
private static final String LOG_TAG = "HttpClient";
@Override
public void close() {
// do nothing
}
@Override
public void flush() {
// do nothing
}
@Override
public void publish(LogRecord record) {
if (record.getLoggerName().startsWith("org.apache")) {
Log.d(LOG_TAG, record.getMessage());
}
}
}
public static void enable() {
try {
String config = "org.apache.http.impl.conn.level = FINEST\n"
+ "org.apache.http.impl.client.level = FINEST\n"
+ "org.apache.http.client.level = FINEST\n" + "org.apache.http.level = FINEST";
InputStream in = new ByteArrayInputStream(config.getBytes());
LogManager.getLogManager().readConfiguration(in);
} catch (IOException e) {
Log
.w(DebugLogConfig.class.getSimpleName(),
"Can't read configuration file for logging");
}
Logger rootLogger = LogManager.getLogManager().getLogger("");
activeHandler = new DalvikLogHandler();
activeHandler.setLevel(Level.ALL);
rootLogger.addHandler(activeHandler);
}
}

사용법은 위와 마찬가지로 Main Application의 onCreate()와 같이 한번만 호출되는 곳에 아래 코드를 붙혀 넣습니다.

DebugLogConfig.enable();

만약 HTTP Body는 제외한 로그를 찍기 원하시면 DebugLogConfig.enable()의 config 부분을 아래와 같이 변경하시면 됩니다.

String config = "org.apache.http.level = FINEST\n"
+ "org.apache.http.wire.level = SEVERE\n";


반응형