Ubuntu 12.04では、/var/log/syslog
にUpstartログメッセージがあります。
コマンド:
# initctl log-priority info
# initctl emit hello
ログ:
Apr 1 01:56:56 precise64 kernel: [ 8365.820425] init: Connection from private client
Apr 1 01:56:56 precise64 kernel: [ 8365.821130] init: Handling hello event
Ubuntu 13.10では、/var/log
などのコマンドは正常に機能しますが、メッセージはsyslog
またはlogger hello
ディレクトリの下のどこにも表示されません。他の場所で探してください。どこかに変更する必要がある構成設定はありますか?
Ubuntu 13.04で同じ問題を抱えていると思われる誰かからの サーバー障害に関する質問 があり、さらに here および here 同じ問題を説明します。残念ながら、これらの質問は問題の原因にはなりません。
一般に「Upstartログメッセージ」を見つけようとしている場合は、/var/log/upstart/
を確認してください。 Upstartは、Upstartサービスからstdout
とstderr
を保存します。これを指摘してくれたleopdの回答に感謝します。
Upstart自体からのログメッセージを探している場合は、initctl log-priority
で構成され、initctl emit
で出力されます。読み進めてください!
ログエントリは、実際にはdmesgに表示されるはずです。それにもかかわらず、デフォルトでは/var/log
にnotが表示されます。
それらも/var/log
に入れたい場合は、$KLogPermitNonKernelFacility on
をrsyslogdの設定に追加してください。 /etc/rsyslog.d/60-custom.conf
のようなカスタムファイルを作成して、/etc/rsyslog.conf
の編集を避けることをお勧めします。これはdpkgによって管理されているためです。 Upstartの/var/log/syslog
をinfo
に設定すると、Upstartメッセージがlog-priority
に表示されるようになります。
これを追跡するのに何日もかかりましたが、明らかにUpstart(1.5)はsyslogにnotログを記録します。つまり、glibc関数syslog()
を呼び出しません。代わりに、Upstartはdmesgが読み取るカーネルリングバッファーにログを記録します。今、ユーザー空間プロセスがそのバッファーに書き込むことは可能だとは思いませんでしたが、明らかに/dev/kmsg
に書き込むことで可能です、そしてそれがまさにUpstartの仕事です。これがパズルの最初の部分です。
2番目の部分は、カーネルリングバッファーに書き込まれたメッセージがカーネルによって自動的にsyslogにコピーされるという広く信じられていることです(少なくとも、私は常に考えていました)。これは、実際にはsyslogdと連携して動作するユーザースペースデーモン(従来はklogd)によって行われます。明らかに、rsyslogdはsyslogdを置き換えますが、明らかにklogdも置き換えます(並べ替え:末尾の注を参照)。
3番目の部分は、ユーザー空間からカーネルリングバッファーに書き込まれたメッセージは、実際にはカーネル空間から書き込まれたメッセージとは異なるように見えることです。つまり、機能が異なります。 dmesgには、これと対話するいくつかのオプションがあります。-x
は機能(および優先度)を表示し、-u
および-k
はdmesgにユーザー機能メッセージとカーネル機能メッセージのみを表示するよう指示します。それぞれ。
これがクリンチャーです。デフォルトでは、カーネルリングバッファーからメッセージを読み取るときに、非カーネル機能を備えたrsyslogdignoresメッセージが表示されます。関連する設定オプションは$KLogPermitNonKernelFacility
です。これはデフォルトでオフになっており、rsyslogdでこれらのメッセージを処理する場合はオンにする必要があります。 rsyslogdの残りの設定は、カーネルリングバッファーにある機能に関係なく、カーネルリングバッファーからのすべてのメッセージをkern
機能を持つものとして扱うことに注意してください。
コードは、man 3 syslog
で説明されているglibc関数syslog()
を呼び出すことでsyslogに書き込むことができます。明らかにこれらの関数は/dev/log
に書き込みます。コードは/dev/log
を読み取ることでsyslogから読み取ることができます。これはsyslogd
とその置換が行うことです。 rsyslogd
は、imuxsock
入力モジュールを使用して/dev/log
を読み取ります。
カーネル関数は、カーネル関数printk()
を呼び出してこのバッファーに書き込みます。したがって、printkバッファーと呼ばれることもあります。ユーザースペースは、/dev/kmsg
に書き込むことで書き込みできます。ユーザー空間は、いくつかの方法でこのバッファから読み取ることができます:/proc/kmsg
(デフォルトではdmesgが行うこと)から読み取るか、/dev/kmsg
から読み取るか、システムコールsyslog()
を呼び出すman 2 syslog
で説明されており、man 3 syslog
で説明されているglibc関数syslog()
とは完全に異なります。 glibcは、実際にはsyslog()
と呼ばれるシステム呼び出しklogctl()
にラッパーを提供し、この混乱を軽減します。
従来、klogd
はこれらのインターフェイスの1つから読み取り、glibc関数syslog()
を呼び出してsyslogにコピーします。 rsyslogdはimklog
入力モジュールを介してこれらのインターフェイスの1つを読み取りますが、AFAIKはglibc syslog()
を呼び出さないため、klogdとまったく同じではありません。他の入力モジュールからの出力を処理するのと同じように、imklog
の出力を処理するだけです。カーネルリングバッファーにあるファシリティメッセージに関係なく、すべてのimklog
出力にkern
ファシリティがあるという警告が追加されています。
私は/var/log/upstart/
で私のものを見つけました