如何让Serilog文件接收器输出键名带引号的合法JSON日志?
解决Serilog文件接收器输出合法JSON的问题
问题核心在于文件接收器的输出模板未指定结构化日志格式器:控制台接收器使用了{Message:lj}格式符(其中lj代表LiteralJson,会将结构化数据序列化为标准JSON),而文件接收器仅用{Message},默认采用简洁的非JSON格式输出,导致键名不带引号。
只需修改appsettings.json中文件接收器的outputTemplate,将{Message}替换为{Message:lj}即可:
{ "AllowedHosts": "*", "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft.Hosting.Lifetime": "Information", "Microsoft": "Warning", "System": "Warning" } }, "Enrich": [ "FromLogContext" ], "WriteTo": [ { "Name": "Console", "Args": { "outputTemplate": "{Timestamp:HH:mm:ss.fff} {Level:u3} {SourceContext} {Message:lj}{NewLine:1}{Exception:1}" } }, { "Name": "File", "Args": { "path": "logs/log.log", "rollingInterval": "Day", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}|{Level:u3}|{SourceContext}|{Message:lj}{NewLine:1}{Exception:1}" } } ] } }
修改后,文件日志的结构化数据会和控制台输出一致,呈现合法JSON格式:
2023-01-27 08:09:38.880|INF|My.Test|HERE IT IS 2023-01-27 08:09:38.884|INF|My.Test|HERE IT IS {"Foo": "bar"} 2023-01-27 08:09:38.888|INF|My.Test|HERE IS ANOTHER ONE {"x": 1, "y": "2"} 2023-01-27 08:09:38.889|INF|My.Test|HERE IS DATA {"Name": "my data", "Value": 27.82859584, "IsValid": true, "$type": "Data"}
内容的提问来源于stack exchange,提问作者monty
相关产品推荐
相关产品推荐

