Implementando um arquivo de log de tamanho fixo ou um buffer circular no disco
-
21-09-2019 - |
Pergunta
Eu verifiquei isso pergunta, mas não é o que estou procurando.
Estou tentando descobrir como limitar o tamanho de um arquivo de log (digamos, 10 MB) e, assim que for atingido: também:
- Comece a escrever para o início, em vez de anexar, ou
- Continue anexando, mas exclua o conteúdo desde o início
Realmente não me importo com a linguagem - desde que seja possível :)
Nota: Estou ciente da abordagem de arquivos de log rolling (pressione um tamanho de destino, renomeie e continue o log). Estou procurando evitar esse rolo.
Solução
Se você está implementando o escritor e o leitor, pode fazer algo assim:
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;
}
};
A idéia é gerenciar um tampão circular por números de registro de tamanho fixo explícitos. Necessário é a lógica para gerenciar se o registro n existe e para verificar erros.
Outras dicas
Por que não fazer arquivos de madeira? Tem que ser precisamente 10 MB? Se 10MB for sua cota, uma prática comum seria escrever para Blah.log, e quando chegar, digamos 1 MB, renomeie o arquivo para blá.log.1 e comece a escrever para Blah.log. Muito mais simples e uma prática muito comum. De fato, no Linux, se você usa syslog, é gratuito.
Se você estiver usando o log4 [j/net], existem opções para um log de rolagem. Veja o ROLLINGFILEAPENDE. Além disso, existe uma opção ao especificar os atributos do arquivo de log para definir o tamanho máximo do arquivo para o log. (Param: maxfilesize)