Как зарегистрировать пользовательский ILogger, чтобы все необработанные исключения регистрировались - PullRequest
2 голосов
/ 25 марта 2020

Пожалуйста, смотрите Записывайте необработанные исключения в пользовательский регистратор на 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");
    }
}
...