web-dev-qa-db-ja.com

Linuxでのデーモンロギング

そのため、Linuxシステムでデーモンを実行しており、その活動の記録、つまりログが必要です。問題は、これを達成するための「最良の」方法は何ですか?

私の最初のアイデアは、単にファイルを開いて書き込むことです。

FILE* log = fopen("logfile.log", "w");
/* daemon works...needs to write to log */
fprintf(log, "foo%s\n", (char*)bar);
/* ...all done, close the file */
fclose(log);

この方法でロギングすることに本質的に問題はありますか? Linuxに組み込まれているフレームワークなど、より良い方法はありますか?

66
codemonkey

Unixには長い間、 syslog と呼ばれる特別なロギングフレームワークがありました。シェルを入力してください

man 3 syslog

cインターフェイスのヘルプが表示されます。

一部

#include <stdio.h>
#include <unistd.h>
#include <syslog.h>

int main(void) {

 openlog("slog", LOG_PID|LOG_CONS, LOG_USER);
 syslog(LOG_INFO, "A different kind of Hello world ... ");
 closelog();

 return 0;
}
100
Vinko Vrsalovic

この おそらくになるだろう 競馬でしたが、すべてではありませんがほとんどのUn * x派生物に存在するsyslog機能が好ましい方法です。ファイルへのロギングには何も問題はありませんが、次のような多くのタスクが肩に残っています。

  • ロギングの場所にファイルを保存するファイルシステムがありますか
  • バッファリング(パフォーマンスのため)とフラッシュ(システムクラッシュの前にログを記録するため)
  • デーモンが長時間実行されている場合、増え続けるログファイルについてはどうしますか。

Syslogがこれらすべてを処理します。 APIはprintfクランに似ているため、コードの調整に問題はないはずです。

23
Richard

大規模な(またはよりセキュリティを重視する)インストールでのsyslogのもう1つの利点:syslogデーモンは、ローカルファイルシステムの代わりに(またはそれに加えて)ログを別のサーバーに送信して記録するように構成できます。

特に、あるサーバー上のイベントと別のサーバー上のイベントを相関させようとする場合、サーバーファームのすべてのログを各マシンで個別に読み取るのではなく、1か所に保存する方がはるかに便利です。クラックされた場合、そのログを信頼することはできません...しかし、ログサーバーが安全に保たれていれば、ログから何も削除されていないことがわかるので、侵入の記録はそのまま残ります。

11
Dave Sherohman

単体テストをしているとき、多くのデーモンメッセージをdaemon.infoとdaemon.debugに吐き出します。 syslog.confの行により、これらのメッセージを任意のファイルに貼り付けることができます。

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html には、manページのimoよりもC APIの説明があります。

8
phreakre

スレッドを使用し、デバッグツールとしてロギングを使用する場合、何らかのスレッドセーフであるがロックされていないリングバッファーを使用するロギングライブラリを検索する必要があります。スレッドごとに1つのバッファー。厳密に必要な場合にのみグローバルロックを使用します。

これにより、ソフトウェアで深刻な速度低下を引き起こすロギングを回避し、デバッグロギングを追加したときに変化するヘイゼンバグの作成を回避します。

ロギング中のフォーマット操作に時間を無駄にしない高速圧縮バイナリログフォーマットと、いくつかのNiceログ解析および表示ツールがある場合、それはボーナスです。

このための良いコードへの参照を提供しますが、私はそれを持っていません。欲しいだけです。 :)

2
Zan Lynx

上記のように、syslogを調べる必要があります。ただし、独自のログコードを記述したい場合は、fopenの「a」(write append)モードを使用することをお勧めします。

独自のログコードを記述することの欠点は、ログローテーションの処理、ロック(複数のスレッドがある場合)、同期(ログがディスクに書き込まれるのを待ちますか?)です。 syslogの欠点の1つは、ログがディスクに書き込まれたかどうか(アプリケーションが失われた可能性があるかどうか)がアプリケーションにわからないことです。

2

Syslogは良いオプションですが、log4cを調べることを検討することをお勧めします。 log4 [something]フレームワークは、JavaおよびPerl実装でうまく機能し、構成ファイルから、syslog、コンソール、フラットファイル、またはユーザー定義のいずれかにログを選択できます。ログライター:モジュールごとに特定のログコンテキストを定義し、構成によって定義された異なるレベルで各コンテキストログを取得できます(トレース、デバッグ、情報、警告、エラー、クリティカル)。シグナルをトラップすることにより、その構成ファイルをオンザフライで読み取り、実行中のサーバーのログレベルを操作できるようにします。

2
Jon Topper

私たちの組み込みシステムにはsyslogがないので、私が書いたデーモンは、あなたが説明したのと同様の「a」オープンモードを使用してファイルをデバッグします。ログファイルを開き、メッセージを吐き出してからファイルを閉じる関数があります(予期しないことが発生した場合にのみこれを行います)。ただし、「tail -c 65536 logfile> logfiletmp && mv logfiletmp logfile」で構成される他のコメンターが述べたように、ログのローテーションを処理するコードも作成する必要がありました。これはかなり荒く、「log frontal truncations」と呼ばれるべきかもしれませんが、小さなRAMディスクベースのファイルシステムがログファイルでいっぱいになるのを防ぎます。

1
Matthew Smith

これまでのところ、誰も言及していません boost log library ログメッセージをファイルにリダイレクトするニースで簡単な方法、または syslog sink またはWindowsイベントログです。

1
alexkr

多くの潜在的な問題があります:たとえば、ディスクがいっぱいの場合、デーモンを失敗させますか?また、毎回ファイルを上書きします。多くの場合、循環ファイルが使用されるため、マシン上にファイル用のスペースが割り当てられますが、スペースを取りすぎずに十分な履歴を保持しておくことができます。あなたがあなたを助けることができるlog4cのようなツールがあります。コードがc ++の場合、Apacheプロジェクトでlog4cxx(apt-get install liblog4cxx9-dev on ubuntu/debian)を検討するかもしれませんが、Cを使用しているようです。

0
David Nehme