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)
我最终做的是编写一个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)
| 归档时间: |
|
| 查看次数: |
1671 次 |
| 最近记录: |