2011-09-10 6 views
2

私は複数のワーカースレッドを持つCプログラムを持っています。定期的に(0.2秒ごとに)いくつかの基本的なチェックが行われている(つまり、スレッドが終了している、シグナルが受信されているなどの)メインスレッドがあります。それぞれのチェックで、スレッドのいずれかがログバッファに持つ可能性のあるデータをログファイルに書き込んで、単一のログファイルに書きたいと思います。Cの複数のスレッドの効率的なロギングソリューション

私の最初のアイデアは、単にログファイルを開いて、すべてのスレッドからデータを書き込んでからもう一度閉じることでした。私はこれらのチェックが0.2秒ごとに発生するので、これがオーバーヘッドすぎるかもしれないと心配しています。

私の質問です - このシナリオは非効率ですか?

もしそうなら、誰かがより良い解決策を提案できますか?

私は、ファイルディスクリプタを開いたままにして、すべてのチェックに新しいデータを書き込むことを考えましたが、何らかの形で物理ファイルが削除されても、プログラムはわかりません(再チェックせずにファイルをもう一度開くだけです)、ログデータは失われます。

(このプログラムは、時間の非常に長い期間のために実行するように設計されているので、ログファイル事実がある時点で削除されます基本的にローテーションをログによる保証されている。)

+0

( ) 'を実行し、syslogデーモンにファイルの書き込みをさせますか? –

+0

デーモン自体はsyslogを使用していますが、実際には、それぞれのスレッドで作成されたサブプロセスのSTDOUTとSTDERRを収集するために、実際には別々のログが必要でした。 – SlappyTheFish

答えて

5

私はファイルディスクリプタを開いたままにして、すべてのチェックに新しいデータを書き込むことを考えましたが、何らかの形で物理ファイルが削除された場合、プログラムはわかりません(この場合再検査なしファイルをもう一度開くだけでよい)、ログデータが失われる可能性があります。

UNIXの標準的な解決策は、ログファイルを閉じて再オープンするSIGHUP用のシグナルハンドラを追加することです。 Many UNIXデーモンは、この目的のために、ログのローテーションをサポートするためにこれを行います。あなたのログローテーションスクリプトでkill -HUP <pid>に電話してください。

Some programsも、その設定ファイルを再読み込みする手がかりとして、SIGHUPを扱いますので、あなたは、プロセスを再起動することなく、その場で設定変更を行うことができます。)なぜあなたは、単に `syslogを使用していない

+0

ああ、だから、ファイルを一度開いて、SIHUPのプロセスがシャットダウンされるまで開いたままにしておかなければなりません。これは標準的な解決策です - ありがとう! – SlappyTheFish

1

現在、多くはありません良い解決策のメインの0.2sチェックとは別に実行されるタイマーを作成し、ログファイルのバッファをチェックしてディスクに書き込むことをお勧めします。

私はこれを解決できる(私は同じ問題を抱えていました)優れたパフォーマンスで何かのネットワークベースで作業しています。詳細はgithubのメッセージを鳴らしてください。

+0

問題は、スレッドから待機しているログデータがあるとすぐにログファイルに書きたいということです。スレッド自体はフォークし、子プロセスは別のプログラムの新しいプロセスに置き換えられます。ログデータはこれらのプロセスからのものであり、理想的にはプロセスがモニタリングのために書き込むとすぐにログに書き込まれる必要があります。 – SlappyTheFish

関連する問題