Supprimer les fichiers journaux après x jours

5 réponses

vous pouvez simplement utiliser la fonctionnalité d'archivage intégrée. Ce paramètre conservera 7 vieux fichiers journaux en plus de votre journal actuel. Le nettoyage est fait par NLog automatiquement.

<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
        <target name="file" xsi:type="File"
            layout="${longdate} ${logger} ${message}" 
            fileName="${basedir}/logs/logfile.txt" 
            archiveFileName="${basedir}/logs/log.{#}.txt"
            archiveEvery="Day"
            archiveNumbering="Rolling"
            maxArchiveFiles="7"
            concurrentWrites="true" />
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="file" />
    </rules>
</nlog>

Voir aussi la documentation du file target

66
répondu ccellar 2016-09-29 21:10:14

j'ai trouvé que si j'archive des fichiers avec des datations dans les noms de fichiers log, le log d'archive devient confus et {#} se traduit toujours par" 0 " ce qui fait que les vieux journaux ne sont jamais effacés. De plus, si j'utilise une référence GDC dans le nom du fichier log, cela ne change pas du tout les journaux.

je dois maintenant supprimer manuellement les vieilles logs si je veux ces noms de fichiers de log de fantaisie. Le fait qu'ils aient la date dans le nom du fichier les oblige à changer automatiquement de fichiers.

// Delete log files older than X days

var dirInfo = new DirectoryInfo(".");
var oldestArchiveDate = DateTime.Now - new TimeSpan(30, 0, 0, 0);
foreach (FileInfo fi in dirInfo.GetFiles())
    if (fi.Name.StartsWith("log-") && fi.Name.EndsWith(".txt") && fi.CreationTime < oldestArchiveDate)
        fi.Delete();

var midnight = DateTime.Today.AddDays(1);
_oldLogCleanUpThread = new System.Threading.Timer(OldLogCleanUpThreadMethod, null, midnight - DateTime.Now, TimeSpan.FromDays(1));

nlog cible:

 filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}\logs\log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt"
GDC.Set("MySpecialId", ...);
9
répondu Curtis 2016-09-29 21:12:37

Je ne sais pas si cela répond à votre question, mais il semble que le maxArchiveFiles devrait faire ce que vous voulez. Je n'ai pas utilisé cette option moi-même, donc je ne peux pas en être sûr. Vous pouvez certainement "archiver" vos fichiers journaux dans le même dossier.

Si c'était moi, je ferais un très petit programme qui fait de la journalisation et de régler l'heure ( archiveEvery="minute" ), de sorte qu'il est facile de forcer l'archivage logique pour le coup. Mettez maxArchiveFiles à quelque chose comme 5 et voir si NLog ne conserve que 5 fichiers log. Exécutez votre programme pendant un certain temps, peut-être en générant des messages de journal via une minuterie de sorte que vous pouvez facilement espacer les messages de journal sur assez de temps que l'archivage de NLog/la logique de roulement entre en action.

expérimente avec le modèle de nom de fichier d'archives. L'utilisation de l'option archiveNumbering vous donne un certain contrôle sur la façon dont les fichiers d'archives sont numérotés.

Désolé Je ne pouvais pas donner une réponse plus définitive ou un exemple concret, mais je n'ai pas utilisé ces options non plus, donc je devrais juste faire la même expérience(s) et je suis pressé pour le temps en ce moment.

3
répondu wageoghe 2011-04-08 15:36:57

vous pouvez utiliser le nom du jour et définir le maxArchiveFiles à un nombre fixe. Par exemple, pour chaque jour de la semaine, vous pourriez stocker un maximum de 100 fichiers de 100Kb:

<variable name="dayname" value="${date:format=dddd}" />

<target name="logfile" xsi:type="File"
        fileName="${basedir}/Logs/MyLog_${dayname}.txt"
        archiveFileName="${basedir}/Logs/Archives/MyLog_${dayname}.{#####}.txt"
        archiveAboveSize="102400"
        archiveNumbering="Sequence"            
        maxArchiveFiles="100"
        concurrentWrites="true"
        keepFileOpen="false"
        encoding="iso-8859-2" />   
3
répondu ilCosmico 2016-09-29 21:13:54
     //Store the number of days after which you want to delete the logs.
     int Days = 30;

     // Storing the path of the directory where the logs are stored.
     String DirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + "\Log(s)\";

     //Fetching all the folders.
     String[] objSubDirectory = Directory.GetDirectories(DirPath);

     //For each folder fetching all the files and matching with date given 
     foreach (String subdir in objSubDirectory)     
        {
            //Getting the path of the folder                 
            String strpath = Path.GetFullPath(subdir);
            //Fetching all the files from the folder.
            String[] strFiles = Directory.GetFiles(strpath);
            foreach (string files in strFiles)
            {
                //For each file checking the creation date with the current date.
                FileInfo objFile = new FileInfo(files);
                if (objFile.CreationTime <= DateTime.Now.AddDays(-Days))
                {
                    //Delete the file.
                    objFile.Delete();
                }
            }

            //If folder contains no file then delete the folder also.
            if (Directory.GetFiles(strpath).Length == 0)
            {
                DirectoryInfo objSubDir = new DirectoryInfo(subdir);
                //Delete the folder.
                objSubDir.Delete();
            }

        }
1
répondu Arihant Lodha 2016-09-29 21:13:35