Domanda

Come - se possibile - posso usare NLog come un file di rollover logger? come se:

voglio avere al massimo 31 file per 31 giorni e in caso di nuove giornata è iniziata, se v'è un vecchio file di log giorno ##. Log, allora dovrebbe essere eliminato, ma in quel giorno tutti i registri vengono aggiunte e sarà lì almeno per 27 giorni.

È stato utile?

Soluzione

Finalmente ho risolto con formato basato su file d'archivio . Io uso un trucco per il nome del file dopo appena il giorno del mese e avevo bisogno il file d'archivio dimensioni basati su perché in realtà aiuta quando i registri inizia a crescere oltre un centinaio di mega-byte. Essa contribuisce a rendere - per esempio -. 20 pezzi MB di log, così si può facilmente prendere un rapido sguardo con uno strumento leggero come Notepad ++

Si sta lavorando per quasi un anno ormai. 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 archiviati 1 pezzi di registro MB nella cartella My Documents\MyApp\Log; come 29.log, 30.log e 31.log.

Modifica 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 archiviate 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 in questo modo:

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

Due logger aggiuntivi sono da battitura alcuni dati su base giornaliera e per iscritto al registro eventi di Windows; quali sono logger a livello di app:

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

E dovrebbero essere inizializzazione all'avvio app:

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

Nota: A volte su di voi app all'uscita si ottiene un'eccezione prodotto da NLog. È perché qualcosa che non è inizializzata, non può ottenere disposti! Avete appena scrivere una voce vuota nel vostro registratore alla partenza app, dice:

DataLog.Info(string.Empty);

Ho aggiunto questa limitazione di dimensione del file di registro in modo possono essere visualizzati in (diciamo) Blocco note su un server di fascia bassa, per le recensioni veloci. Si dovrebbe modificarli in base alle esigenze.

Altri suggerimenti

vorrei suggerire di separare il problema in due aspetti diversi:

  • rotolamento per un nuovo nome di file ogni giorno (tenere a mente il fuso orario;? Il giorno UTC forse)
  • Eliminazione vecchi file di log

Nella mia esperienza sarebbe la pena tenere la data nel nome del file di registro, per esempio.

debug-2010-06-08.log

Questa parte dovrebbe essere facile con NLog, data la esempi nella documentazione .

Ora la seconda parte può essere facilmente fatto in un secondo thread o forse anche un processo completamente diverso - ha solo bisogno di vedere quanti file sono presenti ed eliminare le più antiche, se necessario. Trovare il più "vecchio" dovrebbe essere facile se la data è nel nome del file, anche se non si vuole fidarsi delle informazioni del file system.

In realtà, guardando la documentazione NLog, sembra che il " del file di archiviazione in base al tempo "target può fare esattamente quello che vuoi ... ma nemmeno se lo fa, il normale 'l'approccio un file di log al giorno' e posizionare il proprio clean-up dovrebbe essere facile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top