2010-10-29 51 views
2

我正在寫一個簡單的應用程序在vb.net中,並需要輸出一些信息到日誌文件進行診斷。如何使用vb.net修剪日誌文件?

爲了確保日誌文件不會太大,我需要將它修剪到一定數量的行(比如5000)。由於性能方面的原因,每次記錄日誌條目時都不必進行修剪,也不必發生修剪(例如,如果應用程序過早崩潰)。

但是我不確定修剪它的最佳方法。將整個日誌加載到內存中,然後只重寫最後5000行就可以工作,但我確信有更清晰和更好的方法來完成此操作。

任何人都可以請建議一個更有效的方法嗎?我在vb.net相當新,所以代碼示例將非常感激。

+0

關於建議使用外部的日誌庫,我的應用程序將是少於1000行左右,因此包含一個至少爲10倍大小的第三方庫似乎很愚蠢,只是將一行文本寫入文件,然後在超過一定大小時截斷。我明白重新使用經過良好測試的代碼是最好的方式,而不是重新發明輪子,但我不想讓應用程序膨脹太多。 – Richard 2010-10-29 12:30:06

回答

4

我不會擔心修改我已經寫過的數據,我只會遵循在某個時間點啓動新日誌文件的悠久傳統,無論是當前日誌文件達到一定大小還是時間表(每小時,每天或其他)。

只需將當前日誌文件從xyzzy.log重命名爲xxyyz-YYYYMMDDHHMMSS.log,然後啓動xyzzy.log的全新副本。

這也爲您在維護日誌的完整審覈和保留磁盤空間之間給出了體面的權衡。您可以設置過程來刪除超過30天的日誌文件,或者將聚合大小保持在某個閾值以下,或者甚至將舊日誌移出到輔助存儲區域。

這些程序甚至不必是你的程序的一部分 - 我過去只是有一個計劃的任務,清理舊的日誌文件,一個任務與程序本身沒有共享的任務,除了腳本所在的目錄。

這可能是完成第三方產品(這不總是可行)的最簡單的方法,而且由於日誌文件幾乎總是針對程序員而不是用戶,所以命名標準不應該是'不要太繁重。


一個非常簡單的解決辦法,我在過去的(得承認Linux)的使用是真正不用擔心重命名的。只需使用日誌功能使用當前日期打開文件,並且記得日期是什麼。每次您在此之後調用日誌功能時,請檢查日期是否已更改,如果是,則打開新的日誌文件以供日後記錄。通過程序很少的努力,每天給你一個日誌文件。

然後,我剛剛使用find -mtime刪除那些超過一定年齡的腳本。

+0

除了使用下面的log4net之外,這正是我所要做的。這意味着零讀取文件數據,並且總是寫入(效率更高)。您甚至可以添加幾行代碼來刪除基於日期的舊文件,或基於保留最後[x]文件的om時間戳。 – enforge 2010-10-29 12:54:17

0

您應該嘗試使用第三方庫,其中大部分庫應包含此類功能 - 例如, log4netNLogEnterprise Library

其中大多數都是直接使用,取決於你正在做多少日誌記錄,使用其中之一可能比使用自己編寫這樣的功能更快,它將是可靠的,經過良好測試,並提供其他有用的功能也。

編輯

我的主要經驗是企業庫,與我一直用@paxdiablo描述了他的答案,開始一個新的日誌文件每隔x天/周/ KB /等技術。我不確定如何將單個文件截斷爲一定的大小,但我想這些庫可能是可行的。

0

一種方法是爲此利用開源解決方案。 Log4Net是我的許多同行反覆使用的一個。它具有處理你在談論的功能。你添加引用,添加一個配置文件來設置你的日誌選項(需要保留多少等),然後調用這個庫來記錄日誌。

http://logging.apache.org/log4net/

0

死線,我知道......但有沒有實際上回答了這個問題,只是爲什麼他們不會做它建議任何響應。我知道在某些情況下,它會派上用場,保留日誌中的最後一行。 5,000可能有點多,但我要評判誰。所以這是我的要求,以及我的使用。

dim LogPath as string = "YourLogPath"  
Dim lineCount = File.ReadAllLines(LogPath).Length 

     If lineCount > 60 Then ' because I want my log to be 60 lines long 
      Dim delLineCount As Integer = lineCount - 60 
      Dim lines As List(Of String) = New List(Of String)(File.ReadAllLines(LogPath)) 
      lines.RemoveRange(0, delLineCount) 
      File.WriteAllLines(LogPath, lines.ToArray()) 
     End If 

我這樣做,收盤所以修剪一次,所有的操作都做了,而且我的日誌文件是60線長:)