0. logger 사용의 장점
Flutter 프로젝트에서 로그를 효과적으로 관리하기 위해 전역적으로 Logger를 설정하고 사용하는 방법을 소개합니다. Flutter는 기본적으로 print() 함수를 사용해 디버깅할 수 있지만, 플러터 logger 라이브러리를 사용하면 다음과 같은 장점이 있습니다.
- 로그 레벨 필터링: 디버그(debug), 정보(info), 에러(error) 등 다양한 로그 레벨을 사용할 수 있습니다.
- 개발 및 프로덕션 환경 구분: kReleaseMode를 사용해 개발 환경에서는 디버그 로그를 출력하고, 프로덕션 환경에서는 로그를 차단할 수 있습니다.
- 전역 사용: 앱 전체에서 동일한 Logger 인스턴스를 사용할 수 있어 코드 중복을 줄일 수 있습니다.
1. logger 패키지 추가
flutter pub add logger
dependencies:
logger: ^2.4.0
2. 전역적으로 Logger 설정하기
프로젝트에서 전역적으로 로그를 관리하기 위해 싱글턴 패턴을 사용하여 Logger 인스턴스를 만들고, 앱 전체에서 동일한 Logger를 사용할 수 있게 설정합니다. logger.dart 파일을 만들어 다음과 같이 설정합니다.
logger.dart
import 'package:flutter/foundation.dart';
import 'package:logger/logger.dart';
class AppLogger {
static final Logger _logger = Logger(
level: kReleaseMode ? Level.nothing : Level.debug, // 프로덕션에서는 로그 차단
printer: PrettyPrinter(), // 보기 좋은 출력 형식으로 설정
);
// 간단한 로깅 메서드 노출
static void v(dynamic message) => _logger.v(message);
static void d(dynamic message) => _logger.d(message);
static void i(dynamic message) => _logger.i(message);
static void w(dynamic message) => _logger.w(message);
static void e(dynamic message) => _logger.e(message);
static void wtf(dynamic message) => _logger.wtf(message);
}
3. API 호출에서 로그 사용하기
다음은 API 호출 시 전역 Logger를 사용하는 예시입니다. 각 요청마다 상태를 기록하고, 오류 발생 시 로깅합니다.
api_service.dart
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'logger.dart'; // 글로벌 로거 사용
class ApiService {
final String baseUrl = 'https://api.example.com/v1/resource'; // 마스킹된 URL
Future<void> fetchResource({int page = 0, int size = 20}) async {
final response = await http.get(
Uri.parse('$baseUrl?page=$page&size=$size'),
headers: {'accept': '*/*'},
);
if (response.statusCode == 200) {
AppLogger.i('Resource fetched successfully');
} else {
AppLogger.e('Failed to fetch resource');
}
}
Future<void> fetchQuiz({int page = 0, int size = 20}) async {
final response = await http.get(
Uri.parse('$baseUrl?page=$page&size=$size'),
headers: {'accept': '*/*'},
);
if (response.statusCode == 200) {
AppLogger.i('Quiz fetched successfully');
} else {
AppLogger.e('Failed to load quiz');
}
}
}
4. 로그 레벨 관리와 kReleaseMode
kReleaseMode는 Flutter 프레임워크에서 제공하는 상수로, 앱이 디버그 모드인지 릴리즈 모드인지 자동으로 구분해줍니다. 이를 활용해 개발 환경에서는 모든 로그가 출력되도록 하고, 프로덕션 환경에서는 로그를 차단하는 방식으로 설정할 수 있습니다.
- 디버그 모드: kReleaseMode == false일 때, 모든 로그 레벨(Verbose, Debug, Info, Warn, Error)을 출력합니다.
- 프로덕션 모드: kReleaseMode == true일 때, 로그가 차단되도록 설정할 수 있습니다.
이러한 방식으로 로깅 레벨을 구분하면, 디버깅 중에는 자세한 로그를 남기고, 프로덕션에서는 로그를 제한할 수 있어 보안 및 성능에 유리합니다.