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