2009-01-26 76 views
3

我有一個記錄器系統,它基本上是一種用線程安全方式將數據寫入std :: clog的奇特方式。Linux/c + +日誌輪換計劃

我也,重定向std::clog到像這樣的文件:

int main() { 
    std::ofstream logfile(config::logname, std::ios::app); 
    std::streambuf *const old_buffer = std::clog.rdbuf(logfile.rdbuf()); 

    // .. the guts of the application 

    std::clog.rdbuf(old_buffer); 
} 

這個偉大的工程。不過,我的應用程序也產生了非常大的日誌。我想知道什麼是正確旋轉我的日誌文件的好方法。有沒有一種安全的方式通過cron任務來切換文件?我猜不。

我唯一能想到的就是如果我讓應用程序本身打開一個新文件,並在持有日誌互斥鎖的同時重定向cld的rdbuf。但是這感覺像是一個便宜的解決方案,我需要檢查一下,看看是否應該經常輪換日誌以使其有效。有一個更好的方法。

回答

14

您可以使用在/etc/logrotate.conf和/或/etc/logrotate.d/中配置的內置日誌輪轉方法 - 通常讓logrotate向您的應用程序發送SIGUSR1作爲關閉和重新啓動的信號 - 打開所有的日誌文件。

+0

所以基本上你所說的是我添加了一個SIGUSR1處理程序,它在關閉/重新打開的同時按住日誌鎖定,並且logrotate會發出我的應用程序的信號有定期? – 2009-01-26 16:58:09

+0

即使只有配置logrotate才能旋轉日誌,並將其設置爲嚮應用發送SIGUSR1。它不會自動發生。 – 2009-01-26 17:48:01

6

或者只是使用系統日誌,而不是您的自定義日誌記錄方案,日誌無論如何都會被logrotate旋轉。 - 取決於它如何配置,但在大多數桌面/服務器系統上,它已經設置爲旋轉它們。

0

您可以使用類似於下面的東西,移動日誌文件客場取方式(logrotate的,cron的腳本等)(CISH提供樣品,應該很容易轉換)

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

void logworker() 
{ 
    ino_t inode = 0; 
    FILE *logfile; 

    logfile = fopen(logfilename, "a+"); 
    while(running) 
    { 
     struct stat mystat; 

     if (stat(logfilename, &mystat)!=0 || mystat.st_ino != inode) 
     { 
      logfile = freopen(logfilename, "a+", logfile); 
      inode = mystat.st_ino; 
     } 

     while (stuff_in_buffer) 
     { 
      fwrite(); /* etc */ 
     } 
     fflush(logfile); 

     /* sleep until something interesting happens */ 
    } 
} 

它是安全的在文件被移動後寫入文件,所以不需要額外的注意