namespace GFramework.Core.logging; /// /// 日志工厂实现,使用LogConfig配置创建日志记录器 /// public class LoggerFactory : ILoggerFactory { private readonly LogConfig _config; private readonly Dictionary _loggers = new(); /// /// 构造函数 /// /// 日志配置 public LoggerFactory(LogConfig config) { _config = config ?? throw new ArgumentNullException(nameof(config)); } /// /// 创建指定类别的日志记录器 /// /// 日志类别 /// 日志记录器实例 public ILog Create(string category) { if (_loggers.TryGetValue(category, out var existingLogger)) { return existingLogger; } var logger = CreateLogger(category); _loggers[category] = logger; return logger; } /// /// 创建全局日志记录器实例 /// /// 全局日志记录器 public ILog CreateGlobalLogger() { return Create("Global"); } /// /// 创建日志记录器 /// /// 日志类别 /// 日志记录器实例 private ILog CreateLogger(string category) { var level = _config.GetCategoryLevel(category); var consoleLogger = new ConsoleLogger(category, level, null, _config.UseColors); if (_config.EnableFile && !string.IsNullOrEmpty(_config.LogFilePath)) { // 创建一个组合日志记录器,同时输出到控制台和文件 return new CompositeLogger(level, consoleLogger, CreateFileLogger(category)); } return consoleLogger; } /// /// 创建文件日志记录器 /// /// 日志类别 /// 文件日志记录器实例 private ILog CreateFileLogger(string category) { try { var level = _config.GetCategoryLevel(category); var directory = Path.GetDirectoryName(_config.LogFilePath); if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); } var writer = new StreamWriter(_config.LogFilePath!, append: true); return new ConsoleLogger(category, level, writer, useColors: false); } catch { return new NullLogger(); } } /// /// 组合日志记录器,将日志同时输出到多个目标 /// /// 最小日志级别,低于此级别的日志将被忽略 /// 控制台日志记录器 /// 文件日志记录器 private sealed class CompositeLogger( LogLevel minLevel, ILog consoleLogger, ILog fileLogger) : ILog { /// /// 记录日志消息到所有配置的日志目标 /// /// 日志级别 /// 日志消息 /// 相关异常(可选) /// 上下文信息(可选) public void Log( LogLevel level, string message, Exception? exception = null, object? context = null) { if (!IsEnabled(level)) return; consoleLogger.Log(level, message, exception, context); fileLogger.Log(level, message, exception, context); } /// /// 检查指定的日志级别是否已启用 /// /// 要检查的日志级别 /// 如果级别已启用则返回true,否则返回false public bool IsEnabled(LogLevel level) { return level >= minLevel; } // 快捷方法 /// /// 记录跟踪级别的日志消息 /// /// 日志消息 /// 上下文信息(可选) public void Trace(string msg, object? ctx = null) => Log(LogLevel.Trace, msg, null, ctx); /// /// 记录调试级别的日志消息 /// /// 日志消息 /// 上下文信息(可选) public void Debug(string msg, object? ctx = null) => Log(LogLevel.Debug, msg, null, ctx); /// /// 记录信息级别的日志消息 /// /// 日志消息 /// 上下文信息(可选) public void Info(string msg, object? ctx = null) => Log(LogLevel.Info, msg, null, ctx); /// /// 记录警告级别的日志消息 /// /// 日志消息 /// 上下文信息(可选) public void Warn(string msg, object? ctx = null) => Log(LogLevel.Warning, msg, null, ctx); /// /// 记录错误级别的日志消息 /// /// 日志消息 /// 相关异常(可选) /// 上下文信息(可选) public void Error(string msg, Exception? ex = null, object? ctx = null) => Log(LogLevel.Error, msg, ex, ctx); /// /// 记录致命错误级别的日志消息 /// /// 日志消息 /// 相关异常(可选) /// 上下文信息(可选) public void Fatal(string msg, Exception? ex = null, object? ctx = null) => Log(LogLevel.Fatal, msg, ex, ctx); } }