2009-01-26 77 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 */ 
    } 
} 

它是安全的在文件被移动后写入文件,所以不需要额外的注意