/var/log/にいくつかのデータを保持するために、いくつかのライブラリ関数またはC言語システムコールを使用してLinuxでログファイルを生成する方法はありますか?そして、ログを作成して処理するときにどの基準に従うべきかを知りたいです。ありがとう
答え1
Cプログラムが記録する標準的な方法は次のとおりです。syslog
。
まず、ヘッダファイルを含めます。
#include <syslog.h>
その後、プログラムの最初に次を呼び出してsyslogを設定する必要がありますopenlog
。
openlog("programname", 0, LOG_USER);
最初のパラメータはIDまたはラベルで、各メッセージの先頭に自動的に追加されます。ここにプログラム名を入力してください。
2番目の引数は、使用したいオプションまたは0
通常の動作のオプションです。完全なオプションのリストはにありますman 3 syslog
。有用な情報の1つは、LOG_PID
syslogにログメッセージにプロセスIDを記録させることです。
その後、ログメッセージを書きたいときはいつでも次を呼び出しますsyslog
。
syslog(LOG_INFO, "%s", "Message");
最初のパラメータは優先順位です。優先順位の範囲はDEBUG
(最も重要ではない)からEMERG
(緊急状況のみ)まででDEBUG
、、、、INFO
およびERR
が最も一般的に使用されます。man 3 syslog
オプションを確認してください。
2番目と3番目のパラメータはprintfと同様にフォーマットとメッセージです。
これが表示されるログファイルは、システムログの設定によって異なります。
デフォルト設定では、おそらく/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
syslogtagには「:」を含める必要があります。
LOG_LOCAL
あるいは、ソフトウェアを他の人に配布する計画であれば、使用法やフィルタに頼るのは良い考えではないかもしれませんrsyslog
。
この場合LOG_USER
(通常のプログラムの場合)または(LOG_DAEMON
サーバーの場合)開始メッセージとエラーメッセージを書き込む必要がありますsyslog
が、すべてのログメッセージは/および/呼び出しを使用して作成する必要があります。syslog
/var/log/apache2/*
/var/log/httpd/*
open
fopen
write
printf
答え2
その後、アクティブなsyslogプログラムにデータを送信するには、#include <syslog.h>
これらの機能を使用する必要があります。syslog()
よりマニュアルページはこちら。
答え3
多くの可能性がありますが、あなたの計画は何ですか?コマンドラインからログインするオプションのみが必要ですか?見てくださいlogger
(含まれています)bsdutils)。以下を入力してください。
usr@srv % logger test
次の内容が記録されます/var/log/syslog
。
Apr 25 07:55:15 localhost usr: test
また、見ることができますman logger
。ロギングデーモンによっては、これらのメッセージを特定のファイルに並べ替えるか、優先順位に従ってフィルタリングできます。
さまざまなプログラミング言語のためのいくつかの解決策があるので、あなたが望む仕事を教えてください;-)
答え4
プログラム名でフィルタリングする方法は、上記のものとは異なります。最新バージョンrsyslog
(マイコンピュータのバージョンは5.8.6)の場合は、次のようになります。
if $programname == 'popa3d' then /var/log/popa3d.log
詳細については、以下を確認してください。ここ