| File: Buffering\GlobalLogBufferManager.cs | Web Access |
| Project: src\src\Libraries\Microsoft.Extensions.Telemetry\Microsoft.Extensions.Telemetry.csproj (Microsoft.Extensions.Telemetry) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #if NET9_0_OR_GREATER using System; using System.Collections.Concurrent; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; namespace Microsoft.Extensions.Diagnostics.Buffering; internal sealed class GlobalLogBufferManager : GlobalLogBuffer { internal readonly ConcurrentDictionary<string, GlobalBuffer> Buffers = []; private readonly IOptionsMonitor<GlobalLogBufferingOptions> _options; private readonly TimeProvider _timeProvider; private readonly LogBufferingFilterRuleSelector _ruleSelector; public GlobalLogBufferManager( LogBufferingFilterRuleSelector ruleSelector, IOptionsMonitor<GlobalLogBufferingOptions> options) : this(ruleSelector, options, TimeProvider.System) { } internal GlobalLogBufferManager( LogBufferingFilterRuleSelector ruleSelector, IOptionsMonitor<GlobalLogBufferingOptions> options, TimeProvider timeProvider) { _ruleSelector = ruleSelector; _options = options; _timeProvider = timeProvider; } public override void Flush() { foreach (GlobalBuffer buffer in Buffers.Values) { buffer.Flush(); } } public override bool TryEnqueue<TState>(IBufferedLogger bufferedLogger, in LogEntry<TState> logEntry) { string category = logEntry.Category; #if NET GlobalBuffer buffer = Buffers.GetOrAdd(category, static (category, state) => new GlobalBuffer( state.bufferedLogger, category, state._ruleSelector, state._options, state._timeProvider), (bufferedLogger, _ruleSelector, _options, _timeProvider)); #else GlobalBuffer buffer = Buffers.GetOrAdd(category, category => new GlobalBuffer( bufferedLogger, category, _ruleSelector, _options, _timeProvider)); #endif return buffer.TryEnqueue(logEntry); } } #endif