【问题标题】:How do I use a date pattern in a header/footer?如何在页眉/页脚中使用日期模式?
【发布时间】:2009-11-10 22:45:51
【问题描述】:

这是我的 app.config 中的附加程序配置。这只是打印出文字字符串而不是将其转换为日期(即,它实际上打印出“[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>

我怎样才能让它在标题中打印日期/时间?

【问题讨论】:

    标签: log4net log4net-configuration


    【解决方案1】:

    here的回答。

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

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

    【讨论】:

    • 我刚试过这个,看起来这些模式在启动时都得到了解决,这导致页脚与页眉中的时间完全相同(2ms 差异)。
    • @sluki:使用&lt;layout type="log4net.Layout.DynamicPatternLayout"&gt; 而不是PatternLayout
    【解决方案2】:

    一个简单的方法是继承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。

    【讨论】:

    • 您有任何指向 PatternLayout 类子类化示例的链接吗?
    • 我已经为你添加了一个例子来回答你。
    • 有没有办法像 PatternLayout 类一样覆盖 Header 以在你的 xml 配置中使用 header 元素的 value 属性?
    • 不下载源代码我不确定。但即使你能做到这一点,难道这不会让你回到原来的问题吗?
    【解决方案3】:

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

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

    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>

    【讨论】:

    【解决方案4】:

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

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

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

    例如

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

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多