10

我将我的消息记录到最大大小为 1000 个字符的数据库字段中。目前,如果我尝试记录大于 1000 个字符的消息(通常包含带有堆栈跟踪、HTTP 请求内容等的异常信息),则插入失败并且 NLog(应该如此)默默地忽略它并继续运行。

我可以在我的 NLog.config 中添加一些内容来声明消息长度应始终被截断,使其不超过 1000 个字符?

如果您能告诉我如何通过将 1000 个字符限制之前的最后几个字符替换为"[...Truncated]" 之类的内容来优雅地标记截断的消息,则可以加分。

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

4

4 回答 4

9

NLog 4.6.3 支持这一点:

${message:truncate=1000}

旧版本的 NLog 可以这样做:

${trim-whitespace:inner=${message:padding=-1000:fixedLength=true}}
于 2019-05-01T19:24:51.820 回答
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;
    }
}
于 2013-10-14T20:40:30.953 回答
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}"/>
于 2015-03-05T15:56:48.717 回答
4

在 log4net 中,我会在插入语句中指定 left(@msg, 1000) 以确保消息适合数据库列。您可能可以在 nlog 中执行类似的操作。

在 sql server 中,您可以使用此片段构造插入到 .. select from 语句中:

case when len(@msg) > 1000 then left(@msg, 988)+' [truncated]' else @msg end
于 2013-10-14T20:35:51.653 回答