2017-07-20 5 views
0

In meinem Projekt habe ich ein Logging-System erstellt, die im Grunde eine Shell auf nLlog ist. Ich versuche die Archivierungsfunktion des Logging-Systems zu vereinen. Es ist derzeit Setup zu tun Archive mit max Archivdateien von 5 (Nlog ist Setup über Code, keine Konfigurationsdatei verwendet wird) walzenUntitleding Nlog Archiv-Funktion

var myFileTarget = new FileTarget(); 
LogConfig.AddTarget("file", myFileTarget); 
myFileTarget.FileName = LogFile; 
myFileTarget.Layout = LogFileLayout; 
myFileTarget.AutoFlush = true; 

//Archive specifics 
var token = "{#}"; 
var archiveFileName = $"{Path.GetFileNameWithoutExtension(LogFile)}.{token}.{Path.GetExtension(LogFile)}"; 
myFileTarget.ArchiveFileName = archiveFileName; 
myFileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling; 
myFileTarget.ArchiveEvery = toFileArchivePeriod(LogStyle); 
myFileTarget.EnableFileDelete = true; 
myFileTarget.MaxArchiveFiles = TTL; //Time to Live 
myFileTarget.DeleteOldFileOnStartup = true; 

zu simulieren, dass viele Protokolle bereits vorhanden ist, ich eine Reihe erstellen von Protokollen mit dem gleichen Aufbau wie die ArchiveFileName oben:

LogFileName = "LogTTLDailyTest.log"; 
LogStyle = "daily"; 
LogTTL = 5; //Time To Live 

//Arrange old filelogs 
for (int i = 0; i < 100; i++) 
{ 
    var filename = $"LogTTLDailyTest.{i}.log"; 
    File.WriteAllText(TestLogsDirectory + filename, "UNITTEST"); 
    var creationTime = DateTime.Now.AddDays((i + 1)* -1); 
    File.SetCreationTime(TestLogsDirectory + filename, creationTime); 
    File.SetLastWriteTime(TestLogsDirectory + filename, creationTime); 
} 

Aber wenn ich ein Protokoll schreibe über mein Log-System nlog ist es nicht die alten Protokolldateien sieht ich erstellt und daher löscht sie nicht. Es ist sauber aber die alte aktuelle Protokolldatei, also das Löschen von Dateien arbeiten:

NLog: 2017-07-20 12:54:20.7434 Info Closing old configuration. 
NLog: 2017-07-20 12:54:20.7434 Info Found 36 configuration items 
NLog: 2017-07-20 12:54:20.7594 Info Found 36 configuration items 
NLog: 2017-07-20 12:54:26.9157 Info Deleting old archive file: 'C:\<projectpath>\bin\Debug\unittestlogsea984b05-3c33-4142-9d1a-c900bad89006\LogTTLDailyTest.log'. 

Meine aktuelle Theorie ist, dass der nlog der alten Protokolle sieht aber eine Art von Validierung der Inhalte der Dateien, die ich nur füllen Sie mit "UNITEST" als Inhalt, aber ich war nicht in der Lage, nlog "neu zu starten" oder zwingen Sie es, die Protokolle zu sehen.

Hoffe, dass Sie mich

Antwort

0

helfen Dies ist kein Problem hier, mich nur den Test nicht richtig einrichten. Was ich vergessen habe, ist, dass das Rollen nicht gelöscht wird, sondern alle Dateien auf die nächste laufende Nummer umbenannt werden. Die letzte Datei in dieser rollenden Art wird gelöscht. Jede andere Datei wird von nlog ignoriert. Ich habe auch vergessen, meine aktuelle Protokolldatei einen Tag zurück zu setzen. Das bedeutete, dass nlog sah, dass ich eine aktuelle Datei hatte, die nicht einen Tag alt war. Aber weil ich DeleteOldFileOnStartup aktiviert hatte löschte diese Datei.

Also, um meinen Fehler zu beheben, stellte ich sicher, dass ich nur so viele Dateien wie benötigt oder weniger erstellte und sicherstellte, dass die neueste Datei keine fortlaufende Nummer hatte und einen Tag alt war. Ich habe auch die Option DeleteOldFileOnStartup entfernt. Das Nlog macht jetzt, was ich erwarte, dass es einwandfrei funktioniert.