2

我想更改 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
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 回答