[Android] Android Studio Logcat과 로그 레벨

2025. 8. 18. 23:04·CS 기초부터 한 걸음씩

Logcat이란?

Logcat은 기기에서 오류가 발생할 때 시스템 메시지 로그(스택 트레이스 등)를 덤프하고 앱에서 Log 클래스를 사용하여 작성한 메시지를 전송하는 명령줄 도구입니다.

발생한 로그캣(Logcat) 화면 예시

Logcat에서 볼 수 있는 내용

  • 시스템 메시지 (예: 가비지 컬렉션 발생)
  • Log 클래스를 사용하여 앱에 추가한 메시지
  • 앱에서 예외가 발생할 때의 스택 트레이스

Android Studio에서 Logcat 사용하기

Logcat 창 열기

  1. View > Tool Windows > Logcat 클릭
  2. 또는 도구 창 모음에서 Logcat 클릭

Logcat 주요 기능

  • Clear logcat: 표시된 로그 삭제
  • Pause: 로그 스트림 일시정지/재개
  • Restart: 로그 삭제 후 Logcat 재시작 (이전 로그 복구 가능)
  • Scroll to the end: 로그의 맨 아래로 이동하여 최신 로그 확인
  • Soft wraps: 줄바꿈 사용 및 가로 스크롤 방지

로그 메시지 형식

로그 메시지 형식: 날짜 시간 PID-TID 태그 패키지명 로그레벨 메시지

예시: 2025-08-18 23:00:18.872 19999-19999 ViewRootImpl com.test.test D MSG_WINDOW_FOCUS_CHANGED 1

  • 날짜 시간: 로그가 발생한 시각
  • PID-TID: 프로세스 ID - 스레드 ID
  • 태그: 메시지가 발생한 구성요소를 나타내는 문자열 (예: ViewRootImpl)
  • 패키지명: 앱의 패키지명 (예: com.week1.boostclock)
  • 로그레벨: V, D, I, W, E 중 하나
  • 메시지: 실제 로그 내용

로그 레벨 (Log Levels)

5가지 로그 레벨

우선순위 순서 (높음 → 낮음): ERROR > WARN > INFO > DEBUG > VERBOSE

 

  • 높은 우선순위: 심각도가 높고 반드시 확인해야 하는 로그 (ERROR)
  • 낮은 우선순위: 개발 중에만 필요한 상세한 로그 (VERBOSE)

 

1. Log.e() - Error (에러)

Log.e("MainActivity", "심각한 오류가 발생했습니다")
  • 용도: 오류를 일으킨 문제
  • 언제 사용: Exception 발생, 앱 크래시 등 심각한 오류

2. Log.w() - Warning (경고)

Log.w("MainActivity", "경고: 메모리 사용량이 높습니다")
  • 용도: 아직 오류는 아니지만 발생할 수 있는 문제
  • 언제 사용: 잠재적 문제, 권장사항 위반

3. Log.i() - Info (정보)

Log.i("MainActivity", "사용자가 로그인했습니다")
  • 용도: 일반적인 사용을 위해 예상할 수 있는 로그 메시지
  • 언제 사용: 앱의 주요 흐름, 사용자 액션 기록

4. Log.d() - Debug (디버그)

Log.d("MainActivity", "onCreate 호출됨")
  • 용도: 개발 단계에서만 유용한 디버그 로그 메시지
  • 언제 사용: 개발 중 변수값 확인, 메서드 호출 추적

5. Log.v() - Verbose (상세)

Log.v("MainActivity", "상세한 실행 정보")
  • 용도: 가장 상세한 로그 메시지
  • 언제 사용: 매우 세부적인 디버깅 정보

Log 클래스 사용법

기본 사용법

class MainActivity : AppCompatActivity() {

    // TAG 상수 정의 (권장사항)
    private val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate 시작")

        setContentView(R.layout.activity_main)
        Log.i(TAG, "레이아웃 설정 완료")

        try {
            // 어떤 작업 수행
            val result = performSomeOperation()
            Log.d(TAG, "작업 결과: $result")
        } catch (e: Exception) {
            Log.e(TAG, "작업 중 오류 발생", e)
        }

        Log.d(TAG, "onCreate 완료")
    }

    private fun performSomeOperation(): String {
        Log.v(TAG, "performSomeOperation 시작")
        // 작업 수행
        return "성공"
    }
}

TAG 사용 권장사항

TAG 상수 정의:

// Java
private static final String TAG = "MyActivity";

// Kotlin  
private const val TAG = "MyActivity"
// 또는 클래스 내부
private val TAG = "MyActivity"
// private val tag = this::class.java.simpleName // %sLog".format(this::class.java.simpleName)
  • 로그 태그는 보통 하드코딩된 문자열 리터럴이므로 const val을 사용하는 것이 더 적합하고 효율적입니다.
    인라인처리로 런타임 오버헤드를 줄일 수 있기 때문입니다.
  • class 내부에선 const를 사용하려면 companion object 사용 필요

주의사항: TAG 문자열이 23자를 넘는 경우 Logcat에서 잘려서 표시됩니다.

너무 긴 TAG는 가독성을 해치므로 적절한 길이로 유지하는 것이 좋습니다.

또한 100자까지는 잘려도 보이지만, 간혹 200자 이상의 태그를 logcat에서도 보이지 않을 수 있습니다.

예외와 함께 로그 남기기

try {
    // 위험한 작업
} catch (e: Exception) {
    Log.e(TAG, "작업 실패", e)  // 예외 정보도 함께 출력
}

Logcat 필터링

로그 레벨 필터링

Logcat 창에서 로그 레벨을 선택하여 필터링: ex level:debug

  • Verbose: 모든 로그 메시지 표시 (기본값)
  • Debug: Debug 레벨 이상 메시지 표시
  • Info: Info 레벨 이상 메시지 표시
  • Warn: Warning 레벨 이상 메시지 표시
  • Error: Error 레벨 메시지만 표시

태그별 필터링

쿼리 필드에서 키-값 검색:

  • tag:MainActivity - 특정 태그만 표시
  • package:com.example.myapp - 특정 패키지만 표시
  • process:main - 특정 프로세스만 표시
  • level:error - 특정 레벨 이상 표시

커스텀 필터 생성

Edit Filter Configuration을 통해 커스텀 필터 생성:

  1. Logcat 창 우측 상단의 필터 드롭다운 클릭
  2. "Edit Filter Configuration" 선택
  3. 필터 이름, 태그, 로그 레벨 등 설정

Gradle에서 로그 레벨 제어

ProGuard 설정으로 릴리즈 빌드에서 로그 제거

build.gradle 설정:

// build.gradle에서 로그 레벨 제어
buildTypes {
    release {
        // INFO 레벨 이하 로그 제거
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
    }
}

proguard-rules.pro 파일에 추가:

# 릴리즈 빌드에서 모든 Log 문 제거
-assumenosideeffects class android.util.Log {
    public static int d(...);
    public static int i(...);
    public static int w(...);
    public static int e(...);
    public static int v(...);
}

*참고 : 웹 html 과 달리 UI XML 파일에 작성한 주석(``)은 앱이 컴파일되는 과정에서 모두 제거 되니 주석은 신경쓸 필요없음

BuildConfig를 사용한 조건부 로깅

if (BuildConfig.DEBUG) {
    Log.d(TAG, "디버그 정보: $debugInfo")
}

주의사항: 상용 앱에는 민감한 정보나 과도한 디버그 로그를 포함하지 않도록 해야 합니다.

주의사항

  1. 성능 영향: 과도한 로깅은 앱 성능에 영향
  2. 보안: 민감한 정보는 로그에 남기지 않기
  3. 릴리즈 빌드: 상용 앱에는 디버그 로그 포함하지 않기
  4. TAG 길이: 최신 Android에서는 23자 제한이 없지만 가독성을 위해 적절한 길이 유지

참고자료

  • Android Developers - Logcat을 이용한 로그 작성 및 보기
  • Android Developers - Logcat 명령줄 도구
  • Android Developers - Log 클래스

'CS 기초부터 한 걸음씩' 카테고리의 다른 글

[Android] XML 레이아웃과 View 기본 개념  (0) 2025.08.20
[Android] 안드로이드 앱 구조 정리  (1) 2025.08.19
[Android] Activity와 Activity Lifecycle 기초 개념  (5) 2025.08.18
word2vec 이란? - 분포 가설부터 학습 알고리즘까지  (4) 2025.08.04
벡터 임베딩 - 비정형 데이터를 수치로 표현하는 방법  (3) 2025.08.04
'CS 기초부터 한 걸음씩' 카테고리의 다른 글
  • [Android] XML 레이아웃과 View 기본 개념
  • [Android] 안드로이드 앱 구조 정리
  • [Android] Activity와 Activity Lifecycle 기초 개념
  • word2vec 이란? - 분포 가설부터 학습 알고리즘까지
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    백준
    프로그래머스
    boostcamp
    java
    알고리즘고득점kit
    문법정리
    시뮬레이션
    Level2
    greedy
    코테
    Kotlin
    Level3
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[Android] Android Studio Logcat과 로그 레벨
상단으로

티스토리툴바