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

C# 如何注册自定义ILogger,以便记录所有未处理的异常,c#,asp.net,blazor,blazor-client-side,C#,Asp.net,Blazor,Blazor Client Side,请查看github上的内容。显然,最多可以通过Console.WriteLine预览2个Blazor日志未处理的异常。这将在预览3中更改为使用ILogger。 如上所述,Blazor使用配置的ILogger实例记录所有未处理的异常。然而,我不能让它工作。搜索网页时,我发现网站使用iLogger提供程序或iLogger工厂,这增加了我的困惑 我必须配置哪些服务来记录未处理的异常 更新: 我想添加第二个非控制台记录器,但我无法使第二个记录器工作。Blazor的内置控制台记录器工作正常 更新2: 这是

请查看github上的内容。显然,最多可以通过Console.WriteLine预览2个Blazor日志未处理的异常。这将在预览3中更改为使用ILogger。

如上所述,Blazor使用配置的ILogger实例记录所有未处理的异常。然而,我不能让它工作。搜索网页时,我发现网站使用iLogger提供程序或iLogger工厂,这增加了我的困惑

我必须配置哪些服务来记录未处理的异常

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

更新2

这是我到目前为止尝试过的所有方法的列表None以下各项均有效并向MyLogger发送了未经处理的异常(在某些情况下,我会将所有其他消息转发给MyLogger)

我尝试注册记录器:

public static void ConfigureServices(IServiceCollection services)  {
    services.AddSingleton<ILogger, MyLogger>();
    services.AddSingleton(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(MyLogger<>)));
我的iLogger工厂实现

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");
    }
}

测试代码可以让您了解如何注册记录器。

builder.Services.AddSingleton(服务=>
{
var originalloger=(iLogger工厂)Activator.CreateInstance(
originalLoggerDescriptor.ImplementationType,
新对象[]{services});
返回新的PrependMessageLoggerFactory(“自定义记录器”,originAlloger);
});
简言之:

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

所以我从未使用过Blazer,但我快速查看了文档。我想我有点不确定你在问什么。你是说Blazer不会捕获未处理的异常?或者你是说Blazer不会捕获自己未处理的异常?或者您是说您想添加第二个非控制台记录器,但无法让第二个记录器工作?(如果这是一个问题,Blazer配置的控制台记录器是否工作?@FrankMerrow我想添加第二个非控制台记录器,但我无法让第二个记录器工作。Blazor的内置控制台记录器工作正常。您能告诉我们到目前为止您已经尝试了什么吗?请将它添加到上面的问题中。@FrankMerrow我用我迄今为止尝试过的所有方法更新了这个问题,而不是“host.Services.GetService().AddProvider(new MyLoggerProvider());“我想你会想要一个或多个”host.Services.AddProvider(new MyLoggerProvider());“注册工厂”或“host.Services.GetService();“获取记录器工厂实例。
services.AddSingleton<ILoggerFactory, MyLoggerFactory>();
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();
    }
}
public class MyLoggerProvider: ILoggerProvider
{
    public void Dispose()
    {

    }

    public ILogger CreateLogger(string categoryName)
    {
        Debug.WriteLine($"MyLoggerProvider.categoryName='{categoryName}'");
        return new MyLogger();
    }
}
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");
    }
}
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());