この質問を確認しましたが、探しているものではありません。
ログ ファイルのサイズ (たとえば、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)