Ответ 1
Вы не можете.
от
log4net SDK Reference
Класс RollingFileAppender
Внимание
Максимальное количество резервных файлов при перетаскивании по границам даты/времени не поддерживается.
У меня есть следующая конфигурация, но я не могу найти документацию о том, как установить максимальные файлы резервных копий в стиле календаря даты. Я знаю, что вы можете сделать это с помощью стиля раскрутки по размеру, используя maxSizeRollBackups.
<appender name="AppLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="mylog.log" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Date" />
<datePattern value=".yyMMdd.'log'" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d %-5p %c - %m%n" />
</layout>
</appender>
Вы не можете.
от
log4net SDK Reference
Класс RollingFileAppender
Внимание
Максимальное количество резервных файлов при перетаскивании по границам даты/времени не поддерживается.
Даже если он не поддерживается, вот как я справился с этой ситуацией:
Это моя конфигурация:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\logs\LoggingTest\logfile.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>
При запуске приложения я:
XmlConfigurator.Configure();
var date = DateTime.Now.AddDays(-10);
var task = new LogFileCleanupTask();
task.CleanUp(date);
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using log4net;
using log4net.Appender;
using log4net.Config;
public class LogFileCleanupTask
{
#region - Constructor -
public LogFileCleanupTask()
{
}
#endregion
#region - Methods -
/// <summary>
/// Cleans up. Auto configures the cleanup based on the log4net configuration
/// </summary>
/// <param name="date">Anything prior will not be kept.</param>
public void CleanUp(DateTime date)
{
string directory = string.Empty;
string filePrefix = string.Empty;
var repo = LogManager.GetAllRepositories().FirstOrDefault(); ;
if (repo == null)
throw new NotSupportedException("Log4Net has not been configured yet.");
var app = repo.GetAppenders().Where(x => x.GetType() == typeof(RollingFileAppender)).FirstOrDefault();
if (app != null)
{
var appender = app as RollingFileAppender;
directory = Path.GetDirectoryName(appender.File);
filePrefix = Path.GetFileName(appender.File);
CleanUp(directory, filePrefix, date);
}
}
/// <summary>
/// Cleans up.
/// </summary>
/// <param name="logDirectory">The log directory.</param>
/// <param name="logPrefix">The log prefix. Example: logfile dont include the file extension.</param>
/// <param name="date">Anything prior will not be kept.</param>
public void CleanUp(string logDirectory, string logPrefix, DateTime date)
{
if (string.IsNullOrEmpty(logDirectory))
throw new ArgumentException("logDirectory is missing");
if (string.IsNullOrEmpty(logPrefix))
throw new ArgumentException("logPrefix is missing");
var dirInfo = new DirectoryInfo(logDirectory);
if (!dirInfo.Exists)
return;
var fileInfos = dirInfo.GetFiles("{0}*.*".Sub(logPrefix));
if (fileInfos.Length == 0)
return;
foreach (var info in fileInfos)
{
if (info.CreationTime < date)
{
info.Delete();
}
}
}
#endregion
}
Метод Sub - это метод расширения, он в основном обертывает string.format следующим образом:
/// <summary>
/// Extension helper methods for strings
/// </summary>
[DebuggerStepThrough, DebuggerNonUserCode]
public static class StringExtensions
{
/// <summary>
/// Formats a string using the <paramref name="format"/> and <paramref name="args"/>.
/// </summary>
/// <param name="format">The format.</param>
/// <param name="args">The args.</param>
/// <returns>A string with the format placeholders replaced by the args.</returns>
public static string Sub(this string format, params object[] args)
{
return string.Format(format, args);
}
}
Я потратил некоторое время на изучение этого несколько месяцев назад. v1.2.10 не поддерживает удаление более старых файлов журналов на основе календаря по дате. Он находится в списке задач для следующего выпуска. Я взял исходный код и сам добавил функциональность, и разместил его для других, если они заинтересованы. Проблема и патч можно найти на https://issues.apache.org/jira/browse/LOG4NET-27.
Чтобы ограничить количество журналов, не указывайте год или месяц в паспорте даты, например. datePattern value = "_dd'.log"
Это создаст новый журнал каждый день, и он будет перезаписан в следующем месяце.
Не уверен, что вам нужно. Ниже приведена выдержка из одного из моих файлов lo4net.config:
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<param name="File" value="App_Data\log"/>
<param name="DatePattern" value=".yyyy-MM-dd-tt".log""/>
<param name="AppendToFile" value="true"/>
<param name="RollingStyle" value="Date"/>
<param name="StaticLogFileName" value="false"/>
<param name="maxSizeRollBackups" value="60" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/>
</layout>
</appender>
Недавно я столкнулся с этой необходимостью при попытке очистить журналы журналов на основе значения конфигурации maxAgeInDays, переданного в мою службу... Как и многие из них, мне стало известно о функции NTFS Tunneling, которая использует FileInfo.CreationDate проблематично (хотя я с тех пор тоже работал над этим)...
Так как у меня был шаблон, чтобы уйти, я решил просто свернуть свой собственный метод очистки... Мой регистратор настроен программно, поэтому я просто вызываю следующее после завершения настройки моего регистратора...
//.........................
//Log Config Stuff Above...
log4net.Config.BasicConfigurator.Configure(fileAppender);
if(logConfig.DaysToKeep > 0)
CleanupLogs(logConfig.LogFilePath, logConfig.DaysToKeep);
}
static void CleanupLogs(string logPath, int maxAgeInDays)
{
if (File.Exists(logPath))
{
var datePattern = "yyyy.MM.dd";
List<string> logPatternsToKeep = new List<string>();
for (var i = 0; i <= maxAgeInDays; i++)
{
logPatternsToKeep.Add(DateTime.Now.AddDays(-i).ToString(datePattern));
}
FileInfo fi = new FileInfo(logPath);
var logFiles = fi.Directory.GetFiles(fi.Name + "*")
.Where(x => logPatternsToKeep.All(y => !x.Name.Contains(y) && x.Name != fi.Name));
foreach (var log in logFiles)
{
if (File.Exists(log.FullName)) File.Delete(log.FullName);
}
}
}
Вероятно, это не самый красивый подход, но он очень хорошо работает для наших целей...
NLog, который настроен почти так же, как Log4Net (активно поддерживается, даже поддерживает .NET. Core), поддерживает скользящие журналы на основе даты.
Довольно легко наследовать от приложения log4net и добавить свой собственный метод переопределения, который выполняет очистку файлов. Я переделал OpenFile, чтобы сделать это. Вот пример пользовательского приложения log4net, чтобы вы начали: fooobar.com/info/98035/...