Supprimer les fichiers journaux après x jours
j'aimerais me connecter avec Nlog en utilisant la cible du fichier comme dans cet" exemple . Comment puis-je réaliser une suppression des fichiers après X
jours sans les archiver? Ou est-il possible d'archiver les fichiers dans le même dossier?
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
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", ...);
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.
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" />
//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();
}
}