2012-07-29 11 views

risposta

4

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" /> 
+0

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? –

+1

È possibile utilizzare il metodo CloseFile() prima di chiamare delete. – Darek

+0

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

6

ho avuto questo problema, anche.

avete bisogno di questo nella configurazione:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

Esattamente quello che stavo cercando. – cdmckay

+0

Perfetto! Semplice, mi piace –

+0

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

2

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

+0

Vedere la mia risposta. Credo che sia stata la direzione in cui ti ho indicato.Sono contento che tu l'abbia risolto. – Seany84

1

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.

0

è sufficiente utilizzare il comando di

File.WriteAllText("C:/Users.../log.xml", ""); 

alla partenza dell'applicazione.

Problemi correlati