Logger: 導入 使い方 - Ki-Kobayashi/flutter_wiki GitHub Wiki

🟩 「logger」パッケージのインストール」

loggerから、インストールする

.

🟩設定

🟡 conf_logger.dart

import 'package:intl/intl.dart';
import 'package:logger/logger.dart';

/// 👇dev:全ログ出力 / release:全ログ非表示 にする設定
final logger = Logger(
  filter: ProductionFilter(),
  printer: PrettyPrinter(
    errorMethodCount: 15, // 👈エラーの表示行数
    colors: true,
  ),
);

/// ログをシンプルに表示したい場合は、以下を使用する
class AppPrinter extends LogPrinter {
  @override
  List<String> log(LogEvent event) {
    final message = event.message;

    String msg;
    if (message is Function()) {
      msg = message().toString();
    } else if (message is String) {
      msg = message;
    } else {
      msg = message.toString();
    }
    return [
      '[${event.level.name.toUpperCase()}] '
          '${DateFormat('HH:mm:ss.SSS').format(DateTime.now())}: '
          '$msg'
    ];
  }
}

class AppLogOutput extends ConsoleOutput {
  @override
  void output(OutputEvent event) {
    super.output(event);
    if (event.level.index >= Level.error.index) {
      // 致命的なエラーが発生したら、AssertionErrorをthrowしてStackTraceを表示
      throw AssertionError('View stack trace by logger');
    }
  }
}

.

🟡使い方

Future<void> main() async {
  FlutterError.onError = (details) {
    logger.e(details.summary.toString(), details.exception, details.stack);
  };
  
  PlatformDispatcher.instance.onError = (error, stack) {
    logger.e("", error, stack);
    return true;
  };
}

.

🟩 参考

https://zenn.dev/senkyaku/articles/b575a41a46e898

🟡画面遷移時のエラー

画面遷移の流れも、ログに入れておくと、エラーが起こった時の流れが追いやすくなる。
GoRouterのobserversに、ログ保存用のNavigatorObserverを登録する

class LoggerNavigatorObserver extends NavigatorObserver {

  void _sendLog(Route<dynamic> route) {
    logger.i("Screen: ${route.settings.name}");
  }
  
  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPush(route, previousRoute);
    if (route is PageRoute) {
      _sendLog(route);
    }
  }

  @override
  void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
    if (newRoute != null && newRoute is PageRoute) {
      _sendLog(newRoute);
    }
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPop(route, previousRoute);
    if (previousRoute != null && previousRoute is PageRoute) {
      _sendLog(previousRoute);
    }
  }
}

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

⚠️ **GitHub.com Fallback** ⚠️