예를 들어 디버깅 할 로깅 문이 많이 있습니다.
Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");
장치 전화 에이 응용 프로그램을 배포하는 동안 로깅을 활성화 / 비활성화 할 수있는 곳에서 자세한 로깅을 해제하고 싶습니다.
답변
일반적인 방법은 이름이 loglevel 인 int를 만들고 로그 수준을 기반으로 디버그 수준을 정의하는 것입니다.
public static int LOGLEVEL = 2;
public static boolean ERROR = LOGLEVEL > 0;
public static boolean WARN = LOGLEVEL > 1;
...
public static boolean VERBOSE = LOGLEVEL > 4;
if (VERBOSE) Log.v(TAG, "Message here"); // Won't be shown
if (WARN) Log.w(TAG, "WARNING HERE"); // Still goes through
나중에 모든 디버그 출력 레벨에 대해 LOGLEVEL을 변경할 수 있습니다.
답변
Verbose는 개발 중을 제외하고는 응용 프로그램으로 컴파일해서는 안됩니다. 디버그 로그는 컴파일되지만 런타임에 제거됩니다. 오류, 경고 및 정보 로그는 항상 유지됩니다.
따라서 다른 답변에서 제안한대로 ProGuard를 사용하여 로그 상세 로깅 문을 제거하는 것이 좋습니다 .
설명서에 따르면 시스템 속성을 사용하여 개발 장치에 로깅을 구성 할 수 있습니다. 세트 속성이 log.tag.<YourTag>
되고 상기 다음 값 중 하나로 설정한다 : VERBOSE
, DEBUG
, INFO
, WARN
, ERROR
, ASSERT
, 또는 SUPPRESS
. 이에 대한 자세한 내용은 설명서를 참조하십시오.isLoggable()
방법 .
setprop
명령을 사용하여 속성을 임시로 설정할 수 있습니다 . 예를 들면 다음과 같습니다.
C:\android>adb shell setprop log.tag.MyAppTag WARN
C:\android>adb shell getprop log.tag.MyAppTag
WARN
또는 ‘/data/local.prop’파일에서 다음과 같이 지정할 수 있습니다.
log.tag.MyAppTag=WARN
최신 버전의 Android 에서는 /data/local.prop가 읽기 전용이어야합니다 . 부팅시이 파일을 읽으므로 업데이트 후 다시 시작해야합니다. 만약/data/local.prop
세계 쓰기가 가능, 그것은 가능성이 무시됩니다.
마지막으로 System.setProperty()
메소드를 사용하여 프로그래밍 방식으로 설정할 수 있습니다 .
답변
가장 쉬운 방법은 배포 전에 ProGuard 를 통해 컴파일 된 JAR을 실행 하는 것입니다.
-assumenosideeffects class android.util.Log {
public static int v(...);
}
이것은 다른 모든 ProGuard 최적화와는 별도로 바이트 코드에서 직접 자세한 로그 문장을 제거합니다.
답변
변수 경로 목록을 사용하는 래퍼 클래스를 만드는 간단한 경로를 사용했습니다.
public class Log{
public static int LEVEL = android.util.Log.WARN;
static public void d(String tag, String msgFormat, Object...args)
{
if (LEVEL<=android.util.Log.DEBUG)
{
android.util.Log.d(tag, String.format(msgFormat, args));
}
}
static public void d(String tag, Throwable t, String msgFormat, Object...args)
{
if (LEVEL<=android.util.Log.DEBUG)
{
android.util.Log.d(tag, String.format(msgFormat, args), t);
}
}
//...other level logging functions snipped
답변
더 좋은 방법은 SLF4J API + 일부 구현을 사용하는 것입니다.
Android 애플리케이션의 경우 다음을 사용할 수 있습니다.
- Android Logger 는 가볍지 만 구성하기 쉬운 SLF4J 구현입니다 (<50 Kb).
- LOGBack은 가장 강력하고 최적화 된 구현이지만 크기는 약 1Mb입니다.
- 당신의 취향에 의한 다른 것들 : slf4j-android, slf4android.
답변
사용해야합니다
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "my log message");
}
답변
proguard (@Christopher의 답변 참조)로 로깅을 제거하는 것은 쉽고 빠르지 만 파일에 디버그 로깅이 있으면 프로덕션의 스택 추적이 소스와 일치하지 않습니다.
대신, proguard가 프로덕션에만 사용된다고 가정 할 때 개발과 프로덕션에서 서로 다른 로깅 수준을 사용하는 기술이 있습니다. proguard가 지정된 클래스 이름의 이름을 바꿨는지 확인하여 프로덕션을 인식합니다 (이 예에서는 “com.foo.Bar”를 사용합니다.이를 proguard에서 이름을 바꿀 정규화 된 클래스 이름으로 바꿉니다).
이 기술은 공통 로깅을 사용합니다.
private void initLogging() {
Level level = Level.WARNING;
try {
// in production, the shrinker/obfuscator proguard will change the
// name of this class (and many others) so in development, this
// class WILL exist as named, and we will have debug level
Class.forName("com.foo.Bar");
level = Level.FINE;
} catch (Throwable t) {
// no problem, we are in production mode
}
Handler[] handlers = Logger.getLogger("").getHandlers();
for (Handler handler : handlers) {
Log.d("log init", "handler: " + handler.getClass().getName());
handler.setLevel(level);
}
}