Реализация файла журнала фиксированного размера или кольцевого буфера на диске

я думаю, что Вам понравится следующее:

Средство выбора Диапазона дат

голосование это, если Вам нравится он

9
задан Community 23 May 2017 в 10:29
поделиться

3 ответа

Если вы реализуете и писатель, и читатель, вы можете сделать что-то вроде этого:

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;
    }
};

Идея состоит в управлять кольцевым буфером с помощью явных номеров записей фиксированного размера. Необходима логика для управления тем, существует ли запись N, и для проверки ошибок.

3
ответ дан 4 December 2019 в 23:39
поделиться

Why not do rolling logfiles? Does it have to be precisely 10MB? If 10MB is your quota, a common practice would be to write to blah.log, and when it hits, say 1MB, rename file to blah.log.1 and start writing to blah.log. Much simpler, and a very common practice. In fact, in Linux, if you use syslog, it's free.

2
ответ дан 4 December 2019 в 23:39
поделиться

Если вы используете Log4 [j / net], есть опции для скользящего журнала. См. RollingFileAppender . Кроме того, при указании атрибутов файла журнала есть возможность установить максимальный размер файла журнала. (Параметр: MaxFileSize)

1
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: