Dartのloggerのエラーメッセージを自由にフォマットする方法


Problem

loggerログの内容がわからない。自分のエラーだったらtoStringを実装すれば内容は見えるが、他のライブラリーのエラーだとたまに toStringが実装されていない場合がある。json_serializable とかなので logger.d(error); にしても以下しか表示されないからなんの Key が足りていないのかがわからない。

├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 🐛 Instance of 'MissingRequiredKeysException'
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Solution

おそらくいろんなやり方があるが、自分的にはLoggerのlogのmethodをoverrideすればいい!

import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:logger/logger.dart';

final logger = MyLogger();

class MyLogger extends Logger {
  MyLogger()
      : super(
          level: kReleaseMode ? Level.nothing : Level.verbose,
          printer: PrettyPrinter(methodCount: 5, errorMethodCount: 5),
        );

  
  void log(Level level, message, [error, StackTrace stackTrace]) {
    if (message is MissingRequiredKeysException) {
      final formattedMessage = <String, dynamic>{
        'message': message.message,
        'missingKey': message.missingKeys,
      };
      super.log(level, formattedMessage, error, stackTrace);
    } else {
      super.log(level, message, error, stackTrace);
    }
  }
}

Updated: Null-Safety用

class MyLogger extends Logger {
  MyLogger()
      : super(
          level: kReleaseMode ? Level.nothing : Level.verbose,
          printer: PrettyPrinter(methodCount: 5, errorMethodCount: 5),
        );

  
  void log(Level level, dynamic message,
      [dynamic error, StackTrace? stackTrace]) {
    if (message is MissingRequiredKeysException) {
      final formattedMessage = <String, dynamic>{
        'message': message.message,
        'missingKey': message.missingKeys,
      };
      super.log(level, formattedMessage, error, stackTrace);
    } else {
      super.log(level, message, error, stackTrace);
    }
  }
}

これで自由に下記のようにエラーメッセージをlogできる

├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 🐛 {
│ 🐛   "message": "Required keys are missing: name.",
│ 🐛   "missingKey": [
│ 🐛     "name"
│ 🐛   ]
│ 🐛 }
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

もしもっといい方法があれば教えてください〜!