using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using SerilogTracing;

namespace Dpz.Core.Infrastructure.Configuration;

/// <summary>
/// 管理 SerilogTracing 生命周期<see cref="ActivityListenerConfiguration"/>.
/// 在主机启动时启动监听器,并在主机关闭时将其释放
/// </summary>
internal sealed class TracingLifetimeService : IHostedService, IDisposable
{
    private IDisposable? _listener;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _listener = new ActivityListenerConfiguration()
            .Instrument.AspNetCoreRequests()
            .TraceToSharedLogger();
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _listener?.Dispose();
        _listener = null;
        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _listener?.Dispose();
    }
}
评论加载中...