using System.Collections.Concurrent; using System.Text; using GFramework.Core.Abstractions.Logging; using GFramework.Core.Abstractions.Time; using GFramework.Core.Time; namespace GFramework.Core.Logging.Appenders; /// /// 日志统计 Appender,用于收集日志指标 /// 线程安全:所有方法都是线程安全的 /// public sealed class StatisticsAppender : ILogAppender { private readonly ConcurrentDictionary _levelCounts = new(); private readonly ConcurrentDictionary _loggerCounts = new(); private readonly ITimeProvider _timeProvider; private long _errorCount; private long _startTimeTicks; private long _totalCount; /// /// 创建日志统计 Appender /// /// 时间提供者,默认使用系统时间 public StatisticsAppender(ITimeProvider? timeProvider = null) { _timeProvider = timeProvider ?? new SystemTimeProvider(); _startTimeTicks = _timeProvider.UtcNow.Ticks; } /// /// 获取总日志数量 /// public long TotalCount => Interlocked.Read(ref _totalCount); /// /// 获取错误日志数量(Error + Fatal) /// public long ErrorCount => Interlocked.Read(ref _errorCount); /// /// 获取统计开始时间 /// public DateTime StartTime => new(Interlocked.Read(ref _startTimeTicks), DateTimeKind.Utc); /// /// 获取运行时长 /// public TimeSpan Uptime => _timeProvider.UtcNow - StartTime; /// /// 获取错误率(错误数 / 总数) /// public double ErrorRate { get { var total = TotalCount; return total == 0 ? 0 : (double)ErrorCount / total; } } /// /// 追加日志条目 /// public void Append(LogEntry entry) { // 增加总计数 Interlocked.Increment(ref _totalCount); // 增加级别计数 _levelCounts.AddOrUpdate(entry.Level, 1, (_, count) => count + 1); // 增加日志记录器计数 _loggerCounts.AddOrUpdate(entry.LoggerName, 1, (_, count) => count + 1); // 如果是错误级别,增加错误计数 if (entry.Level >= LogLevel.Error) { Interlocked.Increment(ref _errorCount); } } /// /// 刷新缓冲区(此 Appender 无需刷新) /// public void Flush() { // 统计 Appender 不需要刷新 } /// /// 释放资源 /// public void Dispose() { // 无需释放资源 } /// /// 获取指定级别的日志数量 /// public long GetCountByLevel(LogLevel level) { return _levelCounts.TryGetValue(level, out var count) ? count : 0; } /// /// 获取指定日志记录器的日志数量 /// public long GetCountByLogger(string loggerName) { return _loggerCounts.TryGetValue(loggerName, out var count) ? count : 0; } /// /// 获取所有级别的日志数量 /// public IReadOnlyDictionary GetLevelCounts() { return new Dictionary(_levelCounts); } /// /// 获取所有日志记录器的日志数量 /// public IReadOnlyDictionary GetLoggerCounts() { return new Dictionary(_loggerCounts); } /// /// 重置所有统计数据 /// public void Reset() { Interlocked.Exchange(ref _totalCount, 0); Interlocked.Exchange(ref _errorCount, 0); _levelCounts.Clear(); _loggerCounts.Clear(); Interlocked.Exchange(ref _startTimeTicks, _timeProvider.UtcNow.Ticks); } /// /// 生成统计报告 /// public string GenerateReport() { var report = new StringBuilder(); var startTime = StartTime; var now = _timeProvider.UtcNow; report.AppendLine("=== 日志统计报告 ==="); report.AppendLine($"统计时间: {startTime:yyyy-MM-dd HH:mm:ss} - {now:yyyy-MM-dd HH:mm:ss}"); report.AppendLine($"运行时长: {Uptime}"); report.AppendLine($"总日志数: {TotalCount}"); report.AppendLine($"错误日志数: {ErrorCount}"); report.AppendLine($"错误率: {ErrorRate:P2}"); report.AppendLine(); report.AppendLine("按级别统计:"); foreach (var level in Enum.GetValues()) { var count = GetCountByLevel(level); if (count > 0) { var percentage = (double)count / TotalCount; report.AppendLine($" {level}: {count} ({percentage:P2})"); } } report.AppendLine(); report.AppendLine("按日志记录器统计 (Top 10):"); var topLoggers = _loggerCounts .OrderByDescending(kvp => kvp.Value) .Take(10); foreach (var (logger, count) in topLoggers) { var percentage = (double)count / TotalCount; report.AppendLine($" {logger}: {count} ({percentage:P2})"); } return report.ToString(); } }