// Copyright (c) Microsoft. All rights reserved. using System.Collections.Concurrent; using Microsoft.Extensions.Logging; namespace Microsoft.Agents.AI.DurableTask.IntegrationTests.Logging; internal sealed class TestLogger(string category, ITestOutputHelper output) : ILogger { private readonly string _category = category; private readonly ITestOutputHelper _output = output; private readonly ConcurrentQueue _entries = new(); public IReadOnlyCollection GetLogs() => this._entries; public void ClearLogs() => this._entries.Clear(); IDisposable? ILogger.BeginScope(TState state) => null; bool ILogger.IsEnabled(LogLevel logLevel) => true; void ILogger.Log( LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { LogEntry entry = new( category: this._category, level: logLevel, eventId: eventId, exception: exception, message: formatter(state, exception), state: state, contextProperties: []); this._entries.Enqueue(entry); try { this._output.WriteLine(entry.ToString()); } catch (InvalidOperationException) { // Expected when tests are shutting down } } }