일반적으로 로그 항목에 태그를 어떻게 지정합니까? (기계적 인조 인간) 코드를 보았습니다. public class MyActivity extends Activity

대부분의 사용자가 android.util.Log를 알고 있다고 가정합니다. 모든 로깅 방법은 ‘문자열 태그’를 첫 번째 인수로 허용합니다.

제 질문은 일반적으로 애플리케이션에서 로그에 태그를 어떻게 지정합니까?
다음과 같은 하드 코드를 보았습니다.

public class MyActivity extends Activity {
    private static final String TAG = "MyActivity";
    //...
    public void method () {
        //...
        Log.d(TAG, "Some logging");
    }
}

여러 가지 이유로보기 좋지 않습니다.

  • 이 코드에는 하드 코드가 없다고 말할 수 있지만 실제로 있습니다.
  • 내 응용 프로그램은 동일한 이름을 가진 다른 패키지에 여러 클래스를 가질 수 있습니다. 따라서 로그를 읽기가 어려울 것입니다.
  • 유연하지 않습니다. 항상 개인 필드 TAG를 수업에 넣었습니다.

수업 용 TAG를 얻을 수있는 깔끔한 방법이 있나요?



답변

TAG를 사용하지만 다음과 같이 초기화합니다.

private static final String TAG = MyActivity.class.getName();

이렇게하면 코드를 리팩터링 할 때 태그도 그에 따라 변경됩니다.


답변

일반적으로 App다른 패키지에 있고 유용한 정적 메서드를 포함 하는 클래스를 만듭니다 . 방법 중 하나는 방법입니다. getTag()이렇게하면 어디서나 TAG를 얻을 수 있습니다.

App클래스는 다음과 같습니다.

편집 : br mob 코멘트에 따라 개선되었습니다 (감사합니다 :))

public class App {

    public static String getTag() {
        String tag = "";
        final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
        for (int i = 0; i < ste.length; i++) {
            if (ste[i].getMethodName().equals("getTag")) {
                tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
            }
        }
        return tag;
    }

}

그리고 그것을 사용하고 싶을 때 :

Log.i(App.getTag(), "Your message here");

getTag메서드 의 출력은 getTag쉽게 디버깅 할 수 있도록 호출자 클래스의 이름 (패키지 이름 포함) 과이 호출 된 행 번호 입니다.


답변

이동 안드로이드 스튜디오 -> 환경 설정 -> 라이브 템플릿 -> AndroidLog은 다음 선택 (문자열을 TAG) Log.d를 .

에서 템플릿 텍스트 교체

android.util.Log.d(TAG, "$METHOD_NAME$: $content$");

android.util.Log.d("$className$", "$METHOD_NAME$: $content$");

Android 메뉴 이미지

그런 다음 변수 편집을 클릭 하고 className Name 열 옆 에있는 Expression 열에 className ()을 입력 합니다.Android 메뉴 2 이미지

바로 가기를 입력 할 때 지금 logd은 둘 것이다

Log.d("CurrentClassName", "currentMethodName: ");

더 이상 TAG를 정의 할 필요가 없습니다.


답변

이 형식 (filename.java:XX) xx 줄 번호로 로그가 있으면 Yaniv 답변을 개선하고 싶습니다. 오류가있을 때 동일한 방식으로 연결되는 바로 가기를 연결할 수 있습니다.이 방법으로 문제의 줄로 직접 갈 수 있습니다. logcat을 클릭하기 만하면

다른 모든 파일에서 사용할 수 있도록 확장 응용 프로그램에 넣었습니다.

public static String getTag() {
    String tag = "";
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
    for (int i = 0; i < ste.length; i++) {
        if (ste[i].getMethodName().equals("getTag")) {
            tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
        }
    }
    return tag;
}

스크린 샷 :


답변

AndroidStudio에는 logt기본적으로 템플릿이 있습니다 ( logt단일 코드로 확장되도록 입력 하고 탭을 누를 수 있음 ). 다른 클래스의 TAG 정의를 복사하여 붙여넣고 참조하는 클래스를 변경하는 것을 잊는 것을 방지하려면 이것을 사용하는 것이 좋습니다. 템플릿은 기본적으로 다음으로 확장됩니다.

private static final String TAG = "$CLASS_NAME$"

리팩토링 후 이전 클래스 이름을 사용하지 않으려면 다음과 같이 변경할 수 있습니다.

private static final String TAG = $CLASS_NAME$.class.getSimpleName();

“변수 편집”버튼을 확인하고 CLASS_NAME변수가 className()표현식 을 사용하도록 정의되어 있고 “정의 된 경우 건너 뛰기”가 선택되어 있는지 확인하십시오.


답변

다음과 같은 정적 변수, 메서드 및 클래스 클래스를 만들었습니다. S .

다음은 로깅 방법입니다.

public static void L(Context ctx, Object s) {
    Log.d("CCC " + ctx.getClass().getName().replace(ctx.getPackageName(), ""), s.toString());
}

모든 클래스에서 다음과 같이 호출됩니다 S.L(this, whaterver_object);.getClass().getName() 는 또한 패키지 이름을 추가하므로 되므로 태그가 불필요하게 길어지지 않도록 제거하고 있습니다.

장점 :

  1. 보다 짧은 Log.d(TAG,
  2. int 값을 문자열로 변환 할 필요가 없습니다. 사실 입력 할 필요가 없습니다.toString
  3. 삭제하는 것을 잊지 않습니다 Log.d방법을 삭제하고 모든 로그의 위치가 빨간색으로 표시되므로 삭제하는 것을 .
  4. 클래스 이름을 사용하므로 활동 상단에 TAG를 정의 할 필요가 없습니다.
  5. TAG에는 CCC(짧고 입력하기 쉬운 문자열) 접두사가 있으므로 Android Studio의 Android 모니터에 로그 만 쉽게 나열 할 수 있습니다. 때로는 서비스 또는 다른 클래스를 동시에 실행하고 있습니다. 활동 이름만으로 검색해야하는 경우 서비스 응답을 얻은 시점과 활동에서 조치가 발생한 시점을 정확히 알 수 없습니다. CCC와 같은 접두사는 로그가 발생한 활동과 함께 시간순으로 로그를 제공하므로 도움이됩니다.


답변

this.toString()로그에 인쇄하는 특정 클래스에 대한 고유 식별자를 가져 오는 데 사용할 수 있습니다 .