Dev_Log/Flutter&Dart

[Flutter&Dart] print(), debugPrint(), log()

titann 2023. 3. 21. 18:09

요약

print() 대신, debugPrint() 혹은 log()를 사용하자.

 

내용

Flutter 개발을 하다보면, 아래와 같은 경고 메시지가 등장한다.

더보기

Don't invoke 'print' in production code.
Try using a logging framework.

Don't invoke 'print'

링크되어있는 lint 공식 문서를 클릭해보면, production code에는 print()를 쓰지 말고, 

debugPrint() 혹은 log()를 사용하라고 권장한다. (혹은 kDebugMode에서만 동작하도록 조건문 사용)

 

 

print()

print()는 release mode로 빌드해도, logcat등에 그대로 출력된다.

사용자가 굳이 알지 않아도 될 내용 혹은 숨겨야 할 내용이 print()를 사용하여 출력되는 것을 방지하기 위해 사용을 지양한다.

 

debugPrint() vs log()

구글링을 해도 잘 나오지 않는것 같아, chatGPT에게 각각의 함수에 대해 물어봤다.

내가 이해한 바로 요약하자면, 다음과 같다.

 

- debugPrint()는 debug mode에서만 출력되며, release mode에서는 무시된다.

- log()는 debugPrint()와 유사하나, 콘솔, 파일, 시스템로그, 원격 로그와 같이 출력 대상을 다양하게 지정할 수 있다.

더보기

간단하게 debug mode에서만 출력되도록 사용하려면 debugPrint()를,

좀 더 전문적으로 사용하려면 logging Package를 import하여 log()를 사용하면 되는 것으로 보인다.

 

 

*chatGPT 답변 원문은 아래와 같다.

 

Q: debugPrint()란?

 

A: Flutter에서 debugPrint() 함수는 디버깅 도중 로그를 출력하는 데 사용됩니다. 이 함수는 print() 함수와 거의 동일하지만, 디버그 모드에서만 출력되며, 릴리스 모드에서는 무시됩니다.

 

debugPrint() 함수는 기본적으로 콘솔에 로그를 출력하지만, 로그를 출력할 위치를 지정할 수도 있습니다. 예를 들어, debugPrint() 함수를 사용하여 로그를 파일에 출력하거나, 디버그 뷰어(Debugger Viewer)에 출력할 수도 있습니다.

debugPrint() 함수는 다음과 같은 매개변수를 가질 수 있습니다.

  • message: 출력할 로그 메시지입니다.
  • wrapWidth: 출력할 메시지의 래핑 너비입니다. 기본값은 100입니다.
  • debugName: 로그의 출처를 나타내는 이름입니다. 기본값은 null입니다.
  • level: 출력할 로그 레벨입니다. 기본값은 debug입니다.

예를 들어, 다음과 같이 debugPrint() 함수를 사용하여 로그를 출력할 수 있습니다.

debugPrint('Hello, world!');

출력 결과는 다음과 같이 콘솔에 표시됩니다.

I/flutter ( 8346): Hello, world!

 

Q: log()란?

 

A: Flutter에서 log() 함수는 debugPrint()와 비슷한 기능을 제공합니다. log() 함수는 디버깅 도중 로그를 출력하는 데 사용되며, 로그 레벨과 출력 대상 등을 지정할 수 있습니다.

log() 함수는 다음과 같은 매개변수를 가질 수 있습니다.

  • message: 출력할 로그 메시지입니다.
  • name: 로그의 출처를 나타내는 이름입니다. 기본값은 null입니다.
  • error: 로그 메시지와 함께 출력할 오류입니다. 기본값은 null입니다.
  • stackTrace: 오류가 발생한 위치를 나타내는 스택 트레이스입니다. 기본값은 null입니다.
  • time: 로그의 시간을 나타내는 DateTime 인스턴스입니다. 기본값은 null입니다.
  • level: 출력할 로그 레벨입니다. 기본값은 Level.INFO입니다.
  • zone: 로그를 출력할 Dart Zone입니다. 기본값은 Zone.current입니다.
  • logger: 로그를 출력할 Logger입니다. 기본값은 Logger.root입니다.

log() 함수는 출력 대상을 지정할 수 있으며, 다음과 같은 출력 대상들이 제공됩니다.

  • 콘솔(Console): 콘솔에 로그를 출력합니다.
  • 파일(File): 로그를 파일에 출력합니다.
  • 시스템 로그(System log): 시스템 로그에 로그를 출력합니다.
  • 원격 로그(Remote log): 로그를 원격 서버에 전송합니다.

예를 들어, 다음과 같이 log() 함수를 사용하여 로그를 출력할 있습니다.

import 'package:logging/logging.dart';

void main() {
  Logger.root.level = Level.ALL;
  Logger.root.onRecord.listen((record) {
    print('${record.time}: [${record.level}] ${record.loggerName}: ${record.message}');
  });

  var logger = Logger('MyLogger');
  logger.info('Hello, world!');
}

예제에서는 logging 패키지를 사용하여 로그를 출력하고 있습니다. Logger.root.level ALL 설정하면 모든 로그 레벨의 로그를 출력할 있으며, onRecord 속성을 사용하여 출력할 로그의 형식을 지정할 있습니다. 마지막으로, Logger 인스턴스를 생성하여 로그를 출력합니다. 출력 결과는 다음과 같이 콘솔에 표시됩니다.

 

2022-03-21 17:27:51.112391: [INFO] MyLogger: Hello, world!

 

반응형