#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" />