Как использовать шаблон даты в верхнем/нижнем колонтитуле?

Вот моя конфигурация приложения из моего 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>

Как я могу заставить это печатать дату/время в заголовке?


person User    schedule 10.11.2009    source источник


Ответы (4)


Простой способ сделать это — создать подкласс 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>

Поскольку вы переопределили верхний и нижний колонтитулы, вам даже не нужно добавлять их сюда. Заголовок будет добавляться каждый раз при запуске вашего приложения и каждый раз при переносе файла.

person pduncan    schedule 05.01.2010
comment
Есть ли у вас ссылки на примеры создания подклассов класса PatternLayout? - person User; 07.01.2010
comment
Я добавил пример к ответу для вас. - person pduncan; 08.01.2010
comment
Есть ли способ переопределить заголовок таким образом, чтобы он использовал атрибут значения элемента заголовка в вашей конфигурации xml, как это делает класс PatternLayout? - person User; 11.01.2010
comment
Я не уверен, не загружая исходный код. Но даже если бы вы могли это сделать, разве это не вернуло бы вас к исходной проблеме? - person pduncan; 12.01.2010

Ответ с здесь.

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

Также я заметил, что файл журнала не появится, пока вы не напишете первый оператор журнала.

person Community    schedule 15.10.2012
comment
Я только что попробовал это, и похоже, что эти шаблоны разрешаются как при запуске, что приводит к тому, что нижний колонтитул имеет точно такое же время (разница в 2 мс), что и в заголовке. - person sluki; 10.10.2016
comment
@sluki: используйте <layout type="log4net.Layout.DynamicPatternLayout"> вместо PatternLayout - person Wizou; 13.10.2016

Я столкнулся с этой проблемой, и быстрый обходной путь, который я использовал, — просто использовать фиксированный верхний и нижний колонтитулы. Затем сделайте это, как только у вас появится объект ILog:

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

Таким образом, прямо под заголовком вы получите нужную информацию.

E.g

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

logs...
person Martin Capodici    schedule 23.02.2012

Основываясь на комментарии @Wizou. См. документацию по DynamicPatternLayout Class. .

На самом деле я использую эту разницу в поведении, чтобы иметь время начала и окончания.

Одним из важных различий между PatternLayout и DynamicPatternLayout является обработка параметров Header и Footer в конфигурации. Параметры заголовка и нижнего колонтитула для DynamicPatternLayout синтаксически должны иметь форму 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>

person k3yz101    schedule 21.10.2017