Flutter

Flutter에서 전역 로거(Logger) 사용하기

catchJava 2024. 10. 3. 12:11

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');
    }
  }
}

flutter logger

 

4. 로그 레벨 관리와 kReleaseMode

kReleaseMode는 Flutter 프레임워크에서 제공하는 상수로, 앱이 디버그 모드인지 릴리즈 모드인지 자동으로 구분해줍니다. 이를 활용해 개발 환경에서는 모든 로그가 출력되도록 하고, 프로덕션 환경에서는 로그를 차단하는 방식으로 설정할 수 있습니다.

  • 디버그 모드: kReleaseMode == false일 때, 모든 로그 레벨(Verbose, Debug, Info, Warn, Error)을 출력합니다.
  • 프로덕션 모드: kReleaseMode == true일 때, 로그가 차단되도록 설정할 수 있습니다.

이러한 방식으로 로깅 레벨을 구분하면, 디버깅 중에는 자세한 로그를 남기고, 프로덕션에서는 로그를 제한할 수 있어 보안 및 성능에 유리합니다.