11
votes

Mise en œuvre d'un fichier journal de taille fixe ou d'un tampon circulaire sur disque

J'ai vérifié cette question , mais ce n'est pas ce que je cherche.

J'essaie de comprendre comment plafonner la taille d'un fichier journal (dire, 10 Mo) et dès qu'il est touché, soit:

  • Commencez à écrire au début, plutôt que d'ajouter, ou
  • Continuez à ajouter, mais supprimez le contenu du début que je le fais si

    Ne vous souciez pas vraiment de la langue - aussi longtemps que possible :)


    Remarque: je suis au courant de l'approche de fichiers journaux roulants (frappez une taille de la cible, renommer et poursuivre la journalisation). Je cherche à éviter un tel rouleau.


3 Réponses :


3
votes

Si vous mettez en œuvre à la fois l'écrivain et le lecteur, vous pouvez faire quelque chose comme ceci:

struct logentry {
    timestamp  ts;
    char       msg [4000];
};

class logger {
private:
    int write_recordnum;  // next record number to write
    int max_recordnum;  // controls maximum size of file
    FILE    *logfile;

public:
    logger (const char *filename, int max_records)
    {
        max_recordnum = max_records;
        logfile = fopen (filename, "a+");
    }

    void write_next_entry (const char *msg, ...)
    {
        struct logentry ent;
        // format message into entry
        va_list ap;
        va_start (ap, msg);
        vsnprintf (ent.msg, sizeof(ent.msg), msg, ap);
        va_end (ap);
        ent.ts = gettimestamp();

        // position logfile
        if (write_recordnum > max_recordnum)
            write_recordnum = 0;

        fseek (logfile, write_recordnum * sizeof (ent), 0);
        fwrite (&ent, 1, sizeof(ent), logfile);
    }

    bool read_entry (int recnum, char *msg)
    {
        struct logentry ent;
        if (recnum >= max_recordnum)
            return false;
        fseek (logfile, recnum * sizeof (ent), 0);
        fread (&ent, 1, sizeof(ent), logfile);
        strcpy (msg, ent.msg);
        return true;
    }
};


1 commentaires

Une suggestion reçue hors bande consistait à utiliser des enregistrements de taille fixe et à stocker une brève quantité de métadonnées à l'avant du fichier, indiquant que l'enregistrement doit commencer à partir de



2
votes

Pourquoi ne pas rouler des fichiers journaux? Cela doit-il être précisément de 10 Mo? Si 10 Mo est votre quota, une pratique courante serait d'écrire à bla.log, et quand il frappe, disons 1 Mo, renommer le fichier sur blah.log.1 et commencer à écrire à blah.log. Beaucoup plus simple et une pratique très courante. En fait, sous Linux, si vous utilisez Syslog, c'est gratuit.


1 commentaires

Oui, je sais que des logfiles roulants (et de logrotate, etc.) - Je cherche davantage si j'ai une taille absolue à ne pas dépasser, et je ne veux pas garder une trace de quel fichier je suis dans, ayant un Le logfile auto-roulant serait bien



1
votes

Si vous utilisez log4 [J / NET], il existe des options pour un journal de roulement. Voir le RollingFileAppender . En outre, il existe une option lors de la spécification des attributs du fichier journal pour définir la taille maximale du fichier pour le journal. (Param: maxfilesize)


1 commentaires

Cela semble automatiser le rouleau des logfiles, si je le lisez correctement - ne pas rouler à l'intérieur un logfile