如何在页眉/页脚中使用日期模式?

时间:2009-11-10 22:45:52

标签: log4net log4net-configuration

这是我的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>

如何在标题中打印日期/时间?

4 个答案:

答案 0 :(得分: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 doc。

此外,我注意到在您编写第一个日志语句之前,日志文件不会出现。

答案 1 :(得分: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>

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

答案 2 :(得分:1)

我遇到了这个问题,我使用的快速解决方法是使用固定的页眉和页脚。然后在有ILog对象后立即执行此操作:

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

所以在标题下你会得到你想要的信息。

E.g

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

logs...

答案 3 :(得分:0)

@Wizou's评论为基础。请参阅DynamicPatternLayout Class文档。

我实际上正在使用这种行为差异来获得开始和结束时间

  

PatternLayout和DynamicPatternLayout之间的一个重要区别是处理配置中的页眉和页脚参数。 DynamicPatternLayout的Header和Footer参数必须在语法上以PatternString的形式出现,但不应将其标记为log4net.Util.PatternString类型。这样做会导致模式在配置时静态转换,并导致DynamicPatternLayout执行与PatternLayout相同的操作。

将Header上的类型设置为PatternString,但将Footer保留为动态

<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>