Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 在磁盘上实现固定大小的日志文件或循环缓冲区_Logging_File Io_Buffer_Circular Buffer - Fatal编程技术网

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

Logging 在磁盘上实现固定大小的日志文件或循环缓冲区,logging,file-io,buffer,circular-buffer,Logging,File Io,Buffer,Circular Buffer,我查过了,但这不是我要找的 我正试图找出如何限制日志文件的大小(比如10MB),一旦它被击中,可以: 开始写开头,而不是追加,或 继续追加,但从一开始就删除内容 不要真的在乎语言——只要可能:) 注意:我知道滚动日志文件的方法(达到目标大小、重命名并继续记录)。我希望避免这种情况。如果同时实现编写器和读取器,则可以执行以下操作: struct logentry { timestamp ts; char msg [4000]; }; class logger

我查过了,但这不是我要找的

我正试图找出如何限制日志文件的大小(比如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是否存在以及检查错误的逻辑。

为什么不滚动日志文件?它必须精确到10MB吗?若10MB是您的配额,通常的做法是写入blah.log,当它达到1MB时,将文件重命名为blah.log.1并开始写入blah.log。更简单,也是一种非常普遍的做法。事实上,在Linux中,如果您使用syslog,它是免费的。

如果您使用的是Log4[j/net],则可以选择滚动日志。看。另外,在指定日志文件的属性时,还有一个选项可用于设置日志的最大文件大小。(Param:MaxFileSize)

是的,我知道滚动日志文件(和logrotate等)-如果我有绝对不超过大小,我会更仔细地查看,我不想跟踪我在哪个文件中,拥有一个自滚动日志文件会更好。带外收到的一个建议是使用固定大小的记录,并在文件前面存储少量元数据,指示从哪个记录开始。如果我阅读正确,这似乎会自动滚动日志文件,而不是在日志文件中滚动