Как использовать шаблон даты в верхнем или нижнем колонтитуле?
Здесь моя конфигурация appender из моего 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} ] " />
<conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} - %message" />
<footer value="[END] " />
</layout>
</appender>
Как я могу заставить это печатать дату/время в заголовке?
Ответы
Ответ 1
Простым способом сделать это является подкласс 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
Ответ здесь.
<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.
Также я заметил, что файл журнала не появится, пока вы не напишите первый оператор журнала.
Ответ 3
Я столкнулся с этой проблемой, и я быстро использовал обходной путь, чтобы использовать фиксированный верхний и нижний колонтитулы. Затем сделайте это, как только у вас появится объект ILog:
log.Info(string.Format("[START: {0} ]\r\n", dateString))
Итак, под заголовком вы получите необходимую информацию.
например
===Start===
[START: 2012-02-23 12:12:12 ]
logs...
Ответ 4
Основываясь на комментарии @Wizou. См. Документацию DynamicPatternLayout Class.
Я использую эту разницу в поведении, чтобы иметь время начала и окончания
Одним из важных различий между PatternLayout и DynamicPatternLayout является обработка параметров заголовка и нижнего колонтитула в конфигурации. Параметры заголовка и нижнего колонтитула для 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>