에몽이

[안드로이드]개발할때만 Log 남기는 방법 - Debug Log 본문

android

[안드로이드]개발할때만 Log 남기는 방법 - Debug Log

ian_hodge 2017. 7. 11. 18:39






저는 안드로이드 개발하면서 디버깅보다는 곳곳에 로그를 남겨두고 예상되는대로 실행이되는지 확인합니다.

혹은 변수값이나 클래스등의 값을 확인하기도 합니다.










로그를 찍을때는 Log.d(TAG,로그내용) 과 같이 쓰고 계실겁니다.


Log.d("TedPark","로그 내용");

Log.i("TedPark","로그 내용");

Log.e("TedPark","에러 내용");




하지만 이렇게 남긴 로그들은 실제 배포버전으로 배포해서 플레이스토어에 배포한뒤에도 로그캣에 계속 찍히게됩니다.

제가 몇개의 앱을 받아서 Logcat을 연결해보면 해당 앱의 개발자가 남겨둔 로그들을 저도 확인할 수 있는 경우가 더러 있습니다.

다른사람이 알아도 문제없는 로그라면 상관없겠지만 특정 정보가 있거나 URL정보 등 기타 민감한 정보들을 개발자가 아닌 다른 일반사용자가 보게된다고 생각하면 마음이 편하지는 않을것입니다.



여기서 우리들이 선택할만한 방법은 3가지정도로 생각해볼수 있을것 같습니다.


1. 개발할때부터 아예 로그를 남기지 않는다.

2. 개발을 완료하고 배포버전을 만들기전 모든 로그코드를 삭제한다.

3. 개발할때만 로그를 남기고 배포버전에서는 로그가 남지않도록 코드를 작성한다.





로그가 필요없이 생각하는대로 코딩을 잘 하는 개발자분이라면 당연히 1번의 방법도 상관없겠죠...

하지만 저는 천재개발자가 아니기 때문에 무식하게 로그를 왕창 찍어두어야 합니다..

그래서 제가 택한 방법은 3번 이었습니다.




설명없이 바로 적용시켜보고싶으신분은 제가 GitHub에 만들어둔 DLog를 사용하시면 됩니다.

Dlog바로 보기







먼저, 개발버전과 배포버전일때 무엇이 바뀌는지 부터 고민했습니다.

특정 변수나 값들이 개발/배포버전에 따라서 변경된다면 해당 값을 참조해서 Flag처럼 로그를 남기거나 남기지 않는 방식의 아이디어로 접근하려고 한것입니다.

열심히 방법을생각해보다가  (구글링을 하다가)  찾아낸것이 바로 BuildConfig.DEBUG였습니다.

개발시에는 BuildConfig.DEBUG 값이 true,

배포시에는 BuildConfig.DEBUG 값이 false 로 변경된다고 합니다.


결론적으로 말씀드리자면 이 값을 100% 신뢰할수가 없었습니다.

어떠한 이유인지는 몰라도 간혹가다가 배포버전인데도 불구하고 BuildConfig.DEBUG값이 true로 되어있는 현상을 발견할수 있었습니다.

Release버전인데도 제가 찍어둔 로그들이 Logcat에 찍히는 현상이 간헐적으로 있었습니다.




그래서 확실하게 Debug모드인지 아닌지를 구분할수 있는 함수를 활용하고 이를 참조해서 로그를 남기거나 남기지 않는 방법을 사용하기로 했습니다.




Debug Log (일명 Dlog) 만드는 방법






1. Debug모드 여부를 알려주는 함수를 만듭니다



/**
* 현재 디버그모드여부를 리턴
*
* @param context
* @return
*/
private boolean isDebuggable(Context context) {
boolean debuggable = false;

PackageManager pm = context.getPackageManager();
try {
ApplicationInfo appinfo = pm.getApplicationInfo(context.getPackageName(), 0);
debuggable = (0 != (appinfo.flags & ApplicationInfo.FLAG_DEBUGGABLE));
} catch (NameNotFoundException e) {
/* debuggable variable will remain false */
}

return debuggable;
}









2. Application클래스의 onCreate()에서 해당 함수를 실행해서 DEBUG라는 변수에 저장을 해둡니다


// 디버그모드에 따라서 로그를 남기거나 남기지 않는다
this.DEBUG = isDebuggable(this);









3. Application의 DEBUG값에 따라서 로그를 남기거나 남기지 않도록 하는 Dlog 클래스를 만들어 줍니다.




public class Dlog {
static final String TAG = "TedPark";
/** Log Level Error **/
public static final void e(String message) {
if (BaseApplication.DEBUG)Log.e(TAG, buildLogMsg(message));
}
/** Log Level Warning **/
public static final void w(String message) {
if (BaseApplication.DEBUG)Log.w(TAG, buildLogMsg(message));
}
/** Log Level Information **/
public static final void i(String message) {
if (BaseApplication.DEBUG)Log.i(TAG, buildLogMsg(message));
}
/** Log Level Debug **/
public static final void d(String message) {
if (BaseApplication.DEBUG)Log.d(TAG, buildLogMsg(message));
}
/** Log Level Verbose **/
public static final void v(String message) {
if (BaseApplication.DEBUG)Log.v(TAG, buildLogMsg(message));
}
public static String buildLogMsg(String message) {
StackTraceElement ste = Thread.currentThread().getStackTrace()[4];
StringBuilder sb = new StringBuilder();
sb.append("[");
sb.append(ste.getFileName().replace(".java", ""));
sb.append("::");
sb.append(ste.getMethodName());
sb.append("]");
sb.append(message);
return sb.toString();
}
}
view rawDlog.java hosted with ❤ by GitHub



Dlog에는 DEBUG여부에 따라 로그를 남기는 외에도 로그를 찍는 위치의 파일이름,함수이름을 기본적으로 찍어주는 기능을 포함하고 있습니다.

사용할때 단순히 '"만 찍어주더라도 어느 파일의 어느 함수에서 남겨진 코드인지 알수 있어서 매우 유용합니다.





실제 사용은 아래와 같이 하시면 됩니다.



Dlog.d("로그 내용");
Dlog.e("에러");
Dlog.i("로그 로그");





또한 Logcat에는 아래와 같이 로그가 남겨질것입니다.







간결하게 정리되어있는걸 확인해보고 싶으시다면 제 Github에 정리되어있는 Dlog소개를 확인해보셔도 좋습니다.



출처: http://gun0912.tistory.com/12 [박상권의 삽질블로그]

'android' 카테고리의 다른 글

Floating Button With animation  (0) 2017.08.24
ContentProvider, ContentResolver  (0) 2017.08.24
fcm  (0) 2017.06.30
채팅 라이브러리  (0) 2017.06.30
How to fix: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found  (0) 2017.06.30
Comments