NLog中避免嵌入双大括号被折叠的高效方法(含Serilog差异)
解决NLog保留双大括号的问题
这个问题我之前也碰到过,NLog默认会把日志消息当作格式化模板来解析,{{和}}会被自动转义成单个大括号,这就是为什么你输入{{"aaa}}后输出变成了{"aaa}。要让NLog原封不动保留这些双大括号,有几个简单的解决办法:
方法1:直接使用LogEventInfo构造日志(推荐)
这种方法会绕过NLog的消息模板解析,把整个字符串当作字面量输出,最直接也不容易出错:
var logger = NLog.LogManager.GetLogger("x"); // 直接构造LogEventInfo,把要输出的内容作为原始消息 var logEvent = new LogEventInfo(LogLevel.Warn, logger.Name, "{{\"aaa}}"); logger.Log(logEvent);
这样日志会原封不动输出{{"aaa}},完全符合你的期望。
方法2:转义双大括号(适用于直接使用日志方法的场景)
如果你还是习惯用Warn这类快捷方法,需要把每个字面量的{{写成{{{{,}}写成}}}}——因为NLog会把每一对{{解析成一个{,所以要输出一对{{,就得写四个连续的大括号:
NLog.LogManager.GetLogger("x").Warn("{{{{\"aaa}}}}");
执行这段代码后,NLog会把{{{{解析为{{,}}}}解析为}},最终输出就是你想要的{{"aaa}}。
额外说明
为什么Serilog会有差异?因为Serilog的消息模板机制和NLog不同,它对大括号的解析逻辑更严格,而NLog默认遵循.NET的格式化字符串规则(和string.Format一致),所以会自动处理双大括号的转义。如果你的场景经常需要输出包含双大括号的内容,方法1是更省心的选择,不用反复处理转义。
内容的提问来源于stack exchange,提问作者Ruben Bartelink
相关产品推荐
相关产品推荐

