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
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
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" />
ich dieses Problem hatte, auch.
Sie müssen dies in Ihre config:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
Genau das, was ich gesucht habe. – cdmckay
Perfekt! Einfach, ich mag es –
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
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
Siehe meine Antwort. Ich glaube, das war die Richtung, auf die ich dich hingewiesen habe.Ich bin froh, dass du es sortiert hast. – Seany84
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.
Verwenden Sie einfach den Befehl
File.WriteAllText("C:/Users.../log.xml", "");
zu Beginn der Anwendung.
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? –
Sie können die Methode CloseFile() verwenden, bevor Sie delete aufrufen. – Darek
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