簡體   English   中英

C ++中的異步線程安全日志記錄

[英]Asynchronous thread-safe logging in C++

我正在尋找一種在我的C ++項目中進行異步和線程安全日志記錄的方法,如果可能的話,可以在一個文件中進行。 我目前正在使用cerrclog來執行任務,但由於它們是同步的,所以每次記錄某些內容時執行都會暫停。 這是一個相對圖形密集的應用程序,所以這種事情非常煩人。

新的記錄器應該使用異步I / O來擺脫這些暫停。 線程安全也是可取的,因為我打算很快添加一些基本的多線程。

我認為每個線程一個文件的方法,但這似乎會使管理日志成為一場噩夢。 有什么建議?

我注意到這個1年+舊線程。 也許我寫的異步記錄器可能很有意思。

http://www.codeproject.com/KB/library/g2log.aspx

G2log使用受保護的消息隊列將日志條目轉發給慢速磁盤訪問的后台工作程序。

我嘗試使用無鎖隊列,這增加了LOG調用的平均時間,但減少了最壞的情況,但是我現在使用的是受保護的隊列,因為它是跨平台的。 它在Windows / Visual Studio 2010和Ubuntu 11.10 / gcc4.6上進行了測試。

它是作為公共領域發布的,所以你可以用它來做你想要的,沒有任何附加條件。

這是非常可行和實用的。 我怎么知道? 我在上一份工作中寫到了這一點。 不幸的是(對我們而言),他們現在擁有代碼。 :-)可悲的是,他們甚至沒有使用它。

我打算在不久的將來編寫一個開源版本。 同時,我可以給你一些提示。

  1. I / O操縱器實際上只是函數名稱。 您可以為自己的日志記錄類實現它們,以便您的記錄器兼容cout / cin。
  2. 您的操縱器函數可以對操作進行標記,並將它們存儲到隊列中。
  3. 可以在該隊列上阻止線程,等待日志塊通過。 然后它處理字符串操作並生成實際日志。

由於您使用的是隊列,因此本質上是線程兼容的。 但是,您仍然希望在寫入隊列時放置一些類似互斥鎖的保護,以便給定日志<<“東西”<<“更多東西”; 類型操作仍然是行原子的。

玩得開心!

我認為正確的方法不是每個文件一個文件,而是每個文件一個線程。 如果系統中的任何一個文件(或一般資源)只能由一個線程訪問,則線程安全編程變得更加容易。

那么為什么不讓Logger成為一個專用線程(或多個線程,每個文件一個,如果你在不同文件中記錄不同的東西),並且在所有其他線程中,寫入日志會將消息放在相應Logger中的輸入隊列中線程,它在寫完前一條消息后會到達它。 只需要一個互斥鎖來保護隊列在Logger正在讀取事件時添加事件,以及Logger在隊列為空時等待的condvar。

您是否考慮過使用日志庫?

有幾個可用,我最近發現了Pantheios ,它看起來真的很不可思議。

它更像是一個前端記錄器,您可以自定義使用哪個系統。 例如,它可以與ACElog4cxx交互,它看起來非常容易使用和配置。 主要優點是它使用類型安全的運算符,它總是很棒。

如果您只想要一個准系統日志庫:

  • 高手
  • log4c *
  • Boost.Log

挑選任何:)

我應該注意,可以在C ++中實現無鎖隊列,並且它們非常適合日志記錄。

我有同樣的問題,我相信我找到了完美的解決方案。 我向您介紹一個名為loguru的單頭庫: https//github.com/emilk/loguru

它使用簡單,攜帶方便,可配置的,基於宏觀和默認情況下不會#include任何(對於甜,甜編譯時間)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM