2010-06-08 14 views
15

Come - se possibile - è possibile utilizzare NLog come un registratore di file di rollover? come se:Utilizzo di NLog come registratore di file di rollover

Voglio avere al massimo 31 file per 31 giorni e quando è iniziato un nuovo giorno, se c'è un log di registro di vecchio giorno ##. log, allora dovrebbe essere cancellato ma durante quel giorno tutti i log sono aggiunto e ci sarà almeno per 27 giorni.

risposta

21

Infine ho risolto con size-based file archival. Io uso un trucco per denominare il file dopo solo il giorno del mese e avevo bisogno dell'archiviazione di file basata sulle dimensioni perché aiuta davvero quando i log iniziano a crescere oltre qualche centinaio di megabyte. Aiuta a fare - ad esempio - blocchi da 20 MB di log, quindi si può facilmente dare un'occhiata veloce con uno strumento leggero come Notepad ++.

Funziona da quasi un anno. Ecco una versione semplificata del mio file NLog.config:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog autoReload="true" throwExceptions="true" 
     xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <variable name="LogDir" value="${specialfolder:folder=MyDocuments}/MyApp/Log"/> 
    <variable name="LogDay" value="${date:format=dd}"/> 
    <targets> 
    <target name="LogTarget1" xsi:type="File" fileName="${LogDir}/${LogDay}.log" encoding="utf-8" 
     maxArchiveFiles="10" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${LogDir}/{#######}.a" /> 
    </targets> 
    <rules> 
    <logger name="AppLog" writeTo="LogTarget1" /> 
    </rules> 
</nlog> 

Questa configurazione rende file di log 1 MB per ogni giorno del mese e mantenere al massimo 10 pezzi archiviati log 1 MB nella cartella My Documents\MyApp\Log; come 29.log, 30.log e 31.log.

Edit: E 'da tempo che io uso questo file NLog.config e copre praticamente tutti i casi di cui ho bisogno.Ho diversi livelli di registrazione provenienti da diverse classi in file separati e quando hanno ottenuto grandi, che riceveranno archiviati in base alle dimensioni, in modo oraria:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog autoReload="true" throwExceptions="true" internalLogFile="nlog-internals.log" 
     xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <variable name="LogHome" value="${basedir}/Log"/> 
    <variable name="DailyDir" value="${LogHome}/${date:format=yyyy}/${date:format=MM}/${date:format=dd}"/> 
    <variable name="HourlyArchive" value="${DailyDir}/${date:format=HH}-Archive/${level}-${logger}-{#######}-archived.a"/> 
    <variable name="AppLogPath" value="${DailyDir}/${level}-${logger}.log"/> 
    <variable name="DataLogPath" value="${DailyDir}/_data/inouts-${shortdate}.log"/> 
    <variable name="EventSource" value="Application" /> 
    <targets> 
    <target name="AppAsyncTarget" xsi:type="AsyncWrapper"> 
     <target xsi:type="RetryingWrapper" retryDelayMilliseconds="3000" retryCount="10"> 
     <target xsi:type="File" fileName="${AppLogPath}" encoding="utf-8" 
      maxArchiveFiles="50" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${HourlyArchive}" 
      layout="`${longdate}`${level}`${message}" /> 
     </target> 
    </target> 
    <target name="DataAsyncTarget" xsi:type="AsyncWrapper"> 
     <target xsi:type="RetryingWrapper" retryDelayMilliseconds="1500" retryCount="300"> 
     <target xsi:type="File" fileName="${DataLogPath}" encoding="utf-8" 
      layout="`${longdate}`${message}" /> 
     </target> 
    </target> 
    <target name="EventLogAsyncTarget" xsi:type="AsyncWrapper"> 
     <target xsi:type="RetryingWrapper"> 
     <target xsi:type="EventLog" source="${EventSource}" machineName="." /> 
     </target> 
    </target> 
    </targets> 
    <rules> 
    <logger name="Data" writeTo="DataAsyncTarget" final="true" /> 
    <logger name="Event" writeTo="EventLogAsyncTarget" final="true" /> 
    <logger name="*" writeTo="AppAsyncTarget" /> 
    </rules> 
</nlog> 

E in ogni classe che voglio una funzionalità di registrazione , Ho messo questo:

static readonly Logger SlotClassLogger = LogManager.GetCurrentClassLogger(); 
static Logger ClassLogger { get { return SlotClassLogger; } } 

Due logger aggiuntivi sono per l'accumulo di alcuni dati su base giornaliera e la scrittura in Windows Event Log; che sono a livello di app logger:

public static Logger DataLog { get; private set; } 
public static Logger AppEventLog { get; private set; } 

E dovrebbero essere inizializzare all'avvio app:

DataLog = LogManager.GetLogger("Data"); 
AppEventLog = LogManager.GetLogger("Event"); 

Nota: A volte si esce sulla applicazione si ottiene un'eccezione prodotto da NLog. È perché qualcosa che non è inizializzato, non può essere eliminato! Avete appena scrivere una voce vuota nel vostro registratore all'avvio dell'applicazione, dici:

DataLog.Info(string.Empty); 

Ho aggiunto questa limitazione dimensioni in modo il file di log possono essere visualizzati in (diciamo) Blocco note su un server di fascia bassa, per le recensioni veloci . Dovresti modificarli in base alle tue esigenze.

9

vorrei suggerire di separare il problema in due diversi aspetti:

  • di rotazione per un nuovo nome di file ogni giorno (? Tenete a mente il fuso orario; giorno UTC forse)
  • Eliminazione vecchio log file

Nella mia esperienza, sarebbe opportuno conservare la data nel nome del file di registro, ad es.

debug-2010-06-08.log 

Quella parte dovrebbe essere facile con NLog, data la examples in the docs.

Ora la seconda parte può essere facilmente eseguita in un secondo thread o anche in un processo completamente diverso: basta vedere quanti file sono presenti ed eliminare quelli meno recenti, se necessario. Trovare il "più vecchio" dovrebbe essere facile se la data è nel nome del file, anche se non vuoi fidarti delle informazioni del file system.

In effetti, guardando la documentazione NLog, sembra che il bersaglio "time-based file archival" può fare esattamente quello che vuoi ... ma anche se non lo fa, il normale approccio "un file di log al giorno" e posizionare il proprio la pulizia dovrebbe essere facile.

Problemi correlati