如何记录到相同类型接收器(Seq)的 2 个实例?
Howto log to 2 instances of same type of sink (Seq)?
可能吗?
找不到 "sink forwarder",其中一个接收器可以转发到多个其他接收器,可能是同一类型。
Serilogs 文档(https://github.com/serilog/serilog/wiki/AppSettings)
明确指出
注意:使用 serilog 时: 键必须是唯一的。*
所以多次添加相同的 Seq sink 似乎不是一个好主意。
我正在寻找与 log4net 中相同的概念,其中一个记录器可以容纳多个附加程序。
不幸的是,Serilog 的 <appSettings>
配置提供程序不支持这种情况; appSettings.json
一个可以,如果你能够使用它,否则在代码 WriteTo.Seq(...).WriteTo.Seq(...)
中配置接收器是可行的方法。
Semi-workaround 解决方案风格:
- 在 appsettigs 中添加“读取这些密钥”
示例1:读取一个键
<add key="SerilogToHttpKeys" value="MyMachineA" />
示例 2(解决问题):读取多个键
<add key="SerilogToHttpKeys" value="MyMachineA, MyLocalMachine, MachineOnTheMoon" />
这两种情况都“指向”无限数量的键,然后通过代码读取(参见 2)并因此进行调整 w/out 重新编译
<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"
循环代码中的键-每个键都指向一个带有API键的http地址,用于记录到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 打开更容易,看看我是否能在那里找到它们而不是登录到服务器。但是,如果我的开发机器不在线,我也会在服务器上保存日志。当然,如果不止一个人访问 Seq 需要服务器许可证,但在一个简单的“一个开发人员,一个 dev-machine,一个服务器”中,它是有效的。
可能吗? 找不到 "sink forwarder",其中一个接收器可以转发到多个其他接收器,可能是同一类型。
Serilogs 文档(https://github.com/serilog/serilog/wiki/AppSettings) 明确指出
注意:使用 serilog 时: 键必须是唯一的。*
所以多次添加相同的 Seq sink 似乎不是一个好主意。
我正在寻找与 log4net 中相同的概念,其中一个记录器可以容纳多个附加程序。
不幸的是,Serilog 的 <appSettings>
配置提供程序不支持这种情况; appSettings.json
一个可以,如果你能够使用它,否则在代码 WriteTo.Seq(...).WriteTo.Seq(...)
中配置接收器是可行的方法。
Semi-workaround 解决方案风格:
- 在 appsettigs 中添加“读取这些密钥”
示例1:读取一个键
<add key="SerilogToHttpKeys" value="MyMachineA" />
示例 2(解决问题):读取多个键
<add key="SerilogToHttpKeys" value="MyMachineA, MyLocalMachine, MachineOnTheMoon" />
这两种情况都“指向”无限数量的键,然后通过代码读取(参见 2)并因此进行调整 w/out 重新编译
<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"
循环代码中的键-每个键都指向一个带有API键的http地址,用于记录到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 打开更容易,看看我是否能在那里找到它们而不是登录到服务器。但是,如果我的开发机器不在线,我也会在服务器上保存日志。当然,如果不止一个人访问 Seq 需要服务器许可证,但在一个简单的“一个开发人员,一个 dev-machine,一个服务器”中,它是有效的。