【问题标题】:Enterprise Library 4.1 logging timestamp how to display millisecondEnterprise Library 4.1 记录时间戳如何显示毫秒
【发布时间】:2011-09-06 11:49:56
【问题描述】:

以下在配置文件中。

 <formatters>
      <add template="{timestamp} {severity} {category} {message}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="SingleLineFormatter" />
 </formatters>

显示

31/05/2011 11:43:24 信息 ...

但是没有显示对性能检测有用的毫秒,有人知道如何显示吗?谢谢。

【问题讨论】:

  • 你不应该真的这样做,即使你可以。数据毫无意义。请参阅下面的答案。

标签: logging enterprise-library app-config


【解决方案1】:

不幸的是,企业库日志记录使用 .net DateTime,因此尽管 @Tuzo 描述的记录毫秒是可能的,但它充其量是没有意义的,最坏的情况是误导。

Eric Lippert 对此写了一个有趣的解释:https://stackoverflow.com/a/2143784/230428

任何值的精度最多为正负 50 毫秒(尽管这因机器而异 - 另一个不依赖于此的原因)。这是因为日期时间是为回答“现在是什么日期和时间?”这个问题而设计的。而不是“这需要多长时间?”的问题。对于后者,使用 Stopwatch 类。

显然,使用日志框架来处理和记录您的时间的便利听起来很诱人,但您不应该依赖它来处理低于秒精度的时间。

当我的 MVC OnActionExecuting 和 OnActionExecuted 日志同时返回到微秒级时,我第一次遇到这个问题。非常令人印象深刻,同样错误。

【讨论】:

  • 正如我所提到的,对于那些希望记录方法入口和出口的性能跟踪的人,请考虑使用 Stopwatch 的 Tracer 类。另请参阅 LogCallHandler,它还使用 AOP 方法提供了进入和退出时间。
  • 确实,Tracer 是一个更好的选择。我的回答的意思是,根据问题使用 EntLib 是没有意义的。
  • 感谢两位的澄清!
【解决方案2】:

您可以指定StandardCustom DateTime 将字符串格式化为时间戳模板令牌:

<formatters>
      <add 
        template="{timestamp(MM/dd/yyyy HH:mm:ss.fffffff)} {severity} {category} {message}" 
        type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="SingleLineFormatter" />
 </formatters>

这将输出如下内容:

06/01/2011 20:12:43.3405776 信息 一般 这是 留言

默认情况下,日期时间将采用 UTC 时间。如果您希望使用本地时间,请在格式字符串前加上“local:”。例如{timestamp(local:MM/dd/yyyy HH:mm:ss.fffffff)}

此外,如果您希望记录方法入口和出口的性能跟踪,您可能需要查看 Tracer 类。

【讨论】:

  • 如果您不想为当地时间提供格式,请使用:{timestamp(local)}
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多