[Flutter] 릴리즈 모드에서 로그 출력 제거하기

`print()`로 로그를 출력하면 다음과 같은 경고 메세지가 뜬다. 지금까지는 이 메세지를 그냥 무시해 왔는데 앱을 배포하기 위해서는 릴리즈 모드에서 로그가 출력되지 않도록 할 필요성을 느꼈다.

 

프로덕션 코드에서는 print() 호출을 피해라

DO avoid `print` calls in production code.
For production code, consider using a logging framework. If you are using Flutter, you can use `debugPrint` or surround `print` calls with a check for `kDebugMode`

다트 공식문서에서 프로덕션 코드에서는 `print()`를 피하라는 경고와 함께, 로그를 출력할 다른 방법들을 제시하고 있다.

 

debugPrint(), log()

BAD:

print('This is a print statement.');

 

GOOD:

import 'package:flutter/foundation.dart';

debugPrint('This is a debugPrint statement.');

 

GOOD:

import 'dart:developer';

void main() {
  log('This is a log statement.',
      name: 'MyApp',
      error: 'Sample Error',
      stackTrace: StackTrace.current,
  );
}

 

print()

  • 가장 단순한 출력 방법.
  • 1024자를 초과하는 긴 메시지를 출력할 때는 잘릴 수 있음.
  • 디버그 모드와 릴리즈 모드에서 모두 작동함. (릴리즈 모드에서 로그가 노출될 수 있음)

debugPrint()

  • 긴 메시지도 자동으로 분할해서 출력하기 때문에 잘리지 않음.
  • 디버그 모드에서만 작동함.

log()

  • `dart:developer` 패키지에서 제공하는 함수.
  • 로그 레벨, 태그, 오류 데이터 등 메타데이터를 추가한 더욱 구조화된 로그를 출력할 수 있음.
  • 디버깅 툴에서 더 잘 읽히도록 설계됨. (DevTools에서 활용 가능)
  • 디버그 모드와 릴리즈 모드에서 작동하지만, 릴리즈 모드에서는 보통 비활성화됨.

 

kDebugMode

GOOD:

import 'package:flutter/foundation.dart';

void logMessage(String message) {
  if (kDebugMode) {
    print(message); // 디버그 모드에서만 로그 출력
  }
}
  • `kDebugMode`는 `package:flutter/foundation.dart`에서 제공하는 상수로, 앱이 디버그 모드에서 실행 중일 때 `true`, 릴리즈 모드에서는 `false`를 반환한다.

 

참고