我实现了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'"
}
}
],