nlog的时差

时间:2012-05-20 18:25:32

标签: nlog

我想更改nlog布局,以便显示两个条目之间的时间。这样的布局是否可能?

现在这是我的输出,如果接下来之后经过了几秒钟就会很好。

    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

2 个答案:

答案 0 :(得分:2)

我认为NLog中没有任何内置功能可以“免费”提供此功能,但您应该可以使用自定义LayoutRenderer轻松自行实现。您可以找到许多示例here(在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),因此可能应使用锁定语句对其进行保护。

希望这可以帮助您获得所需的功能。

祝你好运!

答案 1 :(得分: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();
使用此渲染器的

在此行之前不允许。如果有人知道如何在配置中配置渲染器,请发表评论或编辑。