2011-06-25 73 views
1

我正在使用epoll在linux機器上進行服務器編程。我使用printf()打印日誌語句,但我想知道哪種輸出方法使用最少的系統資源。我使用哪種輸出方法來記錄系統?

正如你們已經知道的,服務器編程處理大量的日誌語句,所以我想知道我應該使用的最佳輸出方法。可能的候選人是printfcout等。

在此先感謝。

+2

尷尬的承認:我只是用fprintf包裹在一個宏中,我爲每個日誌文件重複一次。這個解決方案並不是很了不起,但它很簡單,很有效,並且讓我能夠繼續我的生活,而不用花費更多的時間,而不必花費太多的時間來思考日誌的平庸。 – Mikola

回答

1

兩個printfcout的控制檯輸出方法,既不是要麻煩你的CPU很大,你可能不擔心什麼。

但是,C++提供了三種標準輸出流 - cout,cerrclog。我建議你應該使用後者,因爲這就是它的用途,然後系統定義你的日誌輸出。

如果你不需要輸出格式,那麼這將是輕微的(也可能沒有可測量)更快地使用fwrite()puts(),或clog.write()

1

如果您使用C++,則可以使用log4cxx進行記錄。這是一個相當不錯的框架,儘管你可能會想到只是簡單地使用原生或自我實現的日誌記錄技術,當你的項目變得越來越大時,一個體面的日誌框架可以節省很多麻煩。

0

不確定的表現,但是這可能工作(未經測試) 我使用/n聽到的是快於std::endl

ofstream logfile; 
logfile.open("log.txt"); 
log <<"log text"; 
+1

他們做不同的事情。 std :: endl刷新流並寫入新行char –

0

如果您的應用程序創建了大量的日誌和日誌報表影響性能的,一個快速的解決方案是創建一個可以通過套接字連接填充的隊列的小進程。日誌記錄過程可以定期寫入磁盤或當其輸入隊列已滿時寫入磁盤。

如果連額外的磁盤訪問都影響性能,那麼日誌記錄過程可以在連接到與應用服務器相同的交換機的較小服務器上運行。

或者,如果您不希望消息傳遞延遲並且不介意編寫稍微複雜的代碼,則可以使用日誌記錄線程。

+2

她正在Linux機器上運行。這個過程已經有了,它被稱爲「syslogd」。爲什麼重新發明輪子? – littleadv

0

爲什麼不使用syslog?我認爲這是你的問題的明顯答案,除非你有一些令人信服的理由。

+0

我在系統上使用syslog時遇到的一個問題是他們希望應用程序登錄到不同的文件。所以他們使用設施local0。它運行良好,直到他們到了local7並需要更多的應用程序。其他程序也開始使用local0 ... – rve

+0

@ syslog的好處在於它記錄了進程ID,因此您可以根據需要對文件進行後期處理。我從來不需要使用2個以上的工具(通常我使用1作爲LOG_USER的日誌記錄,1作爲LOG_LOCAL0出現錯誤,1作爲LOG_LOCAL1作爲調試時使用,用於分隔日誌級別,就是這樣)。我根據前綴grep我需要的東西。 – littleadv

相關問題