using System.Collections.Concurrent;
using GFramework.Core.Abstractions.Logging;
namespace GFramework.Core.Logging;
///
/// 带缓存的日志工厂包装器,避免重复创建相同名称的日志记录器实例
///
public sealed class CachedLoggerFactory : ILoggerFactory
{
private readonly ConcurrentDictionary _cache = new();
private readonly ILoggerFactory _innerFactory;
///
/// 创建缓存日志工厂实例
///
/// 内部日志工厂
public CachedLoggerFactory(ILoggerFactory innerFactory)
{
_innerFactory = innerFactory ?? throw new ArgumentNullException(nameof(innerFactory));
}
///
/// 获取或创建指定名称的日志记录器(带缓存)
///
/// 日志记录器名称
/// 最小日志级别
/// 日志记录器实例
public ILogger GetLogger(string name, LogLevel minLevel = LogLevel.Info)
{
var cacheKey = $"{name}:{minLevel}";
return _cache.GetOrAdd(cacheKey, _ => _innerFactory.GetLogger(name, minLevel));
}
}