ログファイルの作成

ログファイルの作成

/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_PIDsyslogにログメッセージにプロセス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記録されますが、記録されないことを意味します。INFONOTICEERRCRITDEBUG


またはあなたが持っているならrsyslog、次のことを試すことができます。属性ベースのフィルタ、例えば

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

syslogtagには「:」を含める必要があります。

LOG_LOCALあるいは、ソフトウェアを他の人に配布する計画であれば、使用法やフィルタに頼るのは良い考えではないかもしれませんrsyslog

この場合LOG_USER(通常のプログラムの場合)または(LOG_DAEMONサーバーの場合)開始メッセージとエラーメッセージを書き込む必要がありますsyslogが、すべてのログメッセージは/および/呼び出しを使用して作成する必要があります。syslog/var/log/apache2/*/var/log/httpd/*openfopenwriteprintf

答え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

詳細については、以下を確認してください。ここ

関連情報