Question

J'ai un système de journalisation qui est fondamentalement une manière élégante d’écrire mes données dans std :: clog de manière sécurisée pour les threads.

Je redirige également std::clog vers un fichier comme celui-ci:

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

Cela fonctionne très bien ... cependant, mon application produit également une très grande quantité de journaux. Je me demandais quel serait un bon moyen de faire pivoter correctement mes fichiers journaux. Existe-t-il un moyen sûr de remplacer le fichier via une tâche périodique? Je suppose que non.

La seule chose à laquelle je peux penser qui fonctionnerait vraiment, c’est que si l’application elle-même ouvre un nouveau fichier et redirige le rdbuf de sabot sur celle-ci tout en maintenant le mutex de journalisation. Mais cela me semble une solution peu coûteuse, et j’aurais besoin de vérifier si le moment est venu de faire tourner les bûches assez souvent pour que ce soit efficace. Il doit y avoir un meilleur moyen.

Était-ce utile?

La solution

Vous pouvez utiliser la méthode de rotation des journaux intégrée configurée dans /etc/logrotate.conf et / ou /etc/logrotate.d/ - il est courant que Logrotate envoie à votre application un SIGUSR1 comme signal de fermeture et de reprise. ouvrez tous vos fichiers journaux.

Autres conseils

Vous pouvez également utiliser syslog à la place de votre schéma de journalisation personnalisé. Les journaux sont quand même pivotés par logrotate. - selon la configuration, mais sur la plupart des systèmes de bureau / serveur, il est déjà configuré pour les faire pivoter.

Vous pouvez utiliser quelque chose de similaire au suivant et déplacer le fichier journal de n'importe quelle manière (logrotate, script cron, etc.) (en fournissant un exemple Cish, celui-ci devrait être facilement convertible)

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

Il est prudent d'écrire dans un fichier après son déplacement, vous n'avez donc pas besoin de faire plus attention

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top