Android에서 로그 수준을 활성화 / 비활성화하는 방법 할 로깅 문이 많이 있습니다. Log.v(TAG, “Message here”); Log.w(TAG,

예를 들어 디버깅 할 로깅 문이 많이 있습니다.

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 애플리케이션의 경우 다음을 사용할 수 있습니다.

  1. Android Logger 는 가볍지 만 구성하기 쉬운 SLF4J 구현입니다 (<50 Kb).
  2. LOGBack은 가장 강력하고 최적화 된 구현이지만 크기는 약 1Mb입니다.
  3. 당신의 취향에 의한 다른 것들 : 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);
    }
}