回答:
Cプログラムからログを記録する標準的な方法はsyslog
です。
ヘッダーファイルを含めることから始めます。
#include <syslog.h>
その後、プログラムの初期段階で、次を呼び出してsyslogを構成する必要がありますopenlog
。
openlog("programname", 0, LOG_USER);
最初の引数は、各メッセージの開始時に自動的に追加されるIDまたはタグです。ここにプログラムの名前を入力します。
2番目の引数は、使用するオプション、または0
通常の動作用です。オプションの完全なリストはにありますman 3 syslog
。便利なのはLOG_PID
、syslogがプロセスIDをログメッセージに記録するようにすることです。
次に、ログメッセージを書き込むたびに、次を呼び出しますsyslog
。
syslog(LOG_INFO, "%s", "Message");
最初の引数は優先度です。優先順位の範囲はDEBUG
(最も重要ではない)からEMERG
(緊急時のみ)でDEBUG
ありINFO
、ERR
最も一般的に使用されます。man 3 syslog
オプションを参照してください。
2番目と3番目の引数は、printfと同様に形式とメッセージです。
これが表示されるログファイルは、syslog設定によって異なります。
デフォルト設定では、おそらくに入り/var/log/messages
ます。
あなたは範囲内の施設の一つ使用してカスタムログファイルを設定することができますLOG_LOCAL0
にしますLOG_LOCAL7
。
以下を変更して使用します。
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
.info
一部でlocal1.info
あるすべてのメッセージという上記の手段INFO
を含む、またはそれ以上に重要に記録されます、INFO
、NOTICE
、ERR
、(エラー)CRIT
など、(クリティカル)ではなくDEBUG
。
または、持っているrsyslog
場合は、プロパティベースのフィルターを試すことができます、例えば
:syslogtag, isequal, "programname:" /var/log/programname.log
または、ソフトウェアを他の人に配布することを計画している場合は、おそらくLOG_LOCAL
、rsyslog
フィルターの使用に頼るのは得策ではありません。
その場合、LOG_USER
(通常のプログラムのLOG_DAEMON
場合)または(サーバーの場合)を使用しsyslog
、を使用して起動メッセージとエラーメッセージを書き込みますが、すべてのログメッセージをの外部のファイルに書き込みますsyslog
。たとえば、Apache HTTPdは/var/log/apache2/*
または/var/log/httpd/*
にログを記録しますが、通常のopen
/ fopen
およびwrite
/ printf
呼び出しを使用すると想定しています。
rpm -qa | grep syslog
または、dpkg -l '*syslog*'
おそらくあなたに教えてくれます。
sysklogd
syslogソフトウェアの町で唯一のゲームだった時代の遺物です。現在syslog-ng
、rsyslog
やなどのソフトウェアdsyslog
が存在し、単なるサービス/レベルよりもはるかに高度なフィルタリング機能を備えています。
あなたはしたいと思うでしょう#include <syslog.h>
、そして、使用syslog()
有効であるどんなシステムロギングプログラムにデータを送信する機能を。
こちらのmanページをご覧ください。
可能性はたくさんありますが、あなたの計画は何ですか?コマンドラインからログを記録するオプションが必要ですか?見てみましょうlogger
(に含まbsdutilsを)。入力するだけです:
usr@srv % logger test
そして、それはあなたにこのような何かを記録します/var/log/syslog
:
Apr 25 07:55:15 localhost usr: test
も参照してくださいman logger
。ロギングデーモンに応じて、これらのメッセージを特定のファイルにソートしたり、優先度でフィルタリングしたりできます。
さまざまなプログラミング言語用のソリューションもいくつかありますので、何をしたいのか教えてください;-)
プログラム名によるフィルタリングは、rsyslog
以下に示すように、最近のバージョン(私のマシンのバージョンは5.8.6)について、上記とは異なる方法で記述されています。
if $programname == 'popa3d' then /var/log/popa3d.log
詳細については、こちらをご覧ください