4

我有一个记录器系统,它基本上是以线程安全的方式将我的数据写入 std::clog 的一种奇特方式。

我也重定向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 任务切换文件?我猜没有。

我唯一能想到的肯定会起作用的是,如果我让应用程序本身打开一个新文件,并在持有日志互斥锁的同时将 clog 的 rdbuf 重定向到该文件。但这感觉像是一个便宜的解决方案,我需要检查一下是否是时候经常轮换日志以使其有效。必须有更好的方法。

4

3 回答 3

13

您可以使用在 /etc/logrotate.conf 和/或 /etc/logrotate.d/ 中配置的内置日志轮换方法 - 通常让 logrotate 向您的应用发送 SIGUSR1 作为关闭和重新打开所有应用的信号日志文件。

于 2009-01-26T16:56:25.483 回答
7

或者只是使用 syslog 而不是您的自定义日志记录方案,并且无论如何日志都会被 logrotate 轮换。-- 取决于它的配置方式,但在大多数桌面/服务器系统上,它已经设置为轮换它们。

于 2009-01-26T16:59:26.833 回答
1

您可以使用类似于以下内容的内容,并以任何方式(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 */
    }
}

移动后写入文件是安全的,因此无需额外小心

于 2009-01-26T18:03:58.997 回答