ログファイルを作成する


22

LinuxのC言語のライブラリ関数またはシステムコールを使用して、/ var / log /にデータを保持するためのログファイルを作成する方法はありますか。また、ログを作成して処理するために従うべき標準についても知りたいです。ありがとう


プログラミングに関する質問は、一般的にここではトピック外です。Stack Overflowで質問する必要があります。APIの説明はここでも構いませんが、Cまたは他のプログラミング言語でAPIを使用する方法の説明は通常、スタックオーバーフローに属します。
ジル 'SO-悪であるのをやめる'

回答:


31

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ありINFOERR最も一般的に使用されます。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を含む、またはそれ以上に重要に記録されます、INFONOTICEERR、(エラー)CRITなど、(クリティカル)ではなくDEBUG


または、持っているrsyslog場合は、プロパティベースのフィルターを試すことができます、例えば

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

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

または、ソフトウェアを他の人に配布することを計画している場合は、おそらくLOG_LOCALrsyslogフィルターの使用に頼るのは得策ではありません。

その場合、LOG_USER(通常のプログラムのLOG_DAEMON場合)または(サーバーの場合)を使用しsyslog、を使用して起動メッセージとエラーメッセージを書き込みますが、すべてのログメッセージをの外部のファイルに書き込みますsyslog。たとえば、Apache HTTPdは/var/log/apache2/*または/var/log/httpd/*にログを記録しますが、通常のopen/ fopenおよびwrite/ printf呼び出しを使用すると想定しています。


ありがとう。これは非常に役立つ情報です。ただし、log_local0-7オプションについて詳しく説明してください。例えば self.logファイルにデータ(ログ行に<self>ワードがある)を書き込みたい。他のファイルのいくつかのログ。
Sushantジャイナ

@Sushant Jain:どのLinuxディストリビューションとバージョンをターゲットにしていますか?古いsyslog(ksyslogd)またはrsyslogがありますか? rpm -qa | grep syslogまたは、dpkg -l '*syslog*'おそらくあなたに教えてくれます。
ミケル

率直に言って、log_local *は、sysklogdsyslogソフトウェアの町で唯一のゲームだった時代の遺物です。現在syslog-ngrsyslogやなどのソフトウェアdsyslogが存在し、単なるサービス/レベルよりもはるかに高度なフィルタリング機能を備えています。
シャドゥール

どうもありがとう。私の問題は解決されました。ログファイルに保存されたデータの解析に関するクエリがもう1つあります。これを行う良い方法はありますか。実際、システム統計ツールを作成しようとしています。だから私はそれが必要です。
Sushantジャイナ

@Sushant Jain。喜んでお手伝いします。ログ解析の質問を別の質問として投稿して、人々がそれを見て適切な回答を提供できるようにしてください。
ミケル

2

あなたはしたいと思うでしょう#include <syslog.h>、そして、使用syslog()有効であるどんなシステムロギングプログラムにデータを送信する機能を。

こちらのmanページをご覧ください


syslog()関数は、データを/ var / log / syslogに書き込みます。一方、私は自分のファイルにログを書きたいです。
Sushantジャイナ

ミケルは、下に説明しますが、syslogのはあなたがプログラムを理解するように、あなたのログメッセージにタグを付けることができ、あなたのプログラムを書くための[設定のsyslogが異なるファイルにメッセージを記録します。
カレブ

1

可能性はたくさんありますが、あなたの計画は何ですか?コマンドラインからログを記録するオプションが必要ですか?見てみましょうlogger(に含まbsdutilsを)。入力するだけです:

usr@srv % logger test

そして、それはあなたにこのような何かを記録します/var/log/syslog

Apr 25 07:55:15 localhost usr: test

も参照してくださいman logger。ロギングデーモンに応じて、これらのメッセージを特定のファイルにソートしたり、優先度でフィルタリングしたりできます。

さまざまなプログラミング言語用のソリューションもいくつかありますので、何をしたいのか教えてください;-)


実際、私はC言語を使用してそれをやりたいです。そして、私はmikelポストに情報を持っています。
Sushantジャイナ

1

プログラム名によるフィルタリングは、rsyslog以下に示すように、最近のバージョン(私のマシンのバージョンは5.8.6)について、上記とは異なる方法で記述されています。

if $programname == 'popa3d' then /var/log/popa3d.log

詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.