Log4Net: définir des fichiers de sauvegarde Max sur RollingFileAppender avec date de rolling

j'ai la configuration suivante, mais je n'ai pas trouvé de documentation sur la façon de définir un maximum de fichiers de sauvegarde sur date rolling style. Je sais que vous pouvez le faire avec la taille de style rolling en utilisant les 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>
58
demandé sur Ryan Gates 2008-09-18 22:24:06

8 réponses

vous ne pouvez pas.

de l' log4net Référence du kit de développement

Classe RollingFileAppender

CAUTION

un nombre maximum de fichiers de sauvegarde lors de la modification des limites de date/heure n'est pas supporté.

44
répondu Chasler 2016-12-07 23:09:30

même si elle n'est pas prise en charge, voici comment j'ai géré cette situation:

C'est ma 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>

au démarrage de la demande je fais:

 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
    }

la méthode Sub est une méthode D'Extension, elle enveloppe fondamentalement la chaîne.format comme ainsi:

/// <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);
    }
}
37
répondu Jeff 2016-03-10 15:54:43

j'ai passé un certain temps à étudier cela il y a quelques mois. v1.2.10 ne supporte pas la suppression de fichiers journaux plus anciens basés sur le fait de rouler par date. Il est sur la liste des tâches pour la prochaine version. J'ai pris le code source et ajouté la fonctionnalité moi-même, et l'ai posté pour les autres s'ils sont intéressés. Le problème et le patch peuvent être trouvés à https://issues.apache.org/jira/browse/LOG4NET-27 .

11
répondu Mafu Josh 2010-03-12 17:40:51

pour limiter le nombre de logs, ne pas inclure l'année ou le mois dans le datepattern,p.ex. valeur du datePattern= "_dd".le journal'"

cela créera un nouveau journal chaque jour, et il sera écrasé le mois prochain.

7
répondu Phil 2016-06-07 12:19:49

Je ne sais pas exactement de quoi vous avez besoin. Voici un extrait d'un de mes lo4net.fichiers de configuration:

  <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>
3
répondu wcm 2008-09-18 18:32:47

j'ai récemment rencontré ce besoin en essayant de nettoyer les logs basés sur une valeur de configuration maxAgeInDays transmise à mon service... Comme beaucoup l'ont fait avant moi, j'ai été exposé au tunnel "feature" de NTFS, ce qui rend L'utilisation de FileInfo.CreationDate problématique (bien que j'ai depuis travaillé autour de cela aussi)...

Depuis que j'ai eu un motif pour aller, j'ai décidé de rouler ma propre méthode... Mon logger est configuré par programmation, donc je simplement appeler après mon enregistreur de programme d'installation est terminée...

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

ce n'est probablement pas la plus jolie approche, mais elle fonctionne plutôt bien pour nos besoins...

1
répondu mattezell 2013-03-12 15:09:40

NLog , qui est mis en place presque de la même façon que Log4Net (& est activement maintenu - même a le soutien pour .net Core), soutient les journaux de roulement basé sur la date.

1
répondu Coruscate5 2017-01-09 21:22:59

il est assez facile d'hériter d'un appender log4net et d'ajouter dire votre propre méthode de surpassement qui effectue le nettoyage des fichiers. J'ai outrepassé OpenFile pour faire ça. Voici un exemple d'appender log4net personnalisé pour vous aider à démarrer: https://stackoverflow.com/a/2385874/74585

0
répondu Matthew Lock 2017-05-23 12:02:27