You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:27:21