Как я могу установить log4net для регистрации моих файлов в разные папки каждый день?
- Я хочу сохранить все журналы в течение каждого дня в папке с именем YYYYMMdd - log4net должен обрабатывать создание новой папки в зависимости от системного datetime - как я могу настроить это?
- Я хочу сохранить все журналы в течение дня в n файлах 1 МБ - я не хочу переписывать старые файлы, но для того, чтобы действительно иметь все журналы в течение одного дня - как я могу настроить это?
Я использую С#
Отношения
Alex
Ответы
Ответ 1
Попробуйте (это должно быть хорошо!):
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\\" />
<appendToFile value="true" />
<DatePattern value="yyyy\\\\MM\\\\dd'.inf.log'" />
<rollingStyle value="Date" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<header value="[Header] " />
<footer value="[Footer] " />
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
</layout>
</appender>
Он создаст файл журнала с именем 'logs\2010\04\02.inf.log (пусть дата будет 2010-04-02)
Ответ 2
Спасибо всем.
Мы создали SortByFolderFileAppender, которые наследуют от RollingFileAppender
Пример конечного результата:
где \Logs\20100305\Client-104615,0
namespace CustomLogging
{
public class SortByFolderFileAppender : log4net.Appender.RollingFileAppender
{
protected override void OpenFile(string fileName, bool append)
{
//Inject folder [yyyyMMdd] before the file name
string baseDirectory = Path.GetDirectoryName(fileName);
string fileNameOnly = Path.GetFileName(fileName);
string newDirectory = Path.Combine(baseDirectory, DateTime.Now.ToString("yyyyMMdd"));
string newFileName = Path.Combine(newDirectory, fileNameOnly);
base.OpenFile(newFileName, append);
}
}
}
<appender name="SortByFolderFileAppender" type="CustomLogging.SortByFolderFileAppender">
<file type="log4net.Util.PatternString" value="Logs\Client"/>
<appendToFile value="true"/>
<rollingStyle value="Composite"/>
<datePattern value="-HHmmss"/>
<maxSizeRollBackups value="40"/>
<maximumFileSize value="1MB"/>
<countDirection value="1"/>
<encoding value="utf-8"/>
<staticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
</layout>
</appender>
Ответ 3
Я считаю, вы можете создать свой собственный appender, основанный на классе FileAppender
. Возможно, вам придется переопределить метод OpenFile
, чтобы создать файл в нужном месте.
Ответ 4
Вы можете использовать файл rolllogfileappender, который создает файлы с именем по дате и запускает новый файл в полночь. Затем просто напишите script, который переместит их к правильной карте в 00.01.
Что касается регистрации всех файлов в течение одного дня с максимальным объемом 1 МБ на файл, вот пример:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="Logging\\MWLog"/>
<appendToFile value="true"/>
<rollingStyle value="Composite"/>
<datePattern value="-yyyyMMdd"/>
<maxSizeRollBackups value="-1"/>
<maximumFileSize value="1MB"/>
<countDirection value="1"/>
<encoding value="utf-8"/>
<staticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
</layout>
</appender>
Ответ 5
Чтобы построить из ответа выше, используя SortByFolderFileAppender.
Вот как мы решили проблему, используя дату календаря для имен файлов журнала. Я изменил staticLogFileName на true, поэтому все имя файла передается в метод OpenFile.
Если имя файла заканчивается на ".log", то ничего не нужно добавлять. Я предполагаю, что произошла какая-то блокировка, и я хочу, чтобы log4net снова попытался использовать одно и то же имя файла, надеясь, что предыдущая блокировка будет выпущена.
Хотя, я не уверен, что это может привести к бесконечному вызову OpenFile, если файл заблокирован и не отпустит его. Мы создали веб-службу с использованием шаблона потребителя-производителя, чтобы регистрировать все в одном месте из всех приложений в системе, которая в настоящее время насчитывает десять и растет.
Нам не нужно включать log4net в любое из других приложений, но нам нужно создать класс веб-клиента, доступный для всех приложений, которые будут использоваться для входа в веб-службу.
Результат для имени файла - "Журналы\Клиент\2017\11\08.log" и, очевидно, меняется каждый день.
protected override void OpenFile( string fileName, bool append )
{
// append "\yyyy\mm\dd.log" to create the correct filename.
if ( !fileName.EndsWith( ".log") )
fileName = [email protected]"{fileName}\{DateTime.Now:yyyy\\MM\\dd}.log";
base.OpenFile( fileName, append );
}
Модификация конфигурации сверху.
<appender name="xxxRollingFileAppender" type="namespace.xxxRollingFileAppender">
<file value="Logs\Client"/>
<staticLogFileName value="true"/>
<appendToFile value="true"/>
<maxSizeRollBackups value="40"/>
<maximumFileSize value="1MB"/>
<encoding value="utf-8"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
</layout>
</appender>