Схема ротации логов Linux / c ++ - PullRequest
4 голосов
/ 26 января 2009

У меня есть система ведения журнала, которая в основном представляет собой причудливый способ записи моих данных в 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? Я бы догадался, нет.

Единственное, что я могу придумать, это определенно сработает, если у меня само приложение откроет новый файл и перенаправит на него rdbuf clog, удерживая мьютекс записи. Но это похоже на дешевое решение, и мне нужно было бы проверить, чтобы узнать, пора ли довольно часто вращать журналы, чтобы оно было эффективным. Должен быть лучший способ.

Ответы [ 3 ]

14 голосов
/ 26 января 2009

Вы можете использовать встроенный метод ротации журналов, настроенный в /etc/logrotate.conf и / или /etc/logrotate.d/ - обычно logrotate посылает вашему приложению SIGUSR1 в качестве сигнала для закрытия и повторного откройте все ваши файлы журналов.

7 голосов
/ 26 января 2009

Или просто используйте syslog вместо вашей пользовательской схемы регистрации, и журналы все равно будут вращаться при помощи logrotate. - в зависимости от того, как он настроен, но на большинстве настольных / серверных систем он уже настроен на их вращение.

1 голос
/ 26 января 2009

Вы можете использовать что-то похожее на следующее, и переместить файл журнала в любом направлении (logrotate, cron script и т. Д.) (Предоставляя образец 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 */
    }
}

Запись в файл безопасна после его перемещения, поэтому нет необходимости проявлять особую осторожность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...