2010-05-10 46 views
3

我剛開始着手編寫一個日誌庫,每個人都可以在用戶運行我們的應用程序時跟蹤任何類型的系統信息。迄今最簡單的例子是跟蹤信息,警告和錯誤。在.NET中使用數據庫作爲存儲介質實現日誌庫

我希望所有插件都能夠使用此功能,但由於每個開發人員對重要報告可能有不同的想法,因此我希望儘可能通用。

在C++世界中,我通常會使用類似於stl::pair<string,string>的東西充當鍵值對結構,並將其中的一個stl::list用作日誌中的「行」。日誌緩存然後將是一個list<list<pair<string,string>>>(唉!)。這樣,開發人員可以使用像INFO,WARNING,ERROR這樣的常量字符串鍵來爲數據庫中的列(用於選擇特定類型的信息)提供一致的命名。

我想數據庫能夠處理任意數量的不同列名稱。例如,John可能有一個名爲USER的列的INFO行,Bill可能有一個INFO行,並且有一列名爲FILENAME的列。我希望日誌查看器能夠顯示所有信息,並且如果一個報告沒有INFO/FILENAME的值,那麼這些字段應該顯示爲空白。因此一種選擇是使用List<List<KeyValuePair<String,String>>>,另一種方法是讓日誌庫消費者以某種方式「註冊」其模式,然後讓數據庫執行ALTER TABLE來處理這種情況。還有一個想法是有一個僅用於鍵值對的表格,其中一個外鍵將鍵值對映射回原始日誌條目。我顯然不希望日誌記錄停滯在系統中,所以我只鎖定日誌緩存來複制數據(並刪除已經複製的數據),然後後臺線程會將信息轉儲到數據庫。

我這方面的具體問題是:

  1. 你看到任何性能問題?換句話說,你有沒有嘗試過這樣的事情,並發現某些事情在實踐中運作不佳?
  2. 有沒有更多.NETish方式來實現鍵值對,除了List<List<KeyValuePair<String,String>>>
  3. 即使有更好的方法來做#2,我在上面提出了一個壞的東西的ALTER TABLE的想法?
  4. 你會推薦一個單一的多個數據庫嗎?我還不知道日誌的寫入頻率如何,但理想情況下我們希望擁有大量的低級信息。也許應該有一個固定架構的數據庫只適用於低層次的東西,然後是另一個更靈活的數據庫來向用戶報告信息。
+1

爲什麼你想寫一個日誌庫,當有這麼多的人在那裏? – Will 2010-05-10 13:17:02

+4

爲什麼實施你自己的? log4net很好用,支持記錄到數據庫以及按名稱空間/類型過濾。如果緩存的內置選項不夠用,可以編寫自定義緩衝/緩存/轉發appender,比編寫整個日誌記錄庫容易得多。 – 2010-05-10 13:17:46

+0

我的日誌記錄框架已經在Steven的另一個答案中提到過。我只想指出一個我也叫做Logverse(http://www.logverse.com)的服務,它提供了一種方法讓你擁有像你提到的可變列名稱。 – TheObjectGuy 2010-05-10 22:45:06

回答

10

爲什麼不檢查log4net?它可能是你的目的是足夠的,你會避免重新發明輪子已經發明瞭很多次:-)

在這裏,您有關於如何將日誌信息存儲在數據庫中的一些配置實例:

http://logging.apache.org/log4net/release/config-examples.html

+3

+1。如此多的日誌庫已經存在。使用現成的lib,並花時間在尚未爲您編寫的功能上。 – 2010-05-10 13:24:21

+0

今天我會檢查log4net,謝謝! – Dave 2010-05-10 14:06:13

+0

我們在大型應用程序中遇到了log4net的嚴重問題,所以我不再推薦它。 (我們有一個自己的,更簡單的日誌解決方案) – Offler 2012-12-13 14:30:35

1
  1. 直到有一些(Knuth)。
  2. 創建實際建模日誌條目的模型,然後將它們緩存在列表中
  3. 我會提供標準字段並將所有用戶配置存儲爲XML。允許靈活的日誌記錄系統,不會導致模式更改,並且(至少在Sql Server中)是可搜索的。
  4. 更多數據庫更多維護。把事情簡單化。實際上,只需使用Log4net即可。
+0

感謝您的建議! – Dave 2010-05-10 14:04:39

4

像其他人已經注意到的,有一些流行的日誌框架有很多內置的功能。雖然他們都沒有你想要的靈活性,但我的經驗是你永遠不需要那種靈活性。它只是記錄:-)。

下面是一些常見的日誌記錄庫的列表:

而且當你在選擇一個時遇到困難,使用一個記錄外觀來隱藏實現。爲此,您可以選擇:

+1

感謝您發佈log4net的替代品,雖然在仔細閱讀文檔後發現它非常吸引人。然而,你說得對,它只是日誌記錄,所以通過提供比標準級別和消息更多的信息可能會過度。 Will提出了一個很好的觀點,即我可以將XML用於消息,然後在真正需要獲取用戶特定信息時解析它。 – Dave 2010-05-10 15:33:50