import 'package:spark/src/core/utils/logging/log_level.dart'; import 'package:spark/src/core/utils/logging/log_output.dart'; /// A flexible and customizable logging system for Spark Social class SparkLogger { /// Constructor SparkLogger({ this._name = '', this._minLevel = LogLevel.info, List outputs = const [], this._includeStackTrace = true, }) : _outputs = List.from(outputs); /// The minimum log level that will be output LogLevel _minLevel; /// List of log outputs final List _outputs; /// The name of the logger (typically the class or feature name) final String _name; /// Whether to include stack traces for errors final bool _includeStackTrace; /// Log a verbose message void v(String message, {Object? error, StackTrace? stackTrace}) { _log(LogLevel.verbose, message, error, stackTrace); } /// Log a debug message void d(String message, {Object? error, StackTrace? stackTrace}) { _log(LogLevel.debug, message, error, stackTrace); } /// Log an info message void i(String message, {Object? error, StackTrace? stackTrace}) { _log(LogLevel.info, message, error, stackTrace); } /// Log a warning message void w(String message, {Object? error, StackTrace? stackTrace}) { _log(LogLevel.warning, message, error, stackTrace); } /// Log an error message void e(String message, {Object? error, StackTrace? stackTrace}) { _log(LogLevel.error, message, error, stackTrace); } /// Log a fatal message void f(String message, {Object? error, StackTrace? stackTrace}) { _log(LogLevel.fatal, message, error, stackTrace); } /// Internal logging method void _log( LogLevel level, String message, Object? error, StackTrace? stackTrace, ) { // Skip if level is lower than minimum level if (level.value < _minLevel.value) { return; } // Add name prefix if provided final prefixedMessage = _name.isNotEmpty ? '[$_name] $message' : message; // Get stack trace if requested and not provided var trace = stackTrace; if (error != null && trace == null && _includeStackTrace) { trace = StackTrace.current; } final now = DateTime.now(); // Output to all configured outputs for (final output in _outputs) { output.output(level, prefixedMessage, now, error, trace); } } /// Add a new output to the logger void addOutput(LogOutput output) { _outputs.add(output); } /// Remove all outputs void clearOutputs() { _outputs.clear(); } /// Update the minimum level for this logger. void setMinLevel(LogLevel level) { _minLevel = level; } }