Пожалуйста, смотрите Записывайте необработанные исключения в пользовательский регистратор на github. Видимо, до Preview 2 Blazor регистрирует необработанные исключения через Console.WriteLine. Это будет изменено в Preview 3 для использования ILogger.
Как описано здесь Blazor использует сконфигурированные экземпляры ILogger для регистрации всех необработанных Исключений. Однако я не могу заставить его работать. Выполняя поиск в Интернете, я обнаружил сайты, используя ILoggerProvider или ILoggerFactory, что добавляет путанице.
Какие службы мне нужно настроить, чтобы регистрировать необработанные исключения?
Обновление : Я хочу добавить второй не консольный регистратор и не могу заставить этот второй работать. Встроенный консольный логгер от Blazor отлично работает
Обновление 2 :
Вот список всего, что я пробовал до сих пор. Нет из следующего работало и отправляло необработанные исключения в MyLogger (В некоторых случаях я получал все другие сообщения, пересылаемые в MyLogger)
Я пытался зарегистрировать Logger:
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:
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");
}
}