using Microsoft.Extensions.Configuration; namespace Logger; /// /// Factory for creating logger instances /// public static class LoggerFactory { /// /// Create a logger that writes to console and file /// public static ILogger CreateCompositeLogger( LogLevel consoleLevel = LogLevel.Trace, FileLoggerOptions? fileOptions = null) { var consoleLogger = new ConsoleLogger(consoleLevel); var fileLogger = new FileLogger(fileOptions ?? new FileLoggerOptions()); return new CompositeLogger(consoleLogger, fileLogger); } /// /// Create a logger from configuration section /// public static ILogger CreateFromConfiguration(IConfiguration configuration) { if (configuration == null) throw new ArgumentNullException(nameof(configuration)); var section = configuration.GetSection("Logger"); var consoleLevelString = section.GetValue("ConsoleMinimumLevel", "Trace"); var consoleLevel = ParseLogLevel(consoleLevelString); var fileOptions = section.GetSection("File").Get() ?? new FileLoggerOptions(); return CreateCompositeLogger(consoleLevel, fileOptions); } private static LogLevel ParseLogLevel(string? level) { if (string.IsNullOrWhiteSpace(level)) return LogLevel.Trace; return level.Trim().ToLowerInvariant() switch { "trace" => LogLevel.Trace, "debug" => LogLevel.Debug, "info" => LogLevel.Info, "information" => LogLevel.Info, "warn" => LogLevel.Warning, "warning" => LogLevel.Warning, "error" => LogLevel.Error, "fatal" => LogLevel.Fatal, _ => LogLevel.Trace }; } /// /// Create a console-only logger /// public static ILogger CreateConsoleLogger(LogLevel minimumLevel = LogLevel.Trace) { return new ConsoleLogger(minimumLevel); } /// /// Create a file-only logger /// public static ILogger CreateFileLogger(FileLoggerOptions? options = null) { return new FileLogger(options ?? new FileLoggerOptions()); } }