Sto lavorando con log4net. Desidero aggiungere un pulsante nella GUI che quando l'utente fa clic su quel pulsante, , il file di registro verrà cancellato. Come posso farlo?Come posso cancellare il file di log log4net?
Grazie mille
Sto lavorando con log4net. Desidero aggiungere un pulsante nella GUI che quando l'utente fa clic su quel pulsante, , il file di registro verrà cancellato. Come posso farlo?Come posso cancellare il file di log log4net?
Grazie mille
Non è supportato "out of the box" da log4net. Tuttavia, è possibile utilizzare RollingFileAppender e creare una classe/metodo manuale per pulire/eliminare il file di registro.
Per riferimento, Log4Net: set Max backup files on RollingFileAppender with rolling Date
Un altro approccio per evitare il file che viene bloccato potrebbe essere quella di impostare il livello di chiusura minimo sul file di registro tramite:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
ho avuto questo problema, anche.
avete bisogno di questo nella configurazione:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
Esattamente quello che stavo cercando. – cdmckay
Perfetto! Semplice, mi piace –
Sospetto che questo abbia un costo, forse qualcuno può commentare qui. Affinché questo funzioni, Log4Net probabilmente chiude il file e rilascia l'handle del file. Questa è un'operazione costosa perché la prossima scrittura richiederà l'allocazione di un nuovo handle di file e l'apertura del file. Mentre questo può vedere "perfetto", molto probabilmente causa un colpo di prestazioni. – Jazimov
Grazie ragazzi mi riescono chiaro il registro. Nel blocco appender del file di configurazione di registro ho aggiunto quella linea:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
Il codice che cancellare il file di log è:
RollingFileAppender fileAppender = LogManager.GetRepository()
.GetAppenders().FirstOrDefault(appender => appender is RollingFileAppender) as RollingFileAppender;
if (fileAppender != null && File.Exists(((RollingFileAppender)fileAppender).File))
{
string path = ((RollingFileAppender)fileAppender).File;
log4net.Appender.FileAppender curAppender = fileAppender as log4net.Appender.FileAppender;
curAppender.File = path;
FileStream fs = null;
try
{
fs = new FileStream(path, FileMode.Create);
}
catch(Exception ex)
{
(log4net.LogManager.GetLogger(this.GetType())).Error("Could not clear the file log", ex);
}
finally
{
if (fs != null)
{
fs.Close();
}
}
}
Grazie a tutti
Vedere la mia risposta. Credo che sia stata la direzione in cui ti ho indicato.Sono contento che tu l'abbia risolto. – Seany84
Se don voglio subire le implicazioni di prestazioni di avere un blocco minimo (vedi answer), quindi è possibile configurare temporaneamente gli appenders per utilizzare un blocco minimo, eliminare i file e quindi portare il comportamento predefinito indietro.
Esempio quando si sta utilizzando solo RollingFileAppenders:
// Release the lock on the log4net log files
var appenders = log4net.LogManager.GetRepository().GetAppenders();
foreach (var appender in appenders)
{
var rollingFileAppender = appender as log4net.Appender.RollingFileAppender;
if (rollingFileAppender != null)
{
rollingFileAppender.ImmediateFlush = true;
rollingFileAppender.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
rollingFileAppender.ActivateOptions();
}
}
I file sono ora liberi di essere eliminato senza problemi.
è sufficiente utilizzare il comando di
File.WriteAllText("C:/Users.../log.xml", "");
alla partenza dell'applicazione.
Grazie! ma quando provo ad eliminare il file, ottengo un'eccezione perché il log4net cattura il file. Come posso liberare il file di registro da log4net? –
È possibile utilizzare il metodo CloseFile() prima di chiamare delete. – Darek
Suppongo che sia una domanda a parte, ma fai come ha suggerito Darek. Facci sapere come vai avanti e non dimenticare di segnare come risposta se questo funziona per te. – Seany84