2011-04-06 19 views

Respuesta

3

No sé si esto responde su pregunta, pero parece que el 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 poder 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 del archivo de almacenamiento. El uso de la opción archiveNumbering le da cierto control sobre cómo están numerados los archivos de almacenamiento.

Lo siento, no pude 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.

8

Encontré que si archivé archivos con marcas de fecha en los nombres de archivos 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", ...); 
59

Usted puede simplemente utilizar la funcionalidad integrada de archivado. 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> 

Véase también la documentación de la file target

+1

¿Qué sucede si uso archiveAboveSize? esto ya no funcionará porque si tengo 7 archivos en un solo día, eliminaría todo el resto. ¿Existe alguna solucion para esto? –

+0

@UriAbramson En mi humilde opinión estos son ajustes exclusivos mutuos. – ccellar

+0

@ccellar Sé que esto es antiguo, pero ahora usted tiene: archiveNumbering = "DateAndSequence" –

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

     } 
2

Puede usar el nombre del día y establecer el maxArchiveFiles a 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" /> 
Cuestiones relacionadas