2008-08-27 24 views
7

好的,這是場景。我有一個處理大量記錄的實用程序,並相應地將信息輸入到數據庫。這是一個更好的日誌記錄方法 - 文件或數據庫?

它在多線程批處理這些記錄。每個這樣的批處理都會寫入相同的日誌文件,以便爲每條記錄創建工作流跟蹤。有可能,我們一天可能會接近一百萬條日誌寫入。

該日誌是否應該生成駐留在另一臺服務器上的數據庫?注意事項:

  1. 多線程寫入同一個日誌文件的明顯缺點是日誌消息在彼此之間混洗。在數據庫中,它們可以按批次ID進行分組。
  2. 性能 - 這會減慢批處理的速度嗎?寫入本地文件或將日誌數據發送到同一網絡上另一臺服務器上的數據庫。理論上,日誌文件更快,但是這裏有一個問題嗎?

是否有任何優化可以在任一方法上完成?

謝謝。

回答

2

我第二個這裏的其他答案,取決於你在做什麼與數據

我們這裏有兩種情況:

  1. 大部分記錄的是一個數據庫,因爲管理員用戶爲我們打造的產品需要能夠查看他們在漂亮的小應用程序與所有的鐘聲和口哨聲。

  2. 我們將所有的診斷和調試信息記錄到文件中。我們不需要真正「美化」它和TBH,我們甚至不需要它,所以我們只是登錄和存檔的大部分。

我會說,如果用戶正在做任何事情,然後登錄到數據庫,如果它爲你,那麼一個文件可能就足夠了。

0

我認爲這很大程度上取決於您之後對日誌文件所做的操作。

寫入日誌文件的兩個操作將更快 - 尤其是當您建議寫入另一臺服務器上的數據庫時。

但是,如果您然後試圖定期處理和搜索日誌文件,那麼最好的地方是數據庫。

如果您使用log4net這樣的日誌框架,他們通常會提供簡單的基於配置文件的方式,將輸入重定向到文件或數據庫。

1

數據庫 - 因爲您提到了多個線程。同步以及過濾檢索是我回答的原因。
查看是否有決定切換到文件
前的性能問題「克努特:過早的優化是所有罪惡的根源」我沒有得到任何進一步的那本書... :)

1

有辦法可以解決文件日誌記錄的侷限性。

您可以始終使用某種線程ID來啓動每個日誌條目,並清除各個線程ID。或每個線程的不同日誌文件。

我已經登錄到數據庫在過去,在一個單獨的線程在一個較低的優先級。我必須說,當您試圖弄清楚什麼地方出錯時,可查詢性非常有價值。

1

如何登錄到數據庫文件,比如SQLite數據庫?我認爲它可以處理多線程寫入 - 儘管這也可能有其自身的性能開銷。

3

想到的一件事是,您可以讓每個線程寫入其自己的日誌文件,然後每日批量運行以將它們組合起來。

如果您正在登錄到數據庫,則可能需要進行一些調整和優化,特別是在數據庫將通過網絡時。至少你需要重新使用數據庫連接。

此外,你有任何具體的需要有登錄數據庫?如果你需要的只是一個「grep」,那麼我認爲你登錄數據庫並不會獲得太多收益。

6

有趣的問題是,如果您決定登錄到數據庫,您會在哪裏記錄數據庫連接錯誤?

如果我登錄到數據庫,我總是有一個輔助日誌位置(文件,事件日誌等),以防萬一有通信錯誤。它確實可以讓以後診斷問題變得更容易。

2

不知道它是否有幫助,但還有一個名爲Microsoft LogParser的實用程序,可以用來解析基於文本的日誌文件並將它們當作數據庫使用。從網站:

日誌分析器是一個功能強大,用途廣泛 工具,提供了通用查詢 訪問諸如日誌 文件,XML文件和CSV文件基於文本的數據, 以及關鍵數據源上諸如 事件日誌,註冊表,文件 系統和ActiveDirectory®之類的Windows®操作系統。您 告訴Log Parser您需要什麼信息以及您希望如何處理它。 您的查詢結果可能是 在基於文本的輸出中自定義格式, 或者它們可以持久保存到更多 專業目標,如SQL,SYSLOG或 圖表。大多數軟件被設計爲 完成有限數量的 特定任務。 Log Parser與 不同......它可以使用的方式數量僅限於需求 和用戶的想象力。 世界是您的數據庫與日誌 解析器。

我自己並沒有使用過這個程序,但是它看起來很有趣!

+0

LogParser運行良好。儘管這個文件真的很大,但它並不是最快的。 http://www.lizardl.com/PageHtml.aspx?lng=2&PageId=18&PageListItemId=17 Log Parser Lizard是一個很好的GUI,它運行在LogParser之上。 – notandy 2009-03-05 17:50:06

2

或者如何登錄隊列?這樣,只要你喜歡登錄不同的東西,你可以切換輪詢。它使得翻閱和歸檔日誌文件變得非常簡單。這也是很好的,因爲你可以添加登錄到不同的東西輪詢器,例如:

  • 一個輪詢,以查找錯誤消息,並將其發佈到您的FogBugz帳戶
  • 一個輪詢,以查找訪問衝突(「X試圖訪問/foo/y/bar.html')的‘黑客攻擊’文件
0

我喜歡蓋尤斯的回答。將所有日誌語句放入線程安全隊列中,然後從那裏處理它們。對於數據庫,您可以將它們批處理,比如說在一個批處理中記錄100條日誌語句,對於文件,您可以在文件進入隊列時將它們流式傳輸到文件中。

File or Db?和其他人一樣,這取決於你需要什麼日誌文件。