Можно ли отключить вывод категорий в .NET Core ConsoleLogger и DebugLogger? - PullRequest
0 голосов
/ 30 апреля 2019

Я использую очень типичную (я думаю) установку для входа в консольное приложение .NET Core. Я пишу:

services.AddLogging(loggingBuilder => {
    loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));
    loggingBuilder.AddConsole();
    loggingBuilder.AddDebug();
});

На мой взгляд, вывод по умолчанию трудно читать, потому чтоона загрязнена контекстной информацией, которая меня не интересует:

Консоль (все в первой строке - нежелательный шум):

info: MyApp.MyNamespace.OtherNamespace[0]
      The message I actually want to see

Отладка (все до Information: - этонежелательный шум):

MyApp.MyNamespace.OtherNamespace:Information: The message I actually want to see

Я предполагал, что будет легко отключить эту избыточную контекстную информацию, но пока я рисую пробел.Можно ли отключить эту штуку, если не писать собственную реализацию ConsoleLogger и DebugLogger?(в этот момент, вероятно, будет проще использовать Log4Net).

1 Ответ

0 голосов
/ 05 мая 2019

Вот что я написал для решения этой проблемы (использует Crayon , чтобы раскрасить вывод консоли):

public class CleanConsoleLogger : ILogger {

    private readonly IAppConfigHelper _configHelper;

    public CleanConsoleLogger(IAppConfigHelper configHelper) {
        _configHelper = configHelper;
    }

    public IDisposable BeginScope<TState>(TState state) => null;

    public bool IsEnabled(LogLevel logLevel) => logLevel >= _configHelper.ConsoleLogLevel;

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) {

        if (!IsEnabled(logLevel)) { return; }

        var message = formatter(state, exception);

        if (string.IsNullOrEmpty(message)) { return; }
        if (exception != null) {
            message += $"{Environment.NewLine}{exception}";
        }

        switch (logLevel) {
            case LogLevel.Trace:
                Console.Out.WriteLineAsync(Output.BrightBlack(message));
                break;
            case LogLevel.Debug:
                Console.Out.WriteLineAsync(Output.BrightBlack(message));
                break;
            case LogLevel.Information:
                Console.Out.WriteLineAsync(message);
                break;
            case LogLevel.Warning:
                Console.Out.WriteLineAsync(Output.Dim().Yellow().Text(message));
                break;
            case LogLevel.Error:
                Console.Error.WriteLineAsync(Output.BrightRed(message));
                break;
            case LogLevel.Critical:
                Console.Error.WriteLineAsync(Output.BrightRed(message));
                break;
        }
    }
}

public class CleanConsoleLoggerProvider : ILoggerProvider {

    private readonly IAppConfigHelper _configHelper;

    private readonly ConcurrentDictionary<string, CleanConsoleLogger> _loggers = new ConcurrentDictionary<string, CleanConsoleLogger>();

    public CleanConsoleLoggerProvider(IAppConfigHelper configHelper) {
        _configHelper = configHelper;
    }

    public ILogger CreateLogger(string categoryName)
        => _loggers.GetOrAdd(categoryName, name => new CleanConsoleLogger(_configHelper));

    public void Dispose() {
        _loggers.Clear();
    }

}

public static class CleanConsoleLoggerFactoryExtensions {

    public static ILoggingBuilder AddCleanConsole(this ILoggingBuilder builder) {
        builder.Services.AddSingleton<ILoggerProvider, CleanConsoleLoggerProvider>();
        return builder;
    }

}

public class CleanDebugLogger : ILogger {

    private readonly IAppConfigHelper _configHelper;

    public CleanDebugLogger(IAppConfigHelper configHelper) {
        _configHelper = configHelper;
    }

    public IDisposable BeginScope<TState>(TState state) => null;

    public bool IsEnabled(LogLevel logLevel) => Debugger.IsAttached && logLevel >= _configHelper.ConsoleLogLevel;

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) {
        if (!IsEnabled(logLevel)) { return; }
        var message = formatter(state, exception);
        if (string.IsNullOrEmpty(message)) { return; }
        if (exception != null) {
            message += $"{Environment.NewLine}{exception}";
        }
        Debug.WriteLine(message);
    }

}

public class CleanDebugLoggerProvider : ILoggerProvider {

    private readonly IAppConfigHelper _configHelper;

    private readonly ConcurrentDictionary<string, CleanDebugLogger> _loggers = new ConcurrentDictionary<string, CleanDebugLogger>();

    public CleanDebugLoggerProvider(IAppConfigHelper configHelper) {
        _configHelper = configHelper;
    }

    public ILogger CreateLogger(string categoryName)
        => _loggers.GetOrAdd(categoryName, name => new CleanDebugLogger(_configHelper));

    public void Dispose() {
        _loggers.Clear();
    }

}

public static class CleanDebugLoggerFactoryExtensions {

    public static ILoggingBuilder AddCleanDebug(this ILoggingBuilder builder) {
        builder.Services.AddSingleton<ILoggerProvider, CleanDebugLoggerProvider>();
        return builder;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...