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.