문제

기본적으로 내 데이터를 STD :: Clog에 스레드 안전한 방식으로 작성하는 멋진 방법 인 Logger 시스템이 있습니다.

나도 리디렉션합니다 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를 리디렉션하는 것입니다. 그러나 그것은 저렴한 솔루션처럼 느껴지므로 확인해야합니다. 따라서 효과가 발생하기 위해 로그를 상당히 자주 회전 할 시간인지 확인해야합니다. 더 나은 방법이 있어야합니다.

도움이 되었습니까?

해결책

/etc/logrotate.conf 및/or /etc/logrotate.d/에서 구성된 내장 로그 회전 메소드를 사용할 수 있습니다. Logrotate를 앱을 SIGUSR1을 신호로 보내는 것이 일반적입니다. 로그 파일.

다른 팁

또는 사용자 정의 로깅 체계 대신 Syslog를 사용하면 Logrotate에 의해 로그가 회전합니다. - 구성 방식에 따라 대부분의 데스크탑/서버 시스템에서 이미 회전하도록 설정되어 있습니다.

다음과 유사한 것을 사용하고 로그 파일을 어느 방법 으로든 이동할 수 있습니다 (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 */
    }
}

이동 후 파일에 쓰는 것이 안전하므로 추가주의가 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top