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

截断Serilog消息至指定长度且不影响ASP.NET Core诊断

解决Serilog截断消息时ASP.NET Core内置日志占位符未解析的问题

你的问题出在当前代码操作的是未渲染的日志模板文本(logEvent.MessageTemplate.Text),而不是已经替换了占位符的最终日志消息。ASP.NET Core内置日志的{EnvName}、{ContentRoot}这些是模板占位符,只有经过渲染后才会替换成实际的环境名称、内容根路径等值。

要解决这个问题,你需要先把日志事件渲染成完整的字符串,再对渲染后的结果进行截断:

  1. 替换原来获取模板文本的逻辑,改用logEvent.RenderMessage()方法获取已经解析了占位符的完整消息
  2. 基于这个渲染后的字符串进行截断处理

修改后的完整代码如下:

public class WithTrimmedMessage(int maxLength) : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        var renderedMessage = logEvent.RenderMessage();
        string trimmedMessage;

        if (!string.IsNullOrEmpty(renderedMessage) && renderedMessage.Length > maxLength)
        {
            trimmedMessage = renderedMessage[..maxLength] + "...";
        }
        else
        {
            trimmedMessage = renderedMessage ?? string.Empty;
        }

        logEvent.AddOrUpdateProperty(propertyFactory.CreateProperty("TrimmedMessage", trimmedMessage));
    }
}

说明

  • RenderMessage()方法会自动结合日志模板和对应的属性值,生成最终的可读消息,这样截断后的TrimmedMessage就会显示实际的环境名称、路径等内容,而不是占位符。
  • 增加了对renderedMessage为null的判断,避免空引用异常。

内容的提问来源于stack exchange,提问作者JazzyHacker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:42:05