using GFramework.Core.Abstractions.Logging; namespace GFramework.Core.Logging; /// /// 组合日志记录器,支持同时输出到多个 Appender /// public sealed class CompositeLogger : AbstractLogger, IDisposable { private readonly ILogAppender[] _appenders; /// /// 创建组合日志记录器 /// /// 日志记录器名称 /// 最小日志级别 /// 日志输出器列表 public CompositeLogger( string name, LogLevel minLevel, params ILogAppender[] appenders) : base(name, minLevel) { if (appenders == null || appenders.Length == 0) throw new ArgumentException("At least one appender must be provided.", nameof(appenders)); _appenders = appenders; } /// /// 释放所有 Appender 资源 /// public void Dispose() { foreach (var appender in _appenders) { if (appender is IDisposable disposable) { disposable.Dispose(); } } } /// /// 写入日志到所有 Appender /// /// 日志级别 /// 日志消息 /// 异常对象 protected override void Write(LogLevel level, string message, Exception? exception) { var entry = new LogEntry( DateTime.UtcNow, level, Name(), message, exception, null); foreach (var appender in _appenders) { appender.Append(entry); } } /// /// 使用指定的日志级别记录消息和结构化属性 /// /// 日志级别 /// 日志消息 /// 结构化属性键值对 public override void Log(LogLevel level, string message, params (string Key, object? Value)[] properties) { if (!IsEnabled(level)) return; var propsDict = properties.Length > 0 ? properties.ToDictionary(p => p.Key, p => p.Value) : null; var entry = new LogEntry( DateTime.UtcNow, level, Name(), message, null, propsDict); foreach (var appender in _appenders) { appender.Append(entry); } } /// /// 使用指定的日志级别记录消息、异常和结构化属性 /// /// 日志级别 /// 日志消息 /// 异常对象 /// 结构化属性键值对 public override void Log(LogLevel level, string message, Exception? exception, params (string Key, object? Value)[] properties) { if (!IsEnabled(level)) return; var propsDict = properties.Length > 0 ? properties.ToDictionary(p => p.Key, p => p.Value) : null; var entry = new LogEntry( DateTime.UtcNow, level, Name(), message, exception, propsDict); foreach (var appender in _appenders) { appender.Append(entry); } } /// /// 刷新所有 Appender 的缓冲区 /// public void Flush() { foreach (var appender in _appenders) { appender.Flush(); } } }