J'ai vérifié cette question , mais ce n'est pas ce que je cherche. P>
J'essaie de comprendre comment plafonner la taille d'un fichier journal (dire, 10 Mo) et dès qu'il est touché, soit: P>
Ne vous souciez pas vraiment de la langue - aussi longtemps que possible :) p>
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. P>
3 Réponses :
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; } };
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
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. P>
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
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) p>
Cela semble automatiser le rouleau des logfiles, si je le lisez correctement - ne pas rouler à l'intérieur i> un logfile
Stackoverflow.com/a/9075604