#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は私のプログラムを現在停止させる唯一の方法ですが、プログラムを起動するたびに正しくログするようにするにはどうすればよいですか?
ログファイルに漏れたファイル記述子があるかどうかをシステムシェルから確認する方法はありますか?
あなたのメッセージは「すぐ近くに」印刷されていないと判断していますか?あなたのプロセスを殺すことに関しては、一度それがなくなったら、それはすべて開いているファイルストリームなので、あなたは何かを "漏らす"べきではありません。プロセスは*になります*。つまり、あなたがあなたの 'open'呼び出しに適切なフラグ(http://en.cppreference.com/w/cpp/io/basic_ofstream/open)を使用していますか? – WhozCraig
gdbでflush()を実行した後、ログファイルをテーリングしていて、しばらくの間ログが表示されません。しかし、これは最も心配な問題ではありません。その後のプログラムの実行ではまったく開いたり書いたりしない方がより大きな問題です。 std :: ios :: outとstd :: ios :: appモードを設定しました。私は何か他のことをしなければなりませんか? – siri
さらに、より良い方法でフロー/アクティビティをキャプチャするために、ロギング機能は、プロジェクトで印刷されたすべてのログで「ファイルを開き、ログに記録して閉じる」必要があります。 – sameerkn