2012-07-29 14 views
5

Ich arbeite mit log4net. Ich möchte eine Schaltfläche in meiner GUI hinzufügen, dass, wenn der Benutzer auf diese Schaltfläche klickt, die Protokolldatei gelöscht wird. Wie kann ich das tun?Wie kann ich log4net Log-Datei löschen?

Thanks a lot

Antwort

4

Es ist nicht "out of the box" von log4net unterstützt. Sie könnten jedoch den RollingFileAppender verwenden und eine manuelle Klasse/Methode zum Bereinigen/Löschen der Protokolldatei erstellen.

Als Referenz Log4Net: set Max backup files on RollingFileAppender with rolling Date

Ein weiterer Ansatz, die Datei zu vermeiden, dass über den minimalen Sperrpegel auf der Protokolldatei festgelegt gesperrt wäre:

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

Danke! aber wenn ich versuche, die Datei zu löschen, erhalte ich eine Ausnahme, weil das log4net die Datei abfängt. Wie kann ich die Protokolldatei vom log4net freigeben? –

+1

Sie können die Methode CloseFile() verwenden, bevor Sie delete aufrufen. – Darek

+0

Ich denke, das ist eine separate Frage, aber tun, wie Darek vorgeschlagen hat. Lassen Sie uns wissen, wie Sie vorankommen und vergessen Sie nicht, als beantwortet zu markieren, wenn dies für Sie funktioniert. – Seany84

6

ich dieses Problem hatte, auch.

Sie müssen dies in Ihre config:

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

Genau das, was ich gesucht habe. – cdmckay

+0

Perfekt! Einfach, ich mag es –

+0

Ich vermute, dass das mit einem Kostenaufwand verbunden ist, vielleicht kann hier jemand etwas kommentieren. Damit dies funktioniert, schließt Log4Net wahrscheinlich die Datei und gibt die Dateikennung frei. Dies ist ein kostspieliger Vorgang, da beim nächsten Schreibvorgang ein neues Datei-Handle zugewiesen und auch die Datei geöffnet werden muss. Obwohl dies "perfekt" erscheinen mag, verursacht es sehr wahrscheinlich einen Leistungseinbruch. – Jazimov

2

Danke Jungs mir gelingt das Protokoll klar. Im appender Block der Protokollkonfigurationsdatei hinzugefügt ich diese Zeile:

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

Der Code, der die Protokolldatei zu löschen ist:

 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(); 
       } 

      } 
     } 

Danke alle

+0

Siehe meine Antwort. Ich glaube, das war die Richtung, auf die ich dich hingewiesen habe.Ich bin froh, dass du es sortiert hast. – Seany84

1

Wenn Sie don Wenn Sie die Auswirkungen einer minimalen Sperre auf die Leistung nicht erleiden möchten (siehe answer), können Sie die Appender vorübergehend so konfigurieren, dass sie eine minimale Sperre verwenden, die Dateien löschen und dann die Standardverhalten zurück.

Beispiel, wenn Sie nur RollingFileAppenders mit:

// 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(); 
    } 
} 

Die Dateien sind jetzt frei, ohne Probleme gelöscht werden.

0

Verwenden Sie einfach den Befehl

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

zu Beginn der Anwendung.

Verwandte Themen