他の答えは、著者が言うように、Linuxでの「古典的なロギング」を説明しています。それは、今日の多くのシステムで物事がどのように機能するかではありません。
カーネル
カーネルメカニズムが変更されました。
カーネルは、メモリ内バッファへの出力を生成します。アプリケーションソフトウェアは、2つの方法でこれにアクセスできます。ロギングサブシステムは通常、という名前の疑似FIFOとしてアクセスし/proc/kmsg
ます。このログ情報のソースは、読み取り専用であるため、ログリーダー間で有用に共有できません。複数のプロセスがそれを共有する場合、各プロセスはカーネルログデータストリームの一部のみを取得します。また、読み取り専用です。
それにアクセスする他の方法は、より新しい/dev/kmsg
キャラクターデバイスです。これは、複数のクライアントプロセス間で共有可能な読み取り/書き込みインターフェイスです。複数のプロセスがそれを共有する場合、それらはすべて、互いに影響を受けない同じ完全なデータストリームを読み取ります。書き込みアクセスのために開いた場合、カーネルによって生成されたかのように、カーネルのログストリームにメッセージを挿入することもできます。
/proc/kmsg
および/dev/kmsg
非RFC-5424形式でログデータを提供しています。
用途
アプリケーションが変更されました。
syslog()
メインのGNU Cライブラリの機能は、AF_LOCAL
名前の付いたデータグラムソケットに接続し、/dev/log
ログエントリを書き込みます。(syslog()
最近では/var/run/log
、BSD Cライブラリの関数はソケット名として使用し、/var/run/logpriv
最初に試行します。)もちろん、アプリケーションはこれを直接行う独自のコードを持つことができます。ライブラリ関数は、アプリケーションのプロセスコンテキストで実行される単なるコード(ソケットを開く、接続する、書き込む、閉じる)です。
アプリケーションは、マシン上のAF_INET
/ AF_INET6
データグラムソケットをリッスンしている場合、RFC 5424メッセージをUDP経由でローカルRFC 5426サーバーに送信することもできます。
過去20年にわたるデーモンツールの世界からの圧力のおかげで、多くのデーモンはGNU syslog()
Cライブラリ関数やUDPソケットを使用せず、ログデータを標準エラーに吐き出すモードでの実行をサポートしています。通常のUnixファッション。
一般的なnoshおよびdaemontoolsファミリーによるログ管理
daemontoolsファミリーのツールセットを使用すると、ロギングが非常に柔軟になります。しかし、一般的に家族全員で考えは、各「メイン」デーモンには関連する「ロギング」デーモンがあるということです。「メイン」デーモンは、非デーモンプロセスと同様に機能し、ログメッセージを標準エラー(または標準出力)に書き込みます。サービス管理サブシステムは、パイプ(ログデータが失われないように開いたまま)を介して接続します「ロギング」デーモンの標準入力へのサービスの再起動)。
すべての「ロギング」デーモンは、どこかにログを記録するプログラムを実行します。一般的に、このプログラムのようなものであるmultilog
か、cyclog
それは、標準入力から読み込み、(ナノ秒のタイムスタンプ)厳密にサイズをかぶった、自動的に回転、排他的書き込み、ディレクトリ内のログファイルを書き込みます。一般的に、これらのデーモンはすべて、個々の専用の非特権ユーザーアカウントの保護下で実行されます。
そのため、各サービスのログデータが個別に処理される、大部分が分散したログシステムになります。
一つは、できるような何かを実行klogd
またはsyslogd
またはrsyslogd
のdaemontools-家族サービスの管理下に。しかし、daemontoolsの世界は何年も前に、「ロギング」デーモンを備えたサービス管理構造が、よりシンプルな方法で物事を行うのに非常に適していることを認識していました。すべてのログストリームを1つの巨大なミッシュマッシュに広げ、ログデータを解析してから、ストリームを別のログファイルに戻す必要はありません。そして(場合によっては)信頼性の低い外部ログ回転メカニズムを側面にボルトで固定します。標準のログ管理の一部としてのdaemontools-family構造は、すでにログのローテーション、ログファイルの書き込み、およびストリームの分離を行っています。
さらに:すべてのサービスに共通のツールを使用して特権をドロップするチェーンロードモデルは、ロギングプログラムにスーパーユーザー特権が必要ないことを意味します。UCSPIモデルは、ストリームとデータグラムのトランスポートなどの違いのみを考慮する必要があることを意味します。
noshツールセットはこれを例示しています。1がなくなりできる実行rsyslogd
箱から出して、その下に、とだけカーネルの管理、/run/log
およびUDPは古い方法で入力を記録します。それはまた、これらのものをログに記録するより「daemontoolsのネイティブ」な方法を提供します。
klogd
読み取ったサービス/proc/kmsg
と、単にその標準エラー出力にそのログ・ストリームを書き込みます。これはという簡単なプログラムによって行われklog-read
ます。関連するロギングデーモンは、標準入力のログストリームを/var/log/sv/klogd
ログディレクトリに送ります。
local-syslog-read
データグラムを読み込みサービス/dev/log
(/run/log
BSD系に)単にその標準エラー出力にそのログ・ストリームを書き込みます。これはという名前のプログラムによって行われsyslog-read
ます。関連するロギングデーモンは、標準入力のログストリームを/var/log/sv/local-syslog-read
ログディレクトリに送ります。
udp-syslog-read
単に、UDPのsyslogポートをリッスンし、それに送られるもの読み込み、サービスはその標準エラー出力にそのログ・ストリームを書き込みます。繰り返しますが、プログラムはsyslog-read
です。関連するロギングデーモンは、標準入力のログストリームを/var/log/sv/udp-syslog-read
ログディレクトリに送ります。
- (BSD上)
local-priv-syslog-read
データグラムを読み取り/run/logpriv
、そのログストリームを標準エラーに単に書き込むサービス。繰り返しますが、プログラムはsyslog-read
です。関連するロギングデーモンは、標準入力のログストリームを/var/log/sv/local-priv-syslog-read
ログディレクトリに送ります。
ツールセットには、export-to-rsyslog
1つまたは複数のログディレクトリを監視し(非侵入型ログカーソルのシステムを使用)、指定されたRFC 5426サーバーにネットワーク経由でRFC 5424形式の新しいエントリを送信できるツールも付属しています。
systemdによるログ管理
systemdには、単一のモノリシックログ管理プログラムがありsystemd-journald
ます。これは、systemdによって管理されるサービスとして実行されます。
/dev/kmsg
カーネルログデータを読み取ります。
- GNU Cライブラリの関数からアプリケーションログデータ
/dev/log
を読み取ります(へのシンボリックリンク/run/systemd/journal/dev-log
)syslog()
。
- systemdが管理するサービスからのログデータを
AF_LOCAL
ストリームソケットでリッスンし/run/systemd/journal/stdout
ます。
- systemd固有のジャーナルプロトコル(ie et al。)を話すプログラムからのログデータをデータ
AF_LOCAL
グラムソケットでリッスンし/run/systemd/journal/socket
ますsd_journal_sendv()
。
- これらをすべて一緒に混ぜます。
- それはで、システム全体およびユーザごとのジャーナルファイルのセットに書き込み
/run/log/journal/
か/var/log/journal/
。
- syslogへの転送が設定さ
AF_LOCAL
れ/run/systemd/journal/syslog
ている場合、(クライアントとして)データグラムソケットに接続でき、そこにジャーナルデータを書き込みます。
- 構成されている場合、書き込み可能な
/dev/kmsg
メカニズムを使用して、カーネルバッファーにジャーナルデータを書き込みます。
- 構成されている場合、ジャーナルデータを端末とコンソールデバイスにも書き込みます。
このプログラムがクラッシュした場合、またはサービスが停止した場合、システム全体で問題が発生します。
systemd自体は、(一部の)サービスの標準出力とエラーが/run/systemd/journal/stdout
ソケットに接続されるように調整します。したがって、通常の方法で標準エラーにログを記録するデーモンの出力はジャーナルに送信されます。
これは、klogd、syslogd、syslog-ng、およびrsyslogdを完全に置き換えます。
現在、これらはsystemd固有である必要があります。systemdシステムでは、それらはのサーバー側にはなりません/dev/log
。代わりに、2つのアプローチのいずれかを使用します。
- それらはのサーバー側になり
/run/systemd/journal/syslog
、(覚えていれば)systemd-journald
ジャーナルデータへの接続と書き込みを試みます。数年前には、imuxsock
これを行うためにrsyslogdの入力メソッドを設定していました。
- バイナリジャーナル形式を理解し、追加される新しいエントリのジャーナルファイルとディレクトリを監視できるsystemd固有のライブラリを使用して、systemdジャーナルから直接読み取ります。最近では、
imjournal
これを行うためにrsyslogdの入力メソッドを設定します。