logging - subcarpetas - Eliminar archivos de registro después de x días
eliminar registros de programas desinstalados windows 10 (5)
Descubrí que si archivé archivos con marcas de fecha en los nombres de archivo de registro, el archivo de registro se confunde y {#}
siempre se traduce en "0", lo que hace que los registros antiguos nunca se eliminen. Además, si utilizo una referencia GDC en el nombre de archivo de registro, no cambia los registros en absoluto.
Ahora tengo que eliminar manualmente los registros antiguos si quiero estos sofisticados nombres de archivo de registro. El hecho de que tengan la fecha en el nombre del archivo les hace cambiar automáticamente de archivos.
// 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));
objetivo nlog:
filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}/logs/log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt"
GDC.Set("MySpecialId", ...);
Me gustaría iniciar sesión con Nlog usando el objetivo del archivo como en este example . ¿Cómo puedo realizar una eliminación de los archivos después de X
días sin archivarlos? ¿O es posible archivar los archivos en la misma carpeta?
No sé si esto responde su pregunta, pero parece que maxArchiveFiles
debe hacer lo que quiera. Realmente no he usado esta opción yo mismo, así que no puedo decirlo con certeza. Sin duda puede "archivar" sus archivos de registro en la misma carpeta.
Si fuera yo, haría un programa muy pequeño que hace un poco de registro y establecer el tiempo ( archiveEvery="minute"
) para que sea fácil forzar la lógica de archivo para poner en marcha. Establecer maxArchiveFiles
a algo así como 5 y ver si NLog solo tiene 5 archivos de registro. Ejecute su programa por un tiempo, tal vez generando mensajes de registro a través de un temporizador para que pueda espaciar fácilmente los mensajes de registro durante el tiempo suficiente para que la lógica de archivado / rodaje de NLog se active.
Experimente con la plantilla de nombres de archivo de archivo. El uso de la opción archiveNumbering
le da cierto control sobre cómo están numerados los archivos de almacenamiento.
Lamento no poder dar una respuesta más definitiva o un ejemplo concreto, pero tampoco he usado esas opciones, así que tendría que hacer el mismo experimento (s) y estoy presionado por el tiempo en este momento.
Puede usar el nombre del día y establecer maxArchiveFiles
en un número fijo. Por ejemplo, antes de cada día de la semana, puede almacenar un máximo de 100 archivos de 100 Kb:
<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" />
Simplemente podría usar la funcionalidad de archivo integrada. Esta configuración mantendrá 7 archivos de registro antiguos además de su registro actual. La limpieza es hecha por NLog automáticamente.
<?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>
Ver también la documentación del archivo objetivo
//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();
}
}