NLog自动截断消息

mo.*_*mo. 7 c# nlog

我正在将消息记录到最大为1000个字符的数据库字段中.目前,如果我尝试记录一条消息(通常包含堆栈跟踪,HTTP请求内容等异常信息),大于1000个字符,插入失败,NLog(应该)默默地忽略它并继续前进.

我可以在NLog.config中添加一些东西来声明消息长度应该总是被截断,所以它不超过1000个字符吗?

如果你能告诉我如何通过用"[...截断]"之类的东西替换1000个字符限制之前的最后几个字符来优雅地标记截断的消息,则可以获得奖励积分.

不敢相信我用谷歌搜索不能轻易找到这个.希望我不必编写自己的渲染器?

Rol*_*sen 9

NLog 4.6.3 支持这个:

${message:truncate=1000}
Run Code Online (Sandbox Code Playgroud)

旧版本的 NLog 可以做到这一点:

${trim-whitespace:inner=${message:padding=-1000:fixedLength=true}}
Run Code Online (Sandbox Code Playgroud)


wag*_*ghe 5

我不知道有一种内置的方式来做到这一点.相反,我会写一个LayoutRenderer(实际上是一个WrapperLayoutRenderer).这并不难.

这样的事情(未经测试)应该这样做:

[LayoutRenderer("truncate")]
[ThreadAgnostic]
public sealed class TruncateLayoutRendererWrapper : WrapperLayoutRendererBase
{
    public TruncateLayoutRendererWrapper()
    {
        this.Truncate = true;
        this.Ellipsis = true;
        this.Limit = 1000;
    }

    [DefaultValue(true)]
    public bool Truncate { get; set; }

    [DefaultValue(true)]
    public bool Ellipsis { get; set; }

    [DefaultValue(1000)]
    public bool Limit { get; set; }

    /// <summary>
    /// Post-processes the rendered message. 
    /// </summary>
    /// <param name="text">The text to be post-processed.</param>
    /// <returns>Trimmed string.</returns>
    protected override string Transform(string text)
    {
        if (!Truncate || Limit <= 0) return text;

        var truncated = text.Substring(0, Ellipsis ? Limit - 3 : Limit);
        if (Ellipsis) truncated += "...";

        return truncated;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

一种方法是使用消息的正则表达式替换,您可以在nlog.config中直接定义该消息。我使用以下命令截断了500个字符:

<variable name="truncated_message" value="${replace:replaceWith=...TRUNCATED:regex=true:inner=${message}:searchFor=(?&lt;\=.\{500\}).+}"/>

<target name="filelog" xsi:type="File" fileName="${basedir}/../logs/jobs/${shortdate}.log" layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level:uppercase=true}|${truncated_message}"/>
Run Code Online (Sandbox Code Playgroud)