2017-02-15 2 views
1
#include <iostream> 

#define LOGFATAL(msg) log(0, msg) 

std::ofstream *logst = NULL; 

void log(int sev, char *msg) 
{ if (logst == NULL) { 
     logst = new std::ofstream(); 
     logst->open("filea.txt", std::ios::out | std::ios::app); 
     *logst << "Logger started." << std::endl; 
    } 

    std::ofstream &_log = *logst; 
    _log << msg << std::endl; 
    _log.flush(); 
} 

int main() 
{ LOGFATAL("Log msg1."); 
    LOGFATAL("Log msg2."); 
    LOGFATAL("Log msg3."); 

    logst->close(); 
    delete logst; 
} 

初めてログを記録するファイルを開き、プログラムの最後まで開いたままにします。プログラムの次の実行でファイルの作成と書き込みを行わないC++ ++

私はすべてのログ呼び出しのたびにflush()オペレーションを使用していますので、私のメッセージはすぐに近くに印刷されます。しかし、これは実現しませんでした。どうして?

現在、私はそれが終了する前に(なぜ私に聞かないでください)はCtrl +Cを使用して私のプログラムを殺します。その後のプログラムの実行では、ログファイルが作成されていないことがわかります。すでに存在していても、ログが追加されることはありません。 close()を実行させないので、ファイルディスクリプタがリークして、今後新しいプログラムからのopen()が失敗することはありませんか?

私はRHEL 7.2で動作させています。最近、ほとんどの新OSはclose()が誤って呼び出されていなくても処理すると仮定しています。 Ctrl + Cは私のプログラムを現在停止させる唯一の方法ですが、プログラムを起動するたびに正しくログするようにするにはどうすればよいですか?

ログファイルに漏れたファイル記述子があるかどうかをシステムシェルから確認する方法はありますか?

+0

あなたのメッセージは「すぐ近くに」印刷されていないと判断していますか?あなたのプロセスを殺すことに関しては、一度それがなくなったら、それはすべて開いているファイルストリームなので、あなたは何かを "漏らす"べきではありません。プロセスは*になります*。つまり、あなたがあなたの 'open'呼び出しに適切なフラグ(http://en.cppreference.com/w/cpp/io/basic_ofstream/open)を使用していますか? – WhozCraig

+0

gdbでflush()を実行した後、ログファイルをテーリングしていて、しばらくの間ログが表示されません。しかし、これは最も心配な問題ではありません。その後のプログラムの実行ではまったく開いたり書いたりしない方がより大きな問題です。 std :: ios :: outとstd :: ios :: appモードを設定しました。私は何か他のことをしなければなりませんか? – siri

+0

さらに、より良い方法でフロー/アクティビティをキャプチャするために、ロギング機能は、プロジェクトで印刷されたすべてのログで「ファイルを開き、ログに記録して閉じる」必要があります。 – sameerkn

答えて

1

挿入すると、std::endl自体がデータをフラッシュします。 _log.flush();がコメントされていても動作します。

"私のメッセージがすぐ近くに印刷されることが期待されます"vimを使用している場合は、ファイルを閉じてから再度開く必要があります。したがって、tail -F filea.txtを使用して、データがファイルに書き込まれるとすぐに出力を確認してください。

+0

しかし、それ以降のプログラムの実行では何も表示されません。私はis_open()チェックを入れて、open()もファイルを開いていないことがわかります。 – siri

+0

@siri 'fstream :: open()'は何も返さないので、 'fopen'を使用してファイルを' a + 'モードで開き、' errno variable'を使ってエラーをチェックすることをお勧めします。 – sameerkn

+0

@siriちょうどキックのために、 'std :: ios :: out | std :: ios :: app | std :: ios :: ate'を開きます。 RHELを使っているのは分かっていますが、ツールチェーンは何ですか? – WhozCraig

関連する問題