📝
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"
│ 🐛 ]
│ 🐛 }
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
もしもっといい方法があれば教えてください〜!
Discussion