.NET Core WebAPI中Serilog日志参数替换失效问题求助
问题原因与解决办法
你的问题出在使用的CompactJsonFormatter不会直接在日志消息中替换占位符,这是该格式化器的设计特性,不是代码错误。
原因说明
CompactJsonFormatter是Serilog的结构化日志格式化器,它的核心作用是保留日志模板的原始结构,将占位符对应的参数值单独存储在JSON的Properties(或对应版本的专属字段)节点中,方便后续用日志分析工具提取结构化数据,而非直接把参数值拼接到消息字符串里。你看到的"{UserName}"是日志模板原文,实际的用户名值并没有丢失,只是不在消息字段里。
两种解决方向
1. 改为直接替换占位符的文本日志
如果你需要日志文件里直接显示替换后的完整字符串,把文件输出的格式化器换成文本格式化器,修改appsettings.json中File sink的配置:
{ "Name": "File", "Args": { "path": "C:\\Users\\ab\\Projects\\IQC\\IQC_Log.txt", "rollingInterval": "Day", "rollOnFileSizeLimit": true, "formatter": "Serilog.Formatting.Display.MessageTemplateTextFormatter, Serilog", "format": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" } }
修改后日志文件里会直接显示类似Token for user testuser created的内容。
2. 保留结构化日志,正确查看参数值
如果你想继续用结构化日志的优势,无需修改配置,查看日志时解析JSON结构即可:
日志的JSON条目里会包含UserName字段(对应你传入的data.username值),典型的日志条目示例:
{"@t":"2024-05-20T10:00:00.000Z","@m":"Token for user {UserName} created","@i":"123456","UserName":"your_username_here"}
用JSON查看工具打开日志文件,找到对应的UserName字段就能获取实际值。
另外确认:你的日志调用代码_logger.LogInformation("Token for user {UserName} created",data.username);写法是正确的,参数传递没有问题。
内容的提问来源于stack exchange,提问作者AoLiGei
相关产品推荐
相关产品推荐

