10

最大サイズが 1000 文字のデータベース フィールドにメッセージを記録しています。現在、1000 文字を超えるメッセージ (スタック トレース、HTTP リクエスト コンテンツなどの例外情報が含まれていることが多い) をログに記録しようとすると、挿入は失敗し、NLog は (当然のことながら) 黙ってそれを無視し、続行します。

メッセージの長さを常に切り捨てて 1000 文字を超えないように宣言するために、NLog.config に入れることができるものはありますか?

1000文字制限の前の最後の数文字を"[...Truncated]"のようなものに置き換えることで、切り捨てられたメッセージを適切にマークする方法を教えていただければボーナスポイント。

グーグルでこれを簡単に見つけることができないとは信じられません。うまくいけば、独自のレンダラーを作成する必要はありませんか?

4

4 に答える 4

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

これを行う 1 つの方法は、メッセージの正規表現置換を使用することです。これは、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 に答える