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 に答える