如何记录到2个相同类型的接收器(Seq)实例?

时间:2018-11-14 11:47:39

标签: serilog seq

可能吗? 找不到“接收器转发器”,其中一个接收器可以转发到其他多个接收器,可能是同一类型。

Serilogs文档(https://github.com/serilog/serilog/wiki/AppSettings) 明确指出

注意:使用serilog时:键必须唯一。*

所以多次添加相同的Seq接收器似乎不是一个好主意。

我正在寻找与log4net中相同的概念,其中一个记录器可以容纳多个附加程序。

2 个答案:

答案 0 :(得分:1)

不幸的是,用于Serilog的<appSettings>配置提供程序不支持这种情况。如果您可以使用appSettings.json,则可以这样做,否则,可以使用代码WriteTo.Seq(...).WriteTo.Seq(...)配置接收器。

答案 1 :(得分:0)

解决方案的半替代方法:

  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. 在代码中循环使用键-每个键都指向带有API密钥的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需要服务器许可证,但是在简单的“一台开发,一台开发机器,一台服务器”中,它就可以工作。