如何在appsettings中配置Serilog实现多Sink及日志级别覆盖?
Serilog多Sink差异化日志过滤配置
以下是在appsettings.json中配置Serilog,实现Console输出所有日志、AzureTableStorage按来源和级别过滤日志的完整示例:
{ "Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.AzureTableStorage" ], "MinimumLevel": "Verbose", "WriteTo": [ { "Name": "Console" }, { "Name": "AzureTableStorage", "Args": { "connectionString": "你的Azure存储账户连接字符串", "tableName": "ApplicationLogs" }, "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "(SourceContext like '你的应用命名空间%' and @Level >= 'Information') or (@Level >= 'Warning')" } } ] } ], "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ] } }
关键配置说明
全局最低级别
设置为Verbose是为了让Serilog捕获所有级别的日志,后续由各个Sink的过滤规则决定最终输出内容,避免全局级别过高导致低级别日志被提前丢弃。Console Sink
无需额外过滤配置,直接输出所有符合全局最低级别的日志,满足“记录所有日志”的需求。AzureTableStorage Sink过滤规则
通过Filter节点的ByIncludingOnly表达式实现差异化过滤:- 当日志来源是你的应用(通过
SourceContext匹配应用命名空间前缀,比如YourApp.Project.*),且级别为INFO及以上时,写入Azure表存储; - 无论日志来源,只要级别为
WARNING及以上,一律写入Azure表存储。
- 当日志来源是你的应用(通过
注意事项
- 替换
你的Azure存储账户连接字符串为实际的Azure存储账户连接字符串; - 替换
你的应用命名空间为项目中日志记录器对应的命名空间前缀(通常是项目根命名空间,比如创建Logger时使用Log.ForContext<HomeController>(),此时SourceContext就是YourApp.Controllers.HomeController); - 确保已安装必要的NuGet包:
Serilog.Sinks.Console、Serilog.Sinks.AzureTableStorage、Serilog.Settings.Configuration。
内容的提问来源于stack exchange,提问作者skysurfer
相关产品推荐
相关产品推荐

