我剛開始着手編寫一個日誌庫,每個人都可以在用戶運行我們的應用程序時跟蹤任何類型的系統信息。迄今最簡單的例子是跟蹤信息,警告和錯誤。在.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
來處理這種情況。還有一個想法是有一個僅用於鍵值對的表格,其中一個外鍵將鍵值對映射回原始日誌條目。我顯然不希望日誌記錄停滯在系統中,所以我只鎖定日誌緩存來複制數據(並刪除已經複製的數據),然後後臺線程會將信息轉儲到數據庫。
我這方面的具體問題是:
- 你看到任何性能問題?換句話說,你有沒有嘗試過這樣的事情,並發現某些事情在實踐中運作不佳?
- 有沒有更多.NETish方式來實現鍵值對,除了
List<List<KeyValuePair<String,String>>>
? - 即使有更好的方法來做#2,我在上面提出了一個壞的東西的ALTER TABLE的想法?
- 你會推薦一個單一的多個數據庫嗎?我還不知道日誌的寫入頻率如何,但理想情況下我們希望擁有大量的低級信息。也許應該有一個固定架構的數據庫只適用於低層次的東西,然後是另一個更靈活的數據庫來向用戶報告信息。
爲什麼你想寫一個日誌庫,當有這麼多的人在那裏? – Will 2010-05-10 13:17:02
爲什麼實施你自己的? log4net很好用,支持記錄到數據庫以及按名稱空間/類型過濾。如果緩存的內置選項不夠用,可以編寫自定義緩衝/緩存/轉發appender,比編寫整個日誌記錄庫容易得多。 – 2010-05-10 13:17:46
我的日誌記錄框架已經在Steven的另一個答案中提到過。我只想指出一個我也叫做Logverse(http://www.logverse.com)的服務,它提供了一種方法讓你擁有像你提到的可變列名稱。 – TheObjectGuy 2010-05-10 22:45:06