LinuxのC言語でのライブラリ関数またはシステムコールの助けを借りて、/ var/log /にあるデータを維持するためのログファイルを作成する方法はありますか?また、ログを書き込んで処理するために従うべき標準についても知りたいです。ありがとう
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
(緊急の場合のみ)まであり、DEBUG
、INFO
、およびERR
が最も一般的に使用されています。オプションについては、man 3 syslog
をご覧ください。
2番目と3番目の引数は、printfと同様に、形式とメッセージです。
これが表示されるログファイルは、syslog設定によって異なります。
デフォルトの設定では、おそらく/var/log/messages
になります。
LOG_LOCAL0
〜LOG_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
上記の.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
呼び出しを使用することを想定しています。
_#include <syslog.h>
_を使用し、次にsyslog()
関数を使用して、アクティブなシステムロギングプログラムにデータを送信します。
manページはこちら を参照してください。
以下に示すように、プログラム名によるフィルタリングは上記とは異なり、最近のバージョンのrsyslog
(私のマシンのバージョンは5.8.6)では異なります。
if $programname == 'popa3d' then /var/log/popa3d.log
詳細については、 ここ を参照してください
可能性はたくさんありますが、あなたの計画は?コマンドラインからログを記録するオプションが必要ですか? logger
を見てください( bsdutils に含まれています)。入力するだけです:
usr@srv % logger test
そしてそれはあなたの/var/log/syslog
にこのような何かを記録します:
Apr 25 07:55:15 localhost usr: test
man logger
も参照してください。ロギングデーモンに応じて、これらのメッセージを特定のファイルにソートしたり、優先順位でフィルタリングしたりできます。
異なるプログラミング言語のためのいくつかのソリューションもありますので、あなたが何をしたいのか教えてください;-)