Как войти в 2 экземпляра одного и того же типа приемника (Seq)?

Возможный? Не удается найти "экспедитора приемников", где один приемник может пересылать нескольким другим приемникам, возможно, того же типа.

В документации Serilogs ( https://github.com/serilog/serilog/wiki/AppSettings) четко указано, что

ПРИМЕЧАНИЕ. При использовании serilog: ключи должны быть уникальными. *

поэтому добавление одного и того же приемника Seq несколько раз не кажется хорошей идеей.

Я ищу ту же концепцию, что и в log4net, где один регистратор может содержать несколько приложений.

1 ответ

Решение

К сожалению <appSettings> провайдер конфигурации для Serilog не поддерживает этот случай; appSettings.json один делает, если вы можете использовать его, в противном случае настройка приемников в коде WriteTo.Seq(...).WriteTo.Seq(...) это путь

Полу-обходной стиль решения:

  1. Ставим в appsettigs "читать эти ключи"

Пример 1: прочитать один ключ

<add key="SerilogToHttpKeys" value="MyMachineA" />

Пример 2 (который решает проблему): прочитать много ключей

<add key="SerilogToHttpKeys" value="MyMachineA, MyLocalMachine, MachineOnTheMoon" />

Оба случая "указывают" на неограниченное количество ключей, которые затем считываются с помощью кода (см. 2) и, следовательно, могут быть изменены без перекомпиляции.

<add key="MyLocalMachine" value="http://localhost:5341/;juzOPqqqqqqqq" />
<add key="MyMachineA" value="http://10.107.14.57:5341/;m8QVnDaqqqqqqqqqqqqq" />
<add key="MachineOnTheMoon" value="http://10.107.14.62:5341/;Ah0tSzqqqqqqqqqqqq" 
  1. Зациклите ключи в коде - каждый ключ указывает на http-адрес с ключом API, который используется для входа в Seq, но измените структуру каждой записи, и вы можете войти в файл и т. Д.

     foreach (var aKey in System.Configuration.ConfigurationManager.AppSettings.Get("SerilogToHttpKeys")
                                .Split(',')//Use , as separator 
                                .Select(s => s.Trim()))
     {
         var    fields    = System.Configuration.ConfigurationManager.AppSettings.Get(aKey);
         var    separator = ';';
         string serverUrl = fields.Split(separator)[0];
         string apiKey    = fields.Split(separator)[1];
    
         loggerConfiguration = loggerConfiguration.WriteTo.Seq(serverUrl: serverUrl, apiKey: apiKey);
     }
    

Я использую это для одновременного ведения журнала как на моем сервере, так и на моей машине разработчика - проще держать localhost Seq открытым при возникновении ошибок и посмотреть, смогу ли я найти их там, вместо входа на сервер. Однако, если мой devmachine не в сети, у меня также есть журналы на сервере. Конечно, если более одного человека обращаются к серверу, необходимы лицензии для Seq, но в простом случае "один разработчик, одна машина разработчика, один сервер" это работает.

Другие вопросы по тегам