我检查了这个问题,但这不是我要找的。
我试图弄清楚如何限制日志文件的大小(比如 10MB),并且一旦它被命中,要么:
- 开始写到开头,而不是追加,或者
- 继续追加,但在我这样做的时候从头开始删除内容
不要真正关心语言 - 只要有可能:)
注意:我知道滚动日志文件方法(达到目标大小、重命名并继续记录)。我希望避免这样的滚动。
我检查了这个问题,但这不是我要找的。
我试图弄清楚如何限制日志文件的大小(比如 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],则有滚动日志的选项。请参阅RollingFileAppender。此外,在指定日志文件的属性以设置日志的最大文件大小时,还有一个选项。(参数:MaxFileSize)