it-swarm.com.de

Log4Net: Legen Sie Max. Sicherungsdateien auf dem RollingFileAppender mit dem fortlaufenden Datum fest

Ich habe die folgende Konfiguration, kann jedoch keine Dokumentation zum Festlegen einer maximalen Anzahl von Sicherungsdateien für den Rolling-Stil "Datum" finden. Ich weiß, dass Sie dies mit Hilfe der maxSizeRollBackups mit rollendem Format tun können.

<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>
62
Ricky Supit

Das kannst du nicht.

from log4net SDK-Referenz
RollingFileAppender-Klasse

[~ # ~] Vorsicht [~ # ~]

Eine maximale Anzahl von Sicherungsdateien beim Rollen an Datums-/Zeitgrenzen wird nicht unterstützt.

46
Chasler

Obwohl es nicht unterstützt wird, habe ich wie folgt mit dieser Situation umgegangen:

Das ist meine Konfiguration:

    <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>

Beim Start der Anwendung mache ich:

 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
    }

Die Sub-Methode ist eine Erweiterungsmethode, die im Grunde genommen string.format wie folgt umschließt:

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

Ich habe mich vor ein paar Monaten damit beschäftigt. v1.2.10 unterstützt das Löschen älterer Protokolldateien basierend auf dem Roll-by-Datum nicht. Es ist auf der Aufgabenliste für die nächste Version. Ich nahm den Quellcode und fügte die Funktionalität selbst hinzu und postete sie für andere, wenn sie interessiert sind. Das Problem und der Patch finden Sie unter https://issues.Apache.org/jira/browse/LOG4NET-27 .

11
Mafu Josh

Um die Anzahl der Protokolle zu begrenzen, geben Sie weder das Jahr noch den Monat in das Datumsmuster ein, z. datePattern value = "_ dd'.log '"

Dadurch wird jeden Tag ein neues Protokoll erstellt und es wird nächsten Monat überschrieben.

7
Phil

Ich weiß nicht genau, was ich brauche. Unten sehen Sie einen Auszug aus einer meiner lo4net.config-Dateien:

  <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>
2
wcm

Ich bin kürzlich auf diese Notwendigkeit gestoßen, als ich versuchte, Protokollprotokolle basierend auf einem maxAgeInDays-Konfigurationswert zu bereinigen, der an meinen Dienst übergeben wurde (obwohl ich seitdem auch daran gearbeitet habe) ...

Da ich ein zu löschendes Muster hatte, habe ich mich dazu entschlossen, nur meine eigene Bereinigungsmethode zu rollen ... Mein Logger ist programmgesteuert konfiguriert, daher rufe ich nur Folgendes auf, nachdem mein Logger-Setup abgeschlossen ist ...

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

Wahrscheinlich nicht der schönste Ansatz, aber für unsere Zwecke ziemlich gut geeignet ...

1
mattezell

NLog , das fast wie Log4Net eingerichtet ist (& wird aktiv gewartet - unterstützt sogar .NET Core), unterstützt fortlaufende Protokolle basierend auf dem Datum.

1
Coruscate5

Es ist ziemlich einfach, von einem log4net-Appender zu erben und eine eigene Überschreibungsmethode hinzuzufügen, mit der Dateien bereinigt werden. Ich habe OpenFile überschrieben, um dies zu tun. Hier ist ein Beispiel für einen benutzerdefinierten log4net-Appender: https://stackoverflow.com/a/2385874/74585

0
Matthew Lock