Использование именованных свойств для Serilog JSON WriteTo для упрощения переопределения переменных среды для отключения приемника - PullRequest
1 голос
/ 16 апреля 2020

Я использую JSON файл конфигурации с переопределениями в переменных среды. Этот файл включает в себя конфигурацию Serilog, и я хотел бы иметь возможность отключить указанный c приемник, за исключением определенных условий c, используя переопределение переменных среды.

Я обнаружил, что установка переменных среды, таких как в этом ответе Переполнение стека переопределение элементов массива WriteTo строкой эффективно отключит этот приемник. Например, я могу установить переменную окружения Serilog:WriteTo:1 в строку disable (или любую другую строку). Однако использование именованного свойства имеет больше смысла, например, Serilog:WriteTo:SpecialCaseSink.

Если посмотреть на исходный код ConfigurationReader (ниже), похоже, что это сработает, поскольку зависит только от вызова * 1012. * перебрать раздел WriteTo, и это то, что используется ConfigurationLoggerConfigurationExtensions.

Есть ли какой-либо недостаток в этом именованном подходе, кроме риска изменения Serilog своей внутренней реализации? Есть ли другой способ выборочно включить или отключить приемник Serilog, который не использует индексы, используя только конфигурацию?

Спасибо!

void ApplySinks(LoggerConfiguration loggerConfiguration)
{
    var writeToDirective = _section.GetSection("WriteTo");
    if (writeToDirective.GetChildren().Any())
    {
        var methodCalls = GetMethodCalls(writeToDirective);
        CallConfigurationMethods(methodCalls, FindSinkConfigurationMethods(_configurationAssemblies), loggerConfiguration.WriteTo);
    }
}

и более поздних версий

internal ILookup<string, Dictionary<string, IConfigurationArgumentValue>> GetMethodCalls(IConfigurationSection directive)
{
    var children = directive.GetChildren().ToList();

    var result =
        (from child in children
            // big query
        );

    return result;
}
...