logging - 在磁盘上实现固定大小的日志文件或循环缓冲区

标签 logging file-io buffer circular-buffer

我查了这个 question ,但这不是我要找的。

我试图弄清楚如何限制日志文件的大小(例如 10MB),并且一旦命中,要么:

  • 开始写到开头,而不是追加,或者
  • 继续追加,但像我一样从头开始删除内容

  • 不要真正关心语言 - 只要可能:)

    注意:我知道滚动日志文件方法(达到目标大小、重命名并继续记录)。我希望避免这样的滚动。

    最佳答案

    如果您同时实现作者和读者,那么您可以执行以下操作:

    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是否存在以及检查错误的逻辑。

    关于logging - 在磁盘上实现固定大小的日志文件或循环缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1788641/

    相关文章:

    logging - 如何正确登录Sanctuary/Fluture?

    perl - perl 中的相对文件路径

    java - 如何以适当的方式关闭OutputStream?

    C变量和内存问题

    将具有不同类型成员的结构复制到缓冲区

    node.js - 在 Bunyan 日志记录中格式化输出

    java - 如何在Spring Boot应用程序中正确使用log4j2

    python:如何在固定缓冲区类中切片/存储 iter 指向的数据?

    ruby-on-rails - 为 ActiveResource 添加记录器的最佳方式

    python - 将for循环的输出写入多个文件