登录自定义配置源

Seb*_*ber 6 logging asp.net-core

我正在编写一个自定义ConfigurationSource/ConfigurationProvider来访问存储在 Spring Cloud 配置服务器中的配置。

我希望能够将错误和跟踪信息写入日志,但到目前为止还没有找到一种方法来ILogger<T>在应用程序生命周期的早期获取这些信息。

我知道这个答案,但LoggerFactory.AddConsole已被弃用。拟议替代方案的唯一实施ILoggingBuilder是内部实施。复制非常简单的实现也对我没有帮助,因为我无权访问IServiceProvider.

还有其他想法吗?


更新

没什么太多的,但这将是我的问题的轮廓。Program.CreateWebHostBuilder(string[])它是ASP.NET Core Web 应用程序的摘录。

IWebHostBuilder builder = WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((webHostBuilderContext, configurationBuilder) =>
    {
        ILogger<MyCustomConfigSource> logger = ???;
        configurationBuilder.Add(new MyCustomConfigSource(logger));
    });
Run Code Online (Sandbox Code Playgroud)

Seb*_*ber 6

我最终做的是编写一个ILogger<T>实现,该实现可以缓存日志条目,并且能够在可用时立即将它们重播到真正的记录器。当您的系统无法启动时没有帮助。

public class ReplayLogger : ILogger
{
    private readonly List<Action<ILogger>> logs;
    private readonly Stack<IDisposable> scopes;

    public ReplayLogger()
    {
        this.logs = new List<Action<ILogger>>();
        this.scopes = new Stack<IDisposable>();
    }

    public void Log<TState>(
        LogLevel logLevel,
        EventId eventId,
        TState state,
        Exception exception,
        Func<TState, Exception, string> formatter)
    {
        this.logs.Add(logger => logger.Log(logLevel, eventId, state, exception, formatter));
    }

    public bool IsEnabled(LogLevel logLevel) => true;

    public IDisposable BeginScope<TState>(TState state)
    {
        this.logs.Add(logger =>
        {
            IDisposable scope = logger.BeginScope(state);

            this.scopes.Push(scope);
        });

        return new Scope(this);
    }

    public void Replay(ILogger logger)
    {
        Guard.NotNull(logger, nameof(logger));

        foreach (Action<ILogger> action in this.logs)
        {
            action(logger);
        }
    }

    private class Scope : IDisposable
    {
        private readonly ReplayLogger logger;

        public Scope(ReplayLogger logger)
        {
            this.logger = logger;
        }

        public void Dispose()
        {
            this.logger.logs.Add(_ => this.logger.scopes.Pop());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)