回答:
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*'おそらくあなたに教えてくれます。
sysklogdsyslogソフトウェアの町で唯一のゲームだった時代の遺物です。現在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
詳細については、こちらをご覧ください