C# 如何注册自定义ILogger,以便记录所有未处理的异常
请查看github上的内容。显然,最多可以通过Console.WriteLine预览2个Blazor日志未处理的异常。这将在预览3中更改为使用ILogger。 如上所述,Blazor使用配置的ILogger实例记录所有未处理的异常。然而,我不能让它工作。搜索网页时,我发现网站使用iLogger提供程序或iLogger工厂,这增加了我的困惑 我必须配置哪些服务来记录未处理的异常 更新: 我想添加第二个非控制台记录器,但我无法使第二个记录器工作。Blazor的内置控制台记录器工作正常 更新2: 这是我到目前为止尝试过的所有方法的列表None以下各项均有效并向MyLogger发送了未经处理的异常(在某些情况下,我会将所有其他消息转发给MyLogger) 我尝试注册记录器: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: 这是
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());