2009-03-04 18 views
4

Cのロガーライブラリがあるかどうか知りたいですが、循環ファイルロギングを行うことができますか?円形ファイルロギング

私は現在log4Cを見ていますが、循環ロギングを行うことができる十分なドキュメントを見つけることはできません。

誰でもこれを行っている場合。親切に私に知らせてください。

おかげ

答えて

0

Log4Cは痛いほどよく、この時点で文書化されていないようです。彼らはLog4Jのページを指していますが、これは "ローリング"ログに言及していますが、それはおそらくあなたが望むものでしょうか?それは用語の混乱の単なる問題かもしれません。

1

本当に循環ログが必要ですか?私はあなたがローリングログを使う方が良いと思います。

すなわち

循環ログ:バックlog.1

log.4その後、log.3そして、その後、その後、log.2ローリングログをlog.1するログ:4つのログファイルを持って、log.1常に最新のものであり、log.2,3,4は古いログエントリです。

+0

なぜですか?開発環境で実行すると、すぐに大量のログを生成しているディスクスペースが不足することがあります。私の職場では、多数のプロセスとデバッグ出力のためにローリングログを使用しています – hhafez

+1

彼は循環ログを要求しており、ローリングログを必要としているはずです。私はあなたがなぜ「どうして」と尋ねるのか分かりません。 –

2

は、ここではこれはバージョンを削減した例

です。私たちは、log_itを呼び出す前に、vargsを使用してフォーマットします。


typedef const char* c_str; 
FILE* log_fp = 0; 
const int max_log_size = 4 * 1024 * 1024; 
const int max_no = 5; 
c_str prefix = "logs_"; 
c_str postfix = ".txt"; 

void log_it(c_str str) 
    { 
    char file1[100], file2[100]; 

    if(! log_fp) 
     { 
     sprintf(file1 "%s%d%s", prefix, 0, postfix); 
     log_fp = fopen(file1, "a"); 
     } 

    if(log_fp) 
     { 
     if(ftell(log_fp) > max_log_size) 
      { 
      fclose(log_fp); 
      log_fp = 0; 

      for(int i = (max_no - 1); i >= 0; i--) 
       { 
       sprintf(file1 "%s%d%s", prefix, i, postfix); 
       sprintf(file1 "%s%d%s", prefix, i+1, postfix); 
       rename(file1, file2); 
       } 

      sprintf(file1 "%s%d%s", prefix, 0, postfix); 
      log_fp = fopen(file1, "a"); 
      } 

     fputs(str, log_fp); 
     fflush(log_fp); 
     } 
    } 

私はそれが役に立てば幸い。

デイブ

+0

ローリングログは循環ログではありません。また、log_fp = 0; はおそらくlog_fp = -1です。それは常に上書きされるので、それは大したことではありません。 –

+0

実際には、log_fp = fopen(file1、 "a")の場合に問題が発生する可能性があります。 はファイル記述子として0を返します。 –

+1

私はあなたが混乱していると思うopen(2)とfopen(3) –