Created
July 17, 2024 06:16
-
-
Save Atsumi3/cfc6da64fb7db529bee2cc146e0d3b54 to your computer and use it in GitHub Desktop.
flutterのログ周りを綺麗に定義する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
final logger = Logger( | |
output: CrashlyticsLogger(), | |
printer: PrettyPrinter( | |
methodCount: 1, | |
errorMethodCount: 5, | |
dateTimeFormat: DateTimeFormat.onlyTimeAndSinceStart, | |
), | |
); | |
class CrashlyticsLogger extends LogOutput { | |
@override | |
void output(OutputEvent event) { | |
for (final e in event.lines) { | |
dev.log(e, name: 'logger'); | |
} | |
_sendCrashlytics(event); | |
} | |
Future<void> _sendCrashlytics(OutputEvent event) async { | |
try { | |
if (Firebase.apps.isEmpty) return; | |
if (event.level.isSerious(Level.error)) { | |
await FirebaseCrashlytics.instance.recordError( | |
event.origin.error, | |
event.origin.stackTrace, | |
reason: event.origin.message, | |
printDetails: true, | |
fatal: event.level == Level.fatal, | |
); | |
} else if (event.level.isSerious(Level.info)) { | |
await FirebaseCrashlytics.instance.log(event.origin.message.toString()); | |
} | |
} catch (e) { | |
dev.log('logの出力エラー', name: 'logger'); | |
} | |
} | |
} | |
extension _LevelExt on Level { | |
bool isSerious(Level level) { | |
return value >= level.value; | |
} | |
} | |
extension AnalyticsLogExt on Logger { | |
Future<void> setUserId(String? id) async { | |
try { | |
if (Firebase.apps.isEmpty) return; | |
await FirebaseAnalytics.instance.setUserId(id: id); | |
await FirebaseCrashlytics.instance.setUserIdentifier(id ?? ''); | |
} catch (e, s) { | |
logger.e('failed set userId.', error: e, stackTrace: s); | |
} | |
} | |
Future<void> setUserProperty({ | |
required UserProperty property, | |
required String? value, | |
}) async { | |
try { | |
if (Firebase.apps.isEmpty) return; | |
await FirebaseAnalytics.instance.setUserProperty( | |
name: property.name, | |
value: value, | |
); | |
await FirebaseCrashlytics.instance.setCustomKey( | |
property.name, | |
value ?? '', | |
); | |
} catch (e, s) { | |
logger.e('failed set user property.', error: e, stackTrace: s); | |
} | |
} | |
} | |
sealed class UserProperty { | |
final String name; | |
UserProperty({required this.name}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment