Правильный способ сделать прокатку файлов с Serilog с нескольких машин - PullRequest
1 голос
/ 30 мая 2019

Я использую Serilog.Sinks.RollingFile , который недавно был признан устаревшим в пользу Serilog.Sinks.File , и я надеюсь, что скоро обновлюсь.

На данный момент мой вопрос заключается в том, как правильно войти в общий файл журнала с нескольких компьютеров (с новым или старым пакетом).Когда 10 разных серверов регистрируются в этом отдельном файле, иногда фрагменты строк оказываются в разных строках.Пример и appsettings.json ниже.

Итак, 2 вопроса.

  1. Как мне решить проблему фрагментов, попадающих в разные строки.Или эта проблема присуща записи в файл с нескольких машин одновременно?

  2. Если это что-то более новое, библиотека

enter image description here

"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
        }
      }
    ]
  }

1 Ответ

2 голосов
/ 30 мая 2019

Общепринятый способ сделать это для каждого экземпляра приложения - сделать эксклюзивную блокировку файла перед записью и отпустить ее, когда закончите.

К сожалению, это требует многократного открытия и закрытия файла, что ОЧЕНЬ медленно, и сериализует работу, которая имеет стоимость по мере роста числа машин. Serilog не реализует это в настоящее время, так как это одна из тех функций, которая, кажется, работает в тестировании, но работает очень плохо в производстве.

Лучше всего сделать так, чтобы каждый экземпляр приложения записывал в свой собственный файл, но в долгосрочной перспективе использование сетевого сборщика / службы журналов будет меньше проблем.

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