web-dev-qa-db-ja.com

ログファイルを作る

LinuxのC言語でのライブラリ関数またはシステムコールの助けを借りて、/ var/log /にあるデータを維持するためのログファイルを作成する方法はありますか?また、ログを書き込んで処理するために従うべき標準についても知りたいです。ありがとう

22
Sushant Jain

Cプログラムからログを記録する標準的な方法は syslog です。

ヘッダーファイルを含めることから始めます。

#include <syslog.h>

次に、プログラムの早い段階で、openlogを呼び出してsyslogを構成する必要があります。

openlog("programname", 0, LOG_USER);

最初の引数はIDまたはタグで、各メッセージの先頭に自動的に追加されます。ここにプログラムの名前を入力します。

2番目の引数は、使用するオプション、または通常の動作の場合は0です。オプションの完全なリストはman 3 syslogにあります。便利なのはLOG_PIDです。これにより、syslogはログメッセージにプロセスIDも記録します。

次に、ログメッセージを書き込むたびに、syslogを呼び出します。

syslog(LOG_INFO, "%s", "Message");

最初の引数は優先度です。優先度の範囲は、DEBUG(最も重要ではない)からEMERG(緊急の場合のみ)まであり、DEBUGINFO、およびERRが最も一般的に使用されています。オプションについては、man 3 syslogをご覧ください。

2番目と3番目の引数は、printfと同様に、形式とメッセージです。

これが表示されるログファイルは、syslog設定によって異なります。

デフォルトの設定では、おそらく/var/log/messagesになります。


LOG_LOCAL0LOG_LOCAL7の範囲の機能の1つを使用して、カスタムログファイルを設定できます。

あなたはそれらを変更して使用します:

openlog("programname", 0, LOG_USER);

openlog("programname", 0, LOG_LOCAL0);

または

openlog("programname", 0, LOG_LOCAL1);

等.

対応するエントリを/etc/syslog.confに追加します。

local1.info /var/log/programname.log

そして、syslogサーバーを再起動します。

pkill -HUP syslogd

上記の.infolocal1.info部分は、INFOINFONOTICE(エラー)、ERR(クリティカル)などを含み、CRITを除くすべてのDEBUG以上のメッセージがログに記録されることを意味します。


または、 rsyslog がある場合、 プロパティベースのフィルター を試すことができます。

:syslogtag, isequal, "programname:"    /var/log/programname.log

Syslogtagには「:」が含まれている必要があります。

または、ソフトウェアを他の人に配布することを計画している場合、LOG_LOCALまたはrsyslogフィルターの使用に依存することはおそらくお勧めできません。

その場合は、LOG_USER(通常のプログラムの場合)またはLOG_DAEMON(サーバーの場合)を使用し、syslogを使用して起動メッセージとエラーメッセージを書き込み、すべてのログメッセージをsyslog外のファイル。たとえば、Apache HTTPdは/var/log/Apache2/*または/var/log/httpd/*にログを記録します。通常のopen/fopenおよびwrite/printf呼び出しを使用することを想定しています。

31
Mikel

_#include <syslog.h>_を使用し、次にsyslog()関数を使用して、アクティブなシステムロギングプログラムにデータを送信します。

manページはこちら を参照してください。

2
Caleb

以下に示すように、プログラム名によるフィルタリングは上記とは異なり、最近のバージョンのrsyslog(私のマシンのバージョンは5.8.6)では異なります。

if $programname == 'popa3d' then /var/log/popa3d.log

詳細については、 ここ を参照してください

1
suresh

可能性はたくさんありますが、あなたの計画は?コマンドラインからログを記録するオプションが必要ですか? loggerを見てください( bsdutils に含まれています)。入力するだけです:

usr@srv % logger test

そしてそれはあなたの/var/log/syslogにこのような何かを記録します:

Apr 25 07:55:15 localhost usr: test

man logger も参照してください。ロギングデーモンに応じて、これらのメッセージを特定のファイルにソートしたり、優先順位でフィルタリングしたりできます。

異なるプログラミング言語のためのいくつかのソリューションもありますので、あなたが何をしたいのか教えてください;-)

1
binfalse