gpt4 book ai didi

c# - 如何注册自定义 ILogger 以便记录所有未处理的异常

转载 作者:行者123 更新时间:2023-12-04 04:15:04 26 4
gpt4 key购买 nike

请参阅Log unhandled exceptions to custom logger在github上。显然 Up to Preview 2 Blazor 通过 Console.WriteLine 记录未处理的异常。这将在预览版 3 中更改为使用 ILogger。

如所述here Blazor 使用已配置的 ILogger 实例来记录所有未处理的 异常。但是我无法让它工作。在网上搜索时,我找到了使用 ILoggerProvider 或 ILoggerFactory 的网站,这让我更加困惑。

我必须在哪些服务中配置如何记录未处理的异常?

更新:我想添加第二个非控制台记录器,但我无法让第二个记录器工作。 Blazor 的内置控制台记录器工作正常

更新 2:

这是我到目前为止尝试过的所有内容的列表。 没有以下都有效并向 MyLogger 发送了未处理的异常(在某些情况下,我将所有 other 消息都转发到了 MyLogger)

我尝试注册记录器:

public static void ConfigureServices(IServiceCollection services)  {
services.AddSingleton<ILogger, MyLogger>();
services.AddSingleton(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(MyLogger<>)));

我尝试注册提供者:

services.AddSingleton(ServiceDescriptor.Singleton<ILoggerProvider, MyLoggerProvider>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, MyLoggerProvider>());
services.AddSingleton<ILoggerProvider, MyLoggerProvider>();

我尝试用现有的 ILoggerFactory 注册 Provider:

host.Services.GetService<ILoggerFactory>().AddProvider(new MyLoggerProvider());

我尝试注册我的 MyLoggerFactory:

services.AddSingleton<ILoggerFactory, MyLoggerFactory>();

我对 ILogger 的实现:

public class MyLogger : ILogger
{
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
Debug.WriteLine($"MyLogger.exception='{exception}'");
}

public bool IsEnabled(LogLevel logLevel)
{
return true;
}

public IDisposable BeginScope<TState>(TState state)
{
return new EmptyDisposable();
}

internal class EmptyDisposable : IDisposable
{
public void Dispose()
{
}
}
}

public class MyLogger<T> : ILogger<T>
{
public void Log<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> formatter)
{
Debug.WriteLine($"MyLogger<generic>.exception='{exception}'");
}

public bool IsEnabled(LogLevel logLevel)
{
return true;
}

public IDisposable BeginScope<TState>(TState state)
{
return new MyLogger.EmptyDisposable();
}
}

我对 ILoggerProvider 的实现

public class MyLoggerProvider: ILoggerProvider
{
public void Dispose()
{

}

public ILogger CreateLogger(string categoryName)
{
Debug.WriteLine($"MyLoggerProvider.categoryName='{categoryName}'");
return new MyLogger();
}
}

我对 ILoggerFactory 的实现

public class MyLoggerFactory : ILoggerFactory
{
public MyLoggerFactory()
{
Debug.WriteLine($"MyLoggerFactory.ctor");
}

public void Dispose()
{
}

public ILogger CreateLogger(string categoryName)
{
Debug.WriteLine($"MyLoggerFactory.categoryName='{categoryName}'");
return new MyLogger();
}

public void AddProvider(ILoggerProvider provider)
{
Debug.WriteLine($"MyLoggerFactory.AddProvider");
}
}

最佳答案

测试代码可以让您了解如何注册记录器。 https://github.com/dotnet/aspnetcore/pull/19606/files#diff-106bbead18cff2ed036495cc7c9dbdd1

builder.Services.AddSingleton<ILoggerFactory>(services =>
{
var originalLogger = (ILoggerFactory)Activator.CreateInstance(
originalLoggerDescriptor.ImplementationType,
new object[] { services });
return new PrependMessageLoggerFactory("Custom logger", originalLogger);
});

简而言之:

builder.Services.AddSingleton<ILoggerFactory>(services => new MyLoggerFactory());

关于c# - 如何注册自定义 ILogger 以便记录所有未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60854269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com