2009-11-10 68 views
12

这是我的app.config中的appender配置。这只是打印出文字字符串,而不是将其翻译成日期(即,它直接打印“[START:%date {MM/dd/yy HH:mm}]”)。如何在页眉/页脚中使用日期模式?

<appender name="RollingLogFileAppender" 
      type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\somelog" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="-yyyy-MM-dd'.txt'" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <header value="[START: %date{MM/dd/yy HH:mm} ]&#13;&#10;" /> 
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} - %message" /> 
    <footer value="[END]&#13;&#10;&#13;&#10;" /> 
    </layout> 
</appender> 

我怎样才能得到这个在标题中打印日期/时间?

回答

14

执行此操作的简单方法是将子类log4net.Layout.PatternLayout并覆盖页眉和页脚。然后,你可以添加任何你想你的头:日期戳,计算机名,用户名,程序集的版本,或任何你的心脏的欲望:

using System; 
using log4net.Layout; 

namespace MyAssembly 
{ 
    class MyPatternLayout : PatternLayout 
    { 
     public override string Header 
     { 
      get 
      { 
       var dateString = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 
       return string.Format("[START: {0} ]\r\n", dateString); 
      } 
     } 
    } 
} 

包括在你的装配这个新类,并使用新的类型您的文件,如下所示:

<layout type="MyAssembly.MyPatternLayout"> 
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} - %message" /> 
</layout> 

由于您覆盖了页眉和页脚,因此您甚至不需要在此处添加它。每次您的应用程序启动时,每次文件翻转时都会添加标题。

+0

你是否有子类的PatternLayout类的例子有任何联系? – User 2010-01-07 18:34:19

+0

我已经为你解答了一个例子。 – pduncan 2010-01-08 16:37:44

+0

有没有一种方法可以重写Header,使其像XML中的标题元素的值属性一样PatternLayout类呢? – User 2010-01-11 17:22:19

1

我遇到了这个问题,我使用的一个快速解决方法是只使用一个固定的页眉和页脚。然后,只要你有ILog的对象做到这一点:

log.Info(string.Format("[START: {0} ]\r\n", dateString))

所以才下的头部,你就会得到你想要的信息。

E.g

===Start=== 
[START: 2012-02-23 12:12:12 ] 

logs... 
17

here解答。

像一个魅力
<header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" /> 
<footer value="[END LOGGING AT %date]%newline" type="log4net.Util.PatternString" /> 

为我工作。无需编写一段代码。

此外,在项目中我们通常使用:

<header type="log4net.Util.PatternString" value="Our Application Name version %property{Assembly.Version}, .NET version %property{Runtime.Version}, %date ***%newline"/> 

看看PatternString文档也。

另外我注意到日志文件不会出现,直到你写第一个日志语句。

+0

我只是试过这个,它看起来像这些模式都解决了在启动时导致页脚与完全相同的时间(2毫秒差异)在页眉。 – sluki 2016-10-10 11:26:22

+2

@sluki:使用''而不是'PatternLayout' – Wizou 2016-10-13 12:08:57

0

建立在@Wizou's评论。请参阅DynamicPatternLayout Class文档。实际上,我使用这种行为差异有开始和结束时间的PatternLayout和DynamicPatternLayout之间

一个重要的区别

在配置页眉和页脚参数的处理。 DynamicPatternLayout的Header和Footer参数必须在语法上以PatternString的形式存在,但不能标记为log4net.Util.PatternString类型。这样做会导致模式在配置时被静态转换,并导致DynamicPatternLayout执行与PatternLayout相同的操作。

在报头中设置类型PatternString但在离开页脚动态

<layout type="log4net.Layout.DynamicPatternLayout"> <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" type="log4net.Util.PatternString" /> <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> </layout>