2013-10-14 30 views
7

私は最大1000文字のデータベースフィールドに自分のメッセージを記録しています。現在、1000文字を超えるメッセージ(スタックトレース、HTTPリクエストなどの例外情報が含まれることが多い)をログに記録しようとすると、挿入が失敗し、NLogはそれを黙って無視し続けます。NLog自動切り捨てメッセージ

NLog.configには、メッセージの長さを常に切り捨てて1000文字を超えないようにする必要がありますか?

1000バイト文字数の前の最後の数文字を"[...]"のように置き換えると、切り詰められたメッセージを正常に表示する方法を教えてください。

グーグルでこれを簡単に見つけることができないとは思いません。うまくいけば私自身のレンダラを書く必要はありませんか?

答えて

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; 
    } 
} 
+1

ありがとうございました。確かに見やすいですが、私はこの迷惑な小さなクラスで終わるので、主にこのログシステムを使用するすべてのプロジェクトに依存関係が必要であり、そのようには見えませんメンテナンスに値する –

2

log4netでは、メッセージがデータベースの列に確実に収まるように、insert文にleft(@msg、1000)を指定します。あなたはおそらくnlogでも同様のことをすることができます。 SQL Serverでは

あなたに挿入を構築することができます。..から-声明このフラグメントを利用選択:

case when len(@msg) > 1000 then left(@msg, 988)+' [truncated]' else @msg end 
+0

ありがとう。 log4netの 'left(@msg、1000)'は完璧です:/私はあなたが示唆したように、SQL側で、インサートをラップするストアドプロシージャでやってしまいました。私は両方とも受け入れられた答えとしてマークすることができればと思いますが、あなたが提案したことをやり遂げたにもかかわらず、wageogheの答えが一般的なケースではより有用であるように感じます。 –

+0

これは実際にはかなり良いアイデアです。つまり、ストアドプロシージャに挿入物をラップし、そこに切り捨てを行います。 – wageoghe

+0

あなたはNLogに 'left(@msg、1000)'を書くことができます – Turch

2

一つの方法は、あなたが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}"/> 
関連する問題