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.

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top