2

nlog レイアウトを変更して、2 つのエントリ間の時間を表示したいと考えています。このようなレイアウトは可能ですか?

これは現在の私の出力であり、前のエントリから経過した秒数が時間の横にある場合は素晴らしいでしょう.

    2012-05-20 19:18:41.0924|INFO|HashMatcher.LocalMatcherControl|99 archives discovered
    2012-05-20 19:18:56.5267|INFO|HashMatcher.LocalMatcherControl|memory usage BEFORE loading samples 283.06 Mb
    2012-05-20 19:18:56.5267|INFO|HashMatcher.LocalMatcherControl|performing sample scan
    2012-05-20 19:19:08.9131|INFO|HashMatcher.LocalMatcherControl|memory usage BEFORE creating progress 285.43 Mb
    2012-05-20 19:20:16.5804|INFO|HashMatcher.LocalMatcherControl|skipped progress 0
    2012-05-20 19:20:17.6100|INFO|HashMatcher.LocalMatcherControl|memory usage BEFORE sorting progress 205.06 Mb
4

2 に答える 2

3

この機能を「無料」で提供するNLogに組み込まれているものはないと思いますが、カスタムLayoutRendererを使用して自分で簡単に実装できるはずです。ここ(NLogのソースリポジトリ)に多くの例があります。

あなたはこのようなものになるかもしれません(私によってコンパイルもテストもされていません):

[LayoutRenderer("ElapsedTime")]
[ThreadAgnostic]    
public class ElapsedTimeLayoutRenderer : LayoutRenderer    
{        
  DateTime? lastTimeStamp;

  public ElapsedTimeLayoutRenderer()
  {            
  }        


  protected override void Append(StringBuilder builder, LogEventInfo logEvent)        
  {            
    var stamp = logEvent.TimeStamp;

    var span = stamp - lastTimeStamp.HasValue ? lastTimeStamp : stamp;

    builder.Append(stamp.ToString());        

    lastTimeStamp = stamp;
  }    
}

本質的に、レイアウトレンダラーは、ログに記録された最後のメッセージのタイムスタンプを記憶しています。このレイアウトレンダラーの値は、ログに記録された最後のメッセージと現在のメッセージのタイムスタンプの差です。このレイアウトレンダラーは、おそらくいくつかの拡張機能を使用できます。DateTimeを見ると、CultureInfoとFormatのプロパティもあることがわかります。必要に応じて、アプリケーションの起動から(または少なくとも最初のメッセージがログに記録されてから)経過時間を指定するオプションを提供することもできます。

また、メンバー変数は変更されているため(lastTimeStamp)、おそらくlockステートメントで保護する必要があります。

うまくいけば、これはあなたが必要とする機能を手に入れるのに役立つでしょう。

幸運を!

于 2012-05-24T14:02:02.870 に答える
1
[LayoutRenderer("elapsedtime")]
[ThreadAgnostic]
public class ElapsedTimeLayoutRenderer : LayoutRenderer
{
  Stopwatch sw;

  public ElapsedTimeLayoutRenderer()
  {
    this.sw = Stopwatch.StartNew();
  }

  protected override void Append(StringBuilder builder, LogEventInfo logEvent)
  {
    builder.Append(this.sw.ElapsedMilliseconds.ToString().PadLeft(6));
    this.sw.Restart();
  }
}

次に、プログラムの最初にこのレンダラーを登録します

ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("elapsedtime", typeof (ElapsedTimeLayoutRenderer));

ノート

上記の構成行が実行される前は、ログは記録されないため、静的ロガーのメンバーは次のようになります。

static Logger logger = LogManager.GetCurrentClassLogger();

このレンダラーを使用するものは、この行の前では許可されていません。構成でレンダラーを構成する方法を知っている人は、コメントまたは編集してください。

于 2013-06-16T13:15:41.043 に答える