私が理解しているように、Linuxカーネルは/proc/kmsg
にログを記録します ファイル(主にハードウェア関連のメッセージ)と/dev/log
ソケット?どこか他の?他のアプリケーションも/proc/kmsg
にメッセージを送信できますか? または/dev/log
?最後になりましたが、これはsyslogデーモン( rsyslog )であると正しいですか? 、 syslog-ng )これらの2つの場所からのメッセージをチェックし、それらを/var/log/messages
などのさまざまなファイルに配布します。 または/var/log/kern.log
または中央のsyslogサーバーですか?
承認された回答:
簡略化すると、多かれ少なかれ次のようになります:
カーネルはメッセージをログに記録します(printk()
を使用 関数)カーネル空間のリングバッファに。これらのメッセージは、/proc/kmsg
を介して2つの方法でユーザースペースアプリケーションで利用できるようになります。 ファイル(/proc
が提供されます がマウントされている)、およびsys_syslog
を介して システムコール。
カーネルのリングバッファを読み取る(そしてある程度制御できる)2つの主要なアプリケーションがあります:dmesg(1)
およびklogd(8)
。前者は、リングバッファの内容を出力するために、ユーザーがオンデマンドで実行することを目的としています。後者は、/proc/kmsg
からメッセージを読み取るデーモンです。 (またはsys_syslog
を呼び出します 、/proc
の場合 マウントされていません)、それらをsyslogd(8)
に送信します 、またはコンソールに。それはカーネル側をカバーしています。
ユーザースペースには、syslogd(8)
があります 。これは、多数のUNIXドメインソケット(主に/dev/log
)をリッスンするデーモンです。 、ただし他の設定も可能です)、オプションでメッセージ用のUDPポート514に設定できます。また、klogd(8)
からメッセージを受信します (syslogd(8)
/proc/kmsg
は気にしません )。次に、これらのメッセージを/log
内のいくつかのファイルに書き込みます 、または名前付きパイプに送信するか、(syslog
を介して)いくつかのリモートホストに送信します プロトコル、UDPポート514)、/etc/syslog.conf
で構成されています 。
ユーザースペースアプリケーションは通常、libc
を使用します 関数syslog(3)
メッセージをログに記録します。 libc
これらのメッセージをUNIXドメインソケット/dev/log
に送信します (syslogd(8)
によって読み取られる場所 )、ただし、アプリケーションがchroot(2)
の場合 -edメッセージは、他のソケットに書き込まれる可能性があります。 /var/named/dev/log
へ 。もちろん、これらのログとsyslogd(8)
を送信するアプリケーションには不可欠です。 これらのソケットの位置について合意します。これらの理由により、syslogd(8)
標準の/dev/log
以外の追加のソケットをリッスンするように構成できます 。
最後に、syslog
プロトコルは単なるデータグラムプロトコルです。 syslog(3)
をバイパスして、アプリケーションがUNIXドメインソケットにsyslogデータグラムを送信することを妨げるものはありません(その資格情報によってソケットを開くことができる場合)。 libc
の関数 完全に。データグラムが正しくフォーマットされている場合syslogd(8)
メッセージがsyslog(3)
を介して送信されたかのように使用できます 。
もちろん、上記は「古典的な」ロギング理論のみをカバーしています。その他のデーモン(rsyslog
など) およびsyslog-ng
、おっしゃるように)プレーンなsyslogd(8)
を置き換えることができます 、暗号化されたTCP接続を介してリモートホストにメッセージを送信したり、高解像度のタイムスタンプを提供したりするなど、あらゆる種類の気の利いたことを行います。また、systemd
もあります 、それはLinuxのUNIX部分をゆっくりと貪食している。 systemd
独自のロギングメカニズムがありますが、その話は他の誰かが話さなければなりません。 🙂
* BSDの世界との違い:
* BSDには、klogd(8)
はありません。 、および/proc
存在しないか(OpenBSDの場合)、ほとんど廃止されています(FreeBSDおよびNetBSDの場合)。 syslogd(8)
キャラクターデバイス/dev/klog
からカーネルメッセージを読み取ります 、およびdmesg(1)
/dev/kmem
を使用します カーネル名をデコードします。 OpenBSDだけが/dev/log
を持っています 。 FreeBSDは2つのUNIXドメインソケット/var/run/log
を使用します およびvar/rub/logpriv
代わりに、NetBSDには/var/run/log
があります 。