чтение файла appconfig для serilog

#c# #serilog

#c# #serilog

Вопрос:

У меня есть Logger.cs класс, в котором я инициализирую настройки serilog следующим образом:

 _logger = new LoggerConfiguration()
                .ReadFrom.AppSettings()
                .MinimumLevel.Debug()
                .WriteTo.File(_filepath, restrictedToMinimumLevel: LogEventLevel.Debug, shared: true, rollOnFileSizeLimit: true)
                .CreateLogger();
  

Я хочу прочитать размер файла из файла app.config.
У меня есть файл app.config, как показано ниже

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="serilog:using:File" value="Serilog.Sinks.File" />
    <add key="serilog:write-to:File.fileSizeLimitBytes" value="2000" />
  </appSettings>
</configuration>
  

Но, похоже, appsettings вообще не читается. потому что я вижу, что генерируется файл размером более 2 кб.
Что я здесь пропустил?

Как мой класс logger будет считывать из app.config файла, я пропустил какие-либо настройки в классе assemblyinfo?

Ответ №1:

Конфигурация Serilog через App.config не «сливается» с конфигурацией, которую вы определили с помощью кода C #… Они являются аддитивными. Это означает, что в вашем примере вы настраиваете два независимых приемника, которые оба выполняют запись в файл.

Однако, поскольку вы не указали путь к файлу для приемника в App.config, он игнорирует этот приемник и не настраивает его, и настраивается только второй приемник (в коде C #).

Если вы хотите использовать конфигурацию App.config, тогда ваш XML-файл должен включать путь к файлу в дополнение к fileSizeLimitBytes :

 <configuration>
  <appSettings>
    <add key="serilog:minimum-level" value="Debug"/>
    <add key="serilog:using:File" value="Serilog.Sinks.File" />
    <add key="serilog:write-to:File.path" value="log.txt" />
    <add key="serilog:write-to:File.rollOnFileSizeLimit" value="true" />
    <add key="serilog:write-to:File.fileSizeLimitBytes" value="2000" />
  </appSettings>
</configuration>
  

И ваш код на C # будет просто считывать настройки из App.config, без «дополнительного» приемника.

 _logger = new LoggerConfiguration()
    .ReadFrom.AppSettings()
    .CreateLogger();
  

ps: Обратите внимание, что я также настроил MinimumLevel через App.config. Это не является обязательным требованием, но обычно имеет смысл, если вы уже настраиваете приемники Serilog через App.config.

Комментарии:

1. как вы упомянули, я удалил writeto. файл из кода C # и добавлен выше в конфигурацию приложения. Все еще не работает

2. есть ли какой-либо другой способ получить XML-файл, из которого LoggerConfiguration () может прочитать размер файла?

3. @RemSan Ты включил rollOnFileSizeLimit в конфигурации?

4. @RemSan Если вы хотите, чтобы разные параметры одной и той же конфигурации экземпляра приемника были разделены между кодом C # и App.config, то вы не можете использовать Serilog.Settings.AppSettings . Вам придется создать свои собственные appSettings значения, прочитать их через ConfigurationManager и установить в своем коде.

5. ПРИВЕТ @C. AugustoProiete — я использую только конфигурацию AppSettings и включил их в коде, как указано выше (и в их wiki), но безуспешно. Он вообще их не читает. Нужно ли мне использовать using:sink в конфигурации appsettings?

Ответ №2:

Вы можете комбинировать XML и конфигурацию на основе кода, но каждый приемник должен быть настроен либо с использованием XML, либо в коде — приемники, добавленные в code, не могут быть изменены через настройки приложения.

Итак, если вам нужно использовать App.config файл, вам нужно будет перенести в него всю конфигурацию, как показано ниже

 <appSettings>
  <add key="serilog:minimum-level" value="Debug"/>
  <add key="serilog:using:File" value="Serilog.Sinks.File" />
  <add key="serilog:write-to:File.path" value="logslog.txt" />
  <add key="serilog:write-to:File.shared" value="true" />
  <add key="serilog:write-to:File.rollOnFileSizeLimit" value="true" />
  <add key="serilog:write-to:File.fileSizeLimitBytes" value="2000" />
</appSettings>
  

И создание экземпляра регистратора с использованием приведенного ниже кода

 _logger = new LoggerConfiguration()
    .ReadFrom.AppSettings()
    .CreateLogger();
  

Комментарии:

1. Просто чтобы добавить сюда тот же комментарий, что и предыдущий, @ElasticCode, выполняя вышеуказанное, код не распознает конфигурации и не добавляет журналы ни в файл, ни в консоль (я настраиваю файл и консоль как приемники). Я даже использовал «using» и без его использования тоже. Но это вообще не возымело никакого эффекта, я мог видеть, что журналы добавляются в соответствующие приемники.

2. @Ak777 Пожалуйста, поделитесь своей конфигурацией AppSettings

3. <add key="serilog:minimum-level" value="Debug"/> <add key="serilog:using:Console" value="Serilog.Sinks.Console" /> <add key="serilog:write-to:Console"/> <add key="serilog:using:File" value="Serilog.Sinks.File" /> <add key="serilog:write-to:File"/> <add key="serilog:write-to:File.pathFormat" value="C:LogsApp-Log-{Date}.log" /> <add key="serilog:write-to:File.rollingInterval" value="Day"/> <add key="serilog:write-to:File.outputTemplate" value="[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"/>

4. \ Регистрация регистратора в DI Log.Logger = new LoggerConfiguration() .ReadFrom.AppSettings() .CreateLogger(); container.Register(() => Log.Logger, Lifestyle.Singleton);

5. pathFormat Параметр @Ak777, используемый с RollingFile sink, необходимо использовать path параметр <add key="serilog:write-to:File.path" value="C:LogsApp-Log-.log" />