Flutter

Flutterのログ出力:print、debugPrint、logの使い分け

Flutterアプリの開発中、ログ出力は欠かせない作業です。

とはいえ、実際にFlutterで開発をしているものの、なんとなくで使用していました。
そこで今回は改めて勉強しなおしたついでに、まとめてみたいと思います。

Flutter開発初心者の方や、なんとなくデバッグしていた方に役立てれればと思います。

まずこちらのページでは、Flutterで使える主なログ出力方法であるprint、debugPrint、logについて、それぞれの特徴と使い分けを見ていきたいと思います。

print関数

print関数は、Dartの標準ライブラリに含まれる最もシンプルなログ出力方法です。
使い方は非常に簡単で、以下のように記述するだけです。

print('Hello, Flutter!');

この一行で、コンソールに「Hello, Flutter!」というメッセージが出力されます。
シンプルさゆえに、Flutterアプリケーション開発の初期段階で特に重宝する機能といえるでしょう。

print関数の特徴

print関数の魅力は、その手軽さにあります。
複雑な設定や初期化が不要で、思いついた時にすぐに使えるのが大きな利点です。

単純に変数を確認したい場合などには、以下のように使います。

String userName = 'John Doe';
print('Current user: $userName');

このコードを実行すると、「Current user: John Doe」とコンソールに表示されます。
また、print関数は長いメッセージを出力しようとすると、長すぎる部分は自動的に切り詰めて短く表示されるようになっています。

これにより、ログは見やすいようになります。

  • 簡単に使える
  • デバッグモードとリリースモードの両方で動作する
  • 長いメッセージを出力すると自動的に切り詰められる

使い所

  • クイックデバッグ
  • 簡単な情報の出力

注意点

  • リリースビルドでも動作するため、セキュリティやパフォーマンスを考慮して使用する必要がある
  • 頻繁な使用はアプリのパフォーマンスに影響を与える可能性がある

2. debugPrint関数

import 'package:flutter/foundation.dart';

debugPrint('Debug message');

debugPrintは、Flutterが提供するログ出力関数です。
先ほど紹介したprintのラッパーになります。

特徴

  • デフォルトではデバッグモードとリリースモードの両方で動作する
  • 長いメッセージでも切り詰めずに全て出力する

使い所

  • 開発中のデバッグ情報の出力
  • 長いログメッセージを出力する必要がある場合
  • 条件付きでログを出力したい場合

printとの違い

  1. メッセージの扱い:debugPrintは長いメッセージでも表示してくれます。
  2. 安定性:大量のログ出力時でも安定して動作します。

注意点

  • printと同様に、頻繁な使用はアプリのパフォーマンスに影響を与える可能性がある

printとdebugPrintにおいての共通の注意点

どちらも本番環境、デバッグ環境関係なく表示されます。
しかし、本番環境においては下で紹介するLogやLog専用パッケージを使うのが推奨されています。

実際にVsCodeで開発しているときでもアラートが表示されてしまいます。
なので、基本的にprintとdebugPrintを使うときにはkDebugModeで現在のモードを判定してから使用するのが推奨されていました。

if (kDebugMode) {
  debugPrint('This will only appear in debug mode');
}

3. log関数

import 'dart:developer' as developer;

developer.log('Detailed log message', name: 'my.app.category');

log関数は、dart:developerライブラリに含まれる高度なログ出力方法です。

特徴

  • 詳細な情報(時刻、ゾーン、スタックトレースやエラー情報、レベル)を含められる
  • カテゴリ分けが可能
  • 長いメッセージも切り詰めず全て出力できる

使い所

  • 複雑なデバッグ情報の出力
  • エラーハンドリング
  • パフォーマンス分析

注意点

  • 他の方法に比べて少し複雑なので、シンプルなログ出力には過剰かもしれない

print、debugPrintと比べると様々な出力が可能となっていて、本格的にログ解析したい場合に使用するのがlogになるかと思います。

レベルや名前をつけることで後で解析がしやすいようになっています。
実際にはlog単体で使うだけなら、print、debugPrintを使うのとは大きな違いはありません。

しかし、本番リリースに対してのログを残す処理を作成したりなどして、ログ解析したいことを考えると出力できる情報の多いlogを使用するのが一般的なようでした。

まとめ:状況に応じた使い分け

  • print: 簡単な確認やクイックデバッグに。リリースビルドでも動作するので、使用は慎重に。
  • debugPrint: 開発中のデバッグ情報出力に。長いメッセージや大量のログ出力時に便利。条件付きで使用しやすい。
  • log: 詳細なログ、エラーハンドリング、パフォーマンス分析に。より高度なデバッグに適している。

適切なログ出力方法を選び、必要に応じて条件付きで使用することで、開発効率が上がり、バグの早期発見にもつながります。同時に、本番環境でのセキュリティとパフォーマンスも確保できます。

重要なのは、どの方法を使う場合でも、大量のログ出力はアプリケーションのパフォーマンスに影響を与える可能性があるということです。
本番環境では必要最小限のログ出力にとどめ、デバッグ用のログは適切に制御することをお勧めします。

皆さんは普段どのログ出力方法を使っていますか?それぞれの方法で困ったことや、逆に便利だと感じたことがあれば、ぜひ共有してくださいね。一緒にFlutter開発のスキルアップを目指しましょう!

-Flutter
-,