Frage

Ich habe ein Logger-System, das im Grunde eine andere Art ist meine Daten zu schreiben :: verstopfen in einem Thread sichere Art und Weise std.

ich auch, umleiten std::clog in einer Datei wie folgt aus:

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);
}

Dies funktioniert gut ... aber meine Anwendung produziert auch eine sehr große Menge von Protokollen. Ich frage mich, was wäre ein guter Weg, um richtig meine Logfiles zu drehen. Gibt es einen sicheren Weg, um die Datei über ein Cron-Task wechseln out? Ich würde vermuten, Nr.

Das einzige, was ich denken kann, das wäre auf jeden Fall funktionieren, wenn ich die Anwendung hatte sich eine neue Datei öffnen, und leiten Sie die RDBUF von Clog zu, dass, während die Protokollierung Mutex hält. Aber das fühlt sich an wie eine billige Lösung, und ich würde müssen überprüfen, so zu sehen, ob es Zeit ist, Protokolle zu drehen ziemlich oft für sie wirksam zu sein. Es hat doch ein besserer Weg sein.

War es hilfreich?

Lösung

Sie können mit der Log-Rotationsverfahren-eingebauten konfiguriert in /etc/logrotate.conf und / oder /etc/logrotate.d/ - es ist üblich, Ihre App ein SIGUSR1 als ein Signal haben logrotate senden schließen und re- öffnen Sie alle Ihre Log-Dateien.

Andere Tipps

oder benutzen syslog nur anstelle der benutzerdefinierten Protokollierungsschema und die Protokolle von logrotate ohnehin gedreht bekommen. -. Je nachdem, wie es konfiguriert ist, aber auf den meisten Desktop / Server-Systemen ist es bereits festgelegt, sie drehen

Sie etwas ähnlich der folgenden verwenden können, und die Protokolldatei wegbewegen, welcher Weise (logrotate, Cron-Skript, etc.) (CISH Probe bereitstellt, sollte leicht konvertierbar sein)

#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 */
    }
}

Es ist sicher in eine Datei zu schreiben, nachdem es bewegt wurde, so gibt es keine Notwendigkeit für zusätzliche Vorsicht

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top