Je voudrais me connecter avec Nlog en utilisant le fichier cible comme dans ce 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?
Vous pouvez simplement utiliser la fonctionnalité d'archivage intégrée. Ce paramètre conservera 7 anciens fichiers journaux en plus de votre journal actuel. Le nettoyage est effectué 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 de la cible du fichier
J'ai constaté que si j'archive des fichiers avec des horodatages dans les noms de fichiers journaux, le journal d'archivage devient confus et {#}
se traduit toujours par "0", les anciens journaux ne sont jamais supprimés. De plus, si j'utilise une référence GDC dans le nom du fichier journal, cela ne change pas du tout les journaux.
Je dois maintenant supprimer manuellement les anciens journaux si je veux ces noms de fichiers de journaux de fantaisie. Le fait qu'ils aient la date dans le nom de fichier les amène à changer automatiquement de fichier.
// 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));
cible nlog:
filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}\logs\log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt"
GDC.Set("MySpecialId", ...);
Vous pouvez utiliser le nom du jour et définir le maxArchiveFiles
sur un nombre fixe. Par exemple, pour chaque jour de la semaine, vous pouvez stocker un maximum de 100 fichiers de 100 Ko:
<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" />
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 réellement 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 un peu de journalisation et régler l'heure (archiveEvery="minute"
) pour qu'il soit facile de forcer la logique d'archivage à démarrer. Définissez maxArchiveFiles
sur quelque chose comme 5 et voyez si NLog ne conserve que 5 fichiers journaux. Exécutez votre programme pendant un certain temps, en générant peut-être des messages de journal via une minuterie afin que vous puissiez facilement espacer les messages de journal pendant suffisamment de temps pour que la logique d'archivage/roulement de NLog entre en action.
Expérimentez avec le modèle de dénomination du fichier d'archive. L'utilisation de l'option archiveNumbering
vous permet de contrôler la numérotation des fichiers d'archive.
Désolé, je n'ai pas pu donner une réponse plus définitive ou un exemple concret, mais je n'ai pas utilisé ces options non plus, donc je n'aurais qu'à faire les mêmes expériences et je suis pressé par le temps en ce moment.
//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();
}
}
NLog 4.5 (ou plus récent) facilite la configuration des archives. Vous venez de configurer fileName
et maxArchiveFiles
:
<target name="logfile" type="File" fileName="Log-${shortdate}.txt" maxArchiveFiles="7" />
Voir aussi: https://github.com/NLog/NLog/wiki/File-target#archive-old-log-files
NLog 4.7 (ou plus récent) introduit la nouvelle option maxArchiveDays
qui inspecte l'horodatage réel des fichiers journaux. Utile lorsqu'il est combiné avec archiveAboveSize
.
De NLog 4.5 (ou plus récent), vous pouvez utiliser ce qui suit si vous souhaitez la suppression après 7 jours, mais également un espace utilisé limité par jour, 10 Mo dans cet exemple:
<target xsi:type="File" name="f"
fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=toString}"
archiveEvery="Thursday"
maxArchiveFiles="7"
archiveAboveSize ="10485760"/>```