2008-10-01 46 views
61

所以我有一個Linux系統上運行的守護進程,我想記錄它的活動:日誌。問題是,完成這個任務的「最佳」方法是什麼?Linux中的守護進程日誌記錄

我的第一個想法是簡單地打開一個文件並寫入它。

FILE* log = fopen("logfile.log", "w"); 
/* daemon works...needs to write to log */ 
fprintf(log, "foo%s\n", (char*)bar); 
/* ...all done, close the file */ 
fclose(log); 

這種方式有什麼天生的錯誤嗎?有沒有更好的方法,比如一些嵌入到Linux中的框架?

回答

92

Unix已經有很長時間了一個特殊的日誌框架syslog。鍵入你的外殼

man 3 syslog 

你會得到它的C接口的幫助。

Someexamples

#include <stdio.h> 
#include <unistd.h> 
#include <syslog.h> 

int main(void) { 

openlog("slog", LOG_PID|LOG_CONS, LOG_USER); 
syslog(LOG_INFO, "A different kind of Hello world ... "); 
closelog(); 

return 0; 
} 
+3

「man 3 ...」!我不知道這件事。 – codemonkey 2008-10-01 17:00:47

0

有很多潛在的問題:例如,如果磁盤已滿,你希望你的守護進程失敗?此外,您每次都會覆蓋您的文件。通常使用一個循環文件​​,這樣您的文件就可以在機器上分配空間,但是您可以保留足夠的歷史記錄而不佔用太多空間。 有像log4c這樣的工具可以幫助你。如果你的代碼是C++,那麼你可能會考慮Apache項目中的log4cxx(apt-get install ubuntu/debian上的liblog4cxx9-dev),但它看起來像你使用的C.

21

可能會是一個 是賽馬,但是如果不是所有的Un * x衍生物都存在於大多數系統日誌工具中,則是首選的方式。沒有什麼錯記錄到文件,但它在你的肩膀離開任務的數量:

  • 有沒有在你的記錄位置的文件系統來保存文件
  • 約緩衝(性能什麼)vs刷新(在系統崩潰前獲取日誌)
  • 如果您的守護程序運行很長時間,您會如何處理不斷增長的日誌文件。

Syslog負責爲您提供所有這些,以及更多。這個API與printf族相似,所以你應該沒有任何問題適應你的代碼。

2

如上所述,您應該查看syslog。但是如果你想寫自己的日誌代碼,我建議你使用fopen的「a」(寫入附加)模式。編寫自己的日誌代碼的一些缺點是:日誌輪轉處理,鎖定(如果你有多個線程),同步(你是否想等待日誌寫入磁盤?)。系統日誌的一個缺點是應用程序不知道日誌是否已寫入磁盤(它們可能已丟失)。

2

Syslog是一個不錯的選擇,但你不妨考慮看着log4c。 log4 [something]框架在其Java和Perl實現中運行良好,並允許您從配置文件中選擇登錄到syslog,控制檯,平面文件或用戶定義的日誌編寫器。您可以爲每個模塊定義特定的日誌上下文,並將每個上下文日誌記錄在您的配置定義的不同級別。 (跟蹤,調試,信息,警告,錯誤,關鍵),並讓守護程序通過捕獲信號來即時重新讀取配置文件,從而允許您在運行的服務器上操作日誌級別。在較大的(或更安全意識的)安裝系統日誌的

11

另一個優點:syslog守護程序可以被配置爲將日誌發送到另一個服務器,用於記錄,而不是(或除了)本地文件系統存在。

將服務器場的所有日誌放在一個地方,而不是在每臺計算機上分別讀取它們會更方便,尤其是當您試圖將一臺服務器上的事件與另一臺服務器上的事件相關聯時。而且,當一個人被破解時,你不能再相信它的日誌了......但是如果日誌服務器保持安全,你就知道什麼都不會從它的日誌中刪除,所以任何入侵記錄都將保持不變。

2

如果使用線程和使用記錄作爲調試工具,你將要尋找使用某種線程安全的日誌庫,但解鎖環緩衝區。每個線程一個緩衝區,僅在嚴格需要時纔有全局鎖定。

這避免了記錄在軟件造成嚴重減速,並避免創建當您添加調試日誌記錄其變化heisenbugs。

如果有日誌記錄和一些不錯的日誌分析和顯示工具時不會浪費時間與格式操作的高速壓縮的二進制日誌格式,這是一個獎金。

我會提供一些這方面的好代碼的引用,但我沒有一個自己。我只想要一個。 :)

1

我們的嵌入式系統沒有系統日誌,所以我寫的守護進程做調試到使用類似於你如何描述它的「一」開放式的文件。我有一個函數打開一個日誌文件,吐出消息,然後關閉文件(我只在遇到意外事件時執行此操作)。不過,我也不得不編寫代碼來處理其他評論者所提到它由「尾巴-c 65536日誌文件> logfiletmp & & MV logfiletmp日誌文件」日誌旋轉。這很粗糙,也許應該被稱爲「日誌正面截斷」,但它會阻止我們的基於小型RAM磁盤的文件系統填滿日誌文件。

相關問題