Я использую Serilog.Sinks.RollingFile, который недавно устарел в пользу Serilog.Sinks.Файл, и я надеюсь, что скоро обновлю его.
На данный момент мой вопрос заключается в том, как правильно войти в общий файл журнала с нескольких компьютеров (либо с новым, либо со старым пакетом). Когда 10 разных серверов ведут логи в один файл, иногда фрагменты строк оказываются на разных строках. Пример и appsettings.json приведены ниже.
Итак 2 вопроса.
Как решить проблему фрагментов, попадающих в разные строки. Или эта проблема связана с одновременной записью в файл с нескольких машин?
Если это что-то более новая библиотека
"Serilog": {
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "\\\\server\\share\\log-{Date}.log",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} | {Level:u3} | {MachineName} | {SourceContext} | {RequestId} | {RequestPath} | {ThreadId} | {Message}{NewLine}{Exception}",
"shared": true
}
}
]
}
Общепринятый способ сделать это — для каждого экземпляра приложения установить эксклюзивную блокировку файла перед записью и освободить его, когда закончите.
К сожалению, это требует много открывать и закрывать файл, что ОЧЕНЬ медленно, и сериализует работу, которая имеет стоимость по мере роста количества машин. В настоящее время Serilog не реализует это, так как это одна из тех функций, которая работает при тестировании, но очень плохо работает в рабочей среде.
Запись каждого экземпляра приложения в свой собственный файл является лучшей схемой, но использование сетевого сборщика/службы журналов в долгосрочной перспективе доставит меньше хлопот.