2011-06-25 9 views
1

私はepollを使ってLinuxマシン上でプログラミングしているサーバで作業しています。 printf()を使用してログステートメントを印刷していますが、どの出力方法がシステムリソースを最も少なく使用しているのか不思議でした。ロギングシステムに使用する出力方法はどれですか?

あなたが知っているように、サーバープログラミングでは多くのログステートメントが扱われるため、私が使用すべき最良の出力方法が不思議でした。候補者はprintfcoutなどです。

ありがとうございます。

+2

恥ずかしがり屋:私はfprintfをマクロにラップして使用します。これは、各ログファイルに対して1回複製します。この解決法は驚くべきことではありませんが、シンプルで機能し、伐採の平常性について必要以上に考えるよりも時間を費やすことなく、私の人生に乗り越えることができます。 – Mikola

答えて

1

printfcoutの両方がコンソール出力方法ではない、どちらもトラブルに起こっているよりも高速である使用して聞いた あなたのCPUは大きく、おそらく何も心配していません。

しかし、C++には標準出力ストリームが3つあります(coutcerr、およびclog)。後者を使うべきだから、ログの出力がシステム定義されているので、後者を使うべきです。あなたは、出力形式を必要としない場合は

、あなたのアプリケーションでは、ログおよびログ・ステートメントのパフォーマンスに影響を与えているの多くを作成した場合fwrite()puts()、またはclog.write()

1

C++を使用している場合、ログにはlog4cxxを使用できます。長期的には粗製または自己実装のロギング手法を使いかけるだけでいいと思うかもしれませんが、まともなロギングフレームワークは、プロジェクトが大きくなったときに多くのトラブルを避けることができます。

0

ないパフォーマンスの確認が、これは(未テスト)動作して私は/nstd::endlすぎ

ofstream logfile; 
logfile.open("log.txt"); 
log <<"log text"; 
+1

彼らは違うことをします。 std :: endlはストリームをフラッシュし、新しい行を書き出します。 –

0

を使用するようにわずかに(そしておそらくない測定可能)高速になります短期間の解決策は、ソケット接続でいっぱいにできるキューを持つ小さなプロセスを作成することです。ロギングプロセスは、定期的にまたは入力キューがいっぱいになるとディスクに書き込むことができます。

追加のディスクアクセスでもパフォーマンスに影響がある場合は、アプリケーションサーバーと同じスイッチに接続された小さなサーバーでログ処理を実行できます。

メッセージ転送の待ち時間を必要とせず、やや複雑なコードを書くのに気にしない場合は、代わりにロギングスレッドを使用できます。

+2

彼女はLinuxマシンで動作しています。このようなプロセスが既にあり、それは "syslogd"と呼ばれています。なぜ車を改革するのですか? – littleadv

0

syslogを使用していないのはなぜですか?私はあなたがそれに対して何らかの説得力のある理由がなければ、あなたの質問に対する明らかな答えだと思います。

+0

システム上のsyslogにあった問題の1つは、アプリケーションが別のファイルにログを記録したがっているということです。そこで彼らは施設local0を使用しました。彼らはlocal7に来て、より多くのアプリケーションが必要になるまでうまくいった。他のプログラムもlocal0を使い始めました... – rve

+0

@rve syslogの良い点は、プロセスIDをログに記録することです。そのため、必要に応じてファイルを後処理することができます。私は2つ以上の設備を使用する必要はありませんでした(通常、私はLOG_USER、LOG_LOCAL0として1、LOG_LOCAL1として必要なときにデバッグ用に1、ロギングのレベルを分離するために1)。私はプレフィックスに基づいて必要なものをgrepします。 – littleadv

関連する問題