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

Logcat에서 볼 수 있는 내용
- 시스템 메시지 (예: 가비지 컬렉션 발생)
- Log 클래스를 사용하여 앱에 추가한 메시지
- 앱에서 예외가 발생할 때의 스택 트레이스
Android Studio에서 Logcat 사용하기
Logcat 창 열기
- View > Tool Windows > Logcat 클릭
- 또는 도구 창 모음에서 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을 통해 커스텀 필터 생성:
- Logcat 창 우측 상단의 필터 드롭다운 클릭
- "Edit Filter Configuration" 선택
- 필터 이름, 태그, 로그 레벨 등 설정
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")
}
주의사항: 상용 앱에는 민감한 정보나 과도한 디버그 로그를 포함하지 않도록 해야 합니다.
주의사항
- 성능 영향: 과도한 로깅은 앱 성능에 영향
- 보안: 민감한 정보는 로그에 남기지 않기
- 릴리즈 빌드: 상용 앱에는 디버그 로그 포함하지 않기
- TAG 길이: 최신 Android에서는 23자 제한이 없지만 가독성을 위해 적절한 길이 유지
참고자료
'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 |