Подтвердить что ты не робот

Log4Net: установите максимальные резервные файлы на 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>
4b9b3361

Ответ 1

Вы не можете.

от log4net SDK Reference
Класс RollingFileAppender

Внимание

Максимальное количество резервных файлов при перетаскивании по границам даты/времени не поддерживается.

Ответ 2

Даже если он не поддерживается, вот как я справился с этой ситуацией:

Это моя конфигурация:

    <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);
    }
}

Ответ 3

Я потратил некоторое время на изучение этого несколько месяцев назад. v1.2.10 не поддерживает удаление более старых файлов журналов на основе календаря по дате. Он находится в списке задач для следующего выпуска. Я взял исходный код и сам добавил функциональность, и разместил его для других, если они заинтересованы. Проблема и патч можно найти на https://issues.apache.org/jira/browse/LOG4NET-27.

Ответ 4

Чтобы ограничить количество журналов, не указывайте год или месяц в паспорте даты, например. datePattern value = "_dd'.log"

Это создаст новый журнал каждый день, и он будет перезаписан в следующем месяце.

Ответ 5

Не уверен, что вам нужно. Ниже приведена выдержка из одного из моих файлов lo4net.config:

  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="App_Data\log"/>
    <param name="DatePattern" value=".yyyy-MM-dd-tt&quot;.log&quot;"/>
    <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>

Ответ 6

Недавно я столкнулся с этой необходимостью при попытке очистить журналы журналов на основе значения конфигурации 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);
        }
    }
}

Вероятно, это не самый красивый подход, но он очень хорошо работает для наших целей...

Ответ 7

NLog, который настроен почти так же, как Log4Net (активно поддерживается, даже поддерживает .NET. Core), поддерживает скользящие журналы на основе даты.

Ответ 8

Довольно легко наследовать от приложения log4net и добавить свой собственный метод переопределения, который выполняет очистку файлов. Я переделал OpenFile, чтобы сделать это. Вот пример пользовательского приложения log4net, чтобы вы начали: fooobar.com/info/98035/...