import 'dart:io'; import 'package:logging/logging.dart'; class FartLogger { static void listen({required bool isDevelopment}) { final logLevel = Platform.environment['LOG_LEVEL'] ?? (isDevelopment ? 'FINEST' : 'INFO'); Logger.root.level = Level.LEVELS.firstWhere((l) => l.name == logLevel, orElse: () => Level.INFO); // defaults to Level.INFO Logger.root.onRecord.listen((record) { _writeLogRecord(record, record.level.value >= Level.SEVERE.value ? stderr : stdout); }); } static void _writeLogRecord(LogRecord record, IOSink iosink) { // Write the basic log message with colored level iosink.writeln( '[${_getColoredLevel(record.level.name)}]:[${record.loggerName}] ' '${record.time}: ${record.message}', ); // Additional details for severe logs if (record.level.value >= Level.SEVERE.value) { iosink.writeln( '[${_getColoredLevel(record.level.name)}]:[${record.loggerName}] ' '${record.error?.toString() ?? "No error provided"}\n' '${record.stackTrace?.toString() ?? "No trace provided"}', ); } } static void printLevels() { for (final lvl in Level.LEVELS) { _writeLogRecord(LogRecord(lvl, 'Test message', 'main'), stdout); } } static const Map<String, String> _levelColors = { 'FINEST': '\x1B[1;37m', // White 'FINER': '\x1B[1;38m', // Gray 'FINE': '\x1B[1;35m', // Purple 'CONFIG': '\x1B[1;36m', // Cyan 'INFO': '\x1B[1;32m', // Green 'WARNING': '\x1B[1;33m', // Yellow 'SEVERE': '\x1B[1;31m', // Red 'SHOUT': '\x1B[1;38;5;52m\x1B[1;48;5;213m', // Red on pink }; static const String _resetColor = '\x1B[0m'; static String _getColoredLevel(String levelName) { return '${_levelColors[levelName] ?? ''}$levelName$_resetColor'; } }