Domanda

Ho un logger di sistema che fondamentalmente è un modo elegante per scrivere i miei dati a std::intasare un thread di sicurezza.

Anche io, reindirizzare std::clog per un file come questo:

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

Questo funziona alla grande...tuttavia, la mia applicazione, inoltre, produce una grande quantità di tronchi.Mi chiedevo che cosa sarebbe un buon modo per ruotare correttamente il mio file di log.C'è un modo sicuro per passare i file tramite un operazione di cron?Direi di no.

L'unica cosa che posso pensare che sarebbe sicuramente il lavoro è se ho avuto la stessa domanda apri un nuovo file, e reindirizzare il rdbuf di intasare che mentre si tiene la registrazione mutex.Ma che si sente come una soluzione a basso costo, e avrei bisogno di controllare per vedere se è il momento di ruotare i log abbastanza spesso per essere efficace.Ci deve essere un modo migliore.

È stato utile?

Soluzione

È possibile utilizzare il built-in e log metodo di rotazione configurato in /etc/logrotate.conf e/o di /etc/logrotate.d/ - e ' comune avere logrotate invia la tua app SIGUSR1 come un segnale di chiusura e ri-aprire tutti i file di log.

Altri suggerimenti

O semplicemente utilizzare syslog invece di log personalizzato regime e i registri di rotazione da logrotate comunque.-- a seconda di come è configurato, ma sulla maggior parte dei desktop/server sistemi è già impostato a ruotare.

È possibile utilizzare qualcosa di simile al seguente, e spostare il file di registro di distanza, in qualunque modo (logrotate, cron script, etc.) (fornire Cish esempio, che dovrebbe essere facilmente convertibile)

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

È sicuro di scrivere un file dopo che è stato spostato, quindi non c'è bisogno di attenzione in più

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top