13

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

4 回答 4

21

从这里回答。

<layout type="log4net.Layout.DynamicPatternLayout">
  ...
  <header value="[BEGIN LOGGING AT %date]%newline"/>
  <footer value="[END LOGGING AT %date]%newline"/>
  ...
</layout>

像魅力一样为我工作。无需编写一段代码。

同样在我们通常使用的项目中:

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

还可以查看PatternString文档。

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

于 2012-10-15T12:38:16.127 回答
14

一个简单的方法是继承log4net.Layout.PatternLayout和覆盖页眉和页脚。然后你可以在你的 Header 中添加任何你想要的东西:日期戳、机器名、用户名、程序集版本,或者你想要的任何东西:

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>

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

于 2010-01-05T21:45:08.257 回答
3

基于@Wizou 的评论。请参阅DynamicPatternLayout 类文档。

我实际上是在使用这种行为差异来确定开始和结束时间

PatternLayout 和 DynamicPatternLayout 之间的一个重要区别是配置中 Header 和 Footer 参数的处理。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>

于 2017-10-21T20:36:11.083 回答
1

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

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

因此,在标题下方,您将获得所需的信息。

例如

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

logs...
于 2012-02-23T00:37:05.917 回答