2011-04-06 155 views
29

想用Nlog和像example這樣的文件目標進行登錄。如何在x天后刪除文件而無需歸檔它們。或者可以將文件歸檔到同一文件夾中?x天后刪除日誌文件

+0

請標記爲答案。 – Julian 2016-09-02 18:30:41

回答

3

我不知道這是否回答你的問題,但它看起來像maxArchiveFiles應該做你想做的。我自己並沒有真正使用這個選項,所以我不能肯定地說。您當然可以將您的日誌文件「歸檔」在同一個文件夾中。

如果是我,我會做一個非常小的程序,做了一些記錄和設置時間(archiveEvery="minute"),這樣很容易迫使歸檔邏輯在踢,設置maxArchiveFiles到像5,看看NLog只保存5個日誌文件。運行你的程序一段時間,可能通過定時器生成日誌消息,這樣你就可以在足夠的時間內將日誌消息放在空間上,以便NLog的歸檔/滾動邏輯開始運行。

試驗歸檔文件命名模板。使用archiveNumbering選項可以控制歸檔文件的編號方式。

對不起,我不能給出一個更明確的答案或具體的例子,但我還沒有使用這些選項,所以我只需要做同樣的實驗(s),我現在被按下的時間。

8

我發現如果我在日誌文件名中使用日期標記存檔文件,存檔日誌會變得困惑,並且{#}總是轉換爲「0」,導致舊日誌永遠不會被刪除。另外,如果我在日誌文件名中使用GDC引用,它根本不會切換日誌。

我現在必須手動刪除舊日誌,如果我想這些奇特的日誌文件名。他們在文件名中包含日期的事實會導致他們自動切換文件。

// Delete log files older than X days 

var dirInfo = new DirectoryInfo("."); 
var oldestArchiveDate = DateTime.Now - new TimeSpan(30, 0, 0, 0); 
foreach (FileInfo fi in dirInfo.GetFiles()) 
    if (fi.Name.StartsWith("log-") && fi.Name.EndsWith(".txt") && fi.CreationTime < oldestArchiveDate) 
     fi.Delete(); 

var midnight = DateTime.Today.AddDays(1); 
_oldLogCleanUpThread = new System.Threading.Timer(OldLogCleanUpThreadMethod, null, midnight - DateTime.Now, TimeSpan.FromDays(1)); 

n日誌目標:

filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}\logs\log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt" 
GDC.Set("MySpecialId", ...); 
59

你可以簡單地使用內置的存檔功能。除了當前日誌以外,此設置還會保留7箇舊日誌文件。清理由NLog自動完成。

<?xml version="1.0" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <targets> 
     <target name="file" xsi:type="File" 
      layout="${longdate} ${logger} ${message}" 
      fileName="${basedir}/logs/logfile.txt" 
      archiveFileName="${basedir}/logs/log.{#}.txt" 
      archiveEvery="Day" 
      archiveNumbering="Rolling" 
      maxArchiveFiles="7" 
      concurrentWrites="true" /> 
    </targets> 

    <rules> 
     <logger name="*" minlevel="Debug" writeTo="file" /> 
    </rules> 
</nlog> 

也看到了file target

+1

如果我使用archiveAboveSize會發生什麼?這將不再有效,因爲如果我在一天內有7個文件,它會刪除所有其他文件。有沒有解決方案? – 2013-07-04 16:29:32

+0

@UriAbramson恕我直言,這些是互斥設置。 – ccellar 2013-07-19 08:53:57

+0

@ccellar我知道這是舊的,但現在你有:archiveNumbering =「DateAndSequence」 – 2015-12-21 11:00:01

0
 //Store the number of days after which you want to delete the logs. 
    int Days = 30; 

    // Storing the path of the directory where the logs are stored. 
    String DirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + "\\Log(s)\\"; 

    //Fetching all the folders. 
    String[] objSubDirectory = Directory.GetDirectories(DirPath); 

    //For each folder fetching all the files and matching with date given 
    foreach (String subdir in objSubDirectory)  
     { 
      //Getting the path of the folder     
      String strpath = Path.GetFullPath(subdir); 
      //Fetching all the files from the folder. 
      String[] strFiles = Directory.GetFiles(strpath); 
      foreach (string files in strFiles) 
      { 
       //For each file checking the creation date with the current date. 
       FileInfo objFile = new FileInfo(files); 
       if (objFile.CreationTime <= DateTime.Now.AddDays(-Days)) 
       { 
        //Delete the file. 
        objFile.Delete(); 
       } 
      } 

      //If folder contains no file then delete the folder also. 
      if (Directory.GetFiles(strpath).Length == 0) 
      { 
       DirectoryInfo objSubDir = new DirectoryInfo(subdir); 
       //Delete the folder. 
       objSubDir.Delete(); 
      } 

     } 
2

的文檔,你可以使用這一天的名稱並設置maxArchiveFiles固定數量。例如,每週的每週可以存儲100個100Kb的文件:

<variable name="dayname" value="${date:format=dddd}" /> 

<target name="logfile" xsi:type="File" 
     fileName="${basedir}/Logs/MyLog_${dayname}.txt" 
     archiveFileName="${basedir}/Logs/Archives/MyLog_${dayname}.{#####}.txt" 
     archiveAboveSize="102400" 
     archiveNumbering="Sequence"    
     maxArchiveFiles="100" 
     concurrentWrites="true" 
     keepFileOpen="false" 
     encoding="iso-8859-2" />