// Copyright (c) 2025-2026 GeWuYou // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; using System.Threading; using GFramework.Core.Abstractions.Logging; using GFramework.Core.Logging; using GFramework.Cqrs.Tests.Logging; namespace GFramework.Cqrs.Tests.Cqrs; /// /// 为 CQRS 注册测试捕获真实启动路径中创建的日志记录器。 /// /// /// 处理器注册入口会分别为测试运行时、容器和注册器创建日志器。 /// 该提供程序统一保留这些测试日志器,以便断言警告是否经由公开入口真正发出。 /// 并发创建日志器时会通过内部锁串行化, 每次返回快照,避免调用方观察到可变集合。 /// internal sealed class CapturingLoggerFactoryProvider : ILoggerFactoryProvider { private readonly List _loggers = []; private LogLevel _minLevel; private readonly Lock _sync = new(); /// /// 使用指定的最小日志级别初始化一个新的捕获型日志工厂提供程序。 /// /// 要应用到新建测试日志器的最小日志级别。 public CapturingLoggerFactoryProvider(LogLevel minLevel = LogLevel.Info) { _minLevel = minLevel; } /// /// 获取通过当前提供程序创建的全部测试日志器快照。 /// public IReadOnlyList Loggers { get { lock (_sync) { return _loggers.ToArray(); } } } /// /// 获取或设置新建测试日志器的最小日志级别。 /// public LogLevel MinLevel { get { lock (_sync) { return _minLevel; } } set { lock (_sync) { _minLevel = value; } } } /// /// 创建一个测试日志器并将其纳入捕获集合。 /// /// 日志记录器名称。 /// 用于后续断言的测试日志器。 public ILogger CreateLogger(string name) { lock (_sync) { var logger = new TestLogger(name, _minLevel); _loggers.Add(logger); return logger; } } }