Even if it is not supported, here is how I dealt with this situation:
This is my configuration:
<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>
When starting the application, I:
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 }
The Sub method is an extension method, it basically wraps string.format as follows:
/// <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); } }
Jeff May 26 '10 at 20:40 2010-05-26 20:40
source share