Serilog过滤在appsettings.json中不起作用



我实现了Serilogger,并将配置放在Program.cs中,它工作得很好。我正试图将配置移动到应用程序设置。json和它的写入日志,但我不能得到过滤器的工作现在。我知道它正在读取配置,因为我可以更改最低日志级别,并且我可以在日志中看到结果。

我一直在阅读和重读Github中的Serilog页面,特别是配置页面

下面是在Program.cs

中工作的代码
try
{
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));

var levelSwitch = new LoggingLevelSwitch();
levelSwitch.MinimumLevel = LogEventLevel.Warning;
return new LoggerConfiguration()
.ReadFrom.Configuration(config, "Serilog");
.MinimumLevel.ControlledBy(levelSwitch)
.Enrich.FromLogContext()
.WriteTo.Debug()
.WriteTo.Logger(l => l
.Filter.ByExcluding("source = 'application'")
.WriteTo.File("Logs\log-.txt", rollingInterval: RollingInterval.Day))
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly("source='customer'")
.WriteTo.MSSqlServer(
connectionString:
"Server=(localdb)\Infinity;Database=Infinity;Trusted_Connection=True;MultipleActiveResultSets=True;",
sqlSinkOptions));
}

这是新的appsettings文件

{
"Serilog": {
"Using": [ "Serilog.Enrichers.FromLogContext" ],
"MinimumLevel": "Warning",
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "Server=(localdb)\Infinity;Database=Infinity;Trusted_Connection=True;MultipleActiveResultSets=True;",
"tableName": "Log",
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "source = 'customer'"
}
}
]
}
},
{
"Name": "File",
"Args": {
"path": "Logs\log-.txt",
"rollingInterval": "Day",
"retainedFileCountLimit": 7,
"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "source = 'customer'"
}
}
]
}
}
],
"Enrich": [ "FromLogContext" ]
},

更新:我发现我正在过滤的自定义属性不再插入到记录器对象中。我想这和"富人"有关吧?但这不是过滤器问题的根源,因为"IncludeOnly"如果属性不存在,过滤器不应该写任何东西,对吗?

下面是我使用PushProperty插入属性和值的方法片段。因为我没有碰过这段代码,我认为问题仍然存在于应用程序设置中。


public void LogError(LogDestination destination, LogLevel level, string msg)
{
if (destination == LogDestination.Customer)
{                
using (LogContext.PushProperty("source", "customer")) {
switch (level)
{
case LogLevel.Debug:
_logger.LogInformation(msg);
break;

我还尝试将. enrich添加回LoggerConfiguration中,没有任何差异。

return new LoggerConfiguration()
.ReadFrom.Configuration(config, "Serilog")
.Enrich.FromLogContext();

我在顶层添加了一个全局过滤器。我尝试了只包括和排除,两者都按预期工作。我不明白为什么水槽的过滤器不工作。

{
"Serilog": {
"Using": [ "Serilog.Expressions", "Serilog.Sinks.File", "Serilog.Sinks.MSSqlServer" ],
"MinimumLevel": "Warning",
"Filter": [
{
"Name": "ByExluding",
"Args": {
"expression": "source = 'customer'"
}
}
],

我尝试过在Appsettings文件中使用过滤器而不是过滤器,它对我有效。但是没有看到任何相关的文档。

{
"Serilog": {
"Using": [ "Serilog.Expressions", "Serilog.Sinks.File", "Serilog.Sinks.MSSqlServer" ],
"MinimumLevel": "Warning",
"Filters": [
{
"Name": "ByExluding",
"Args": {
"expression": "source = 'customer'"
}
}
],

最新更新