대부분의 사용자가 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$");
그런 다음 변수 편집을 클릭 하고 className Name 열 옆 에있는 Expression 열에 className ()을 입력 합니다.
바로 가기를 입력 할 때 지금 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()
는 또한 패키지 이름을 추가하므로 되므로 태그가 불필요하게 길어지지 않도록 제거하고 있습니다.
장점 :
- 보다 짧은
Log.d(TAG,
- int 값을 문자열로 변환 할 필요가 없습니다. 사실 입력 할 필요가 없습니다.
toString
- 삭제하는 것을 잊지 않습니다
Log.d
방법을 삭제하고 모든 로그의 위치가 빨간색으로 표시되므로 삭제하는 것을 . - 클래스 이름을 사용하므로 활동 상단에 TAG를 정의 할 필요가 없습니다.
- TAG에는
CCC
(짧고 입력하기 쉬운 문자열) 접두사가 있으므로 Android Studio의 Android 모니터에 로그 만 쉽게 나열 할 수 있습니다. 때로는 서비스 또는 다른 클래스를 동시에 실행하고 있습니다. 활동 이름만으로 검색해야하는 경우 서비스 응답을 얻은 시점과 활동에서 조치가 발생한 시점을 정확히 알 수 없습니다. CCC와 같은 접두사는 로그가 발생한 활동과 함께 시간순으로 로그를 제공하므로 도움이됩니다.
답변
this.toString()
로그에 인쇄하는 특정 클래스에 대한 고유 식별자를 가져 오는 데 사용할 수 있습니다 .