Edit 2016-06-02
Jika Anda mencoba menemukan "pesan log baru" secara umum, periksa /var/log/upstart/
. Di situlah Pemula menyimpan stdout
dan stderr
dari layanan Pemula. Berkat jawaban leopd untuk menunjukkan ini.
Jika Anda mencari pesan log dari Pemula sendiri, yang dikonfigurasikan oleh initctl log-priority
dan dipancarkan oleh initctl emit
, baca terus!
Versi pendek
Entri log seharusnya benar-benar muncul di dmesg. Meskipun begitu, mereka tidak muncul secara default di /var/log
.
Jika Anda menginginkannya /var/log
juga, tambahkan $KLogPermitNonKernelFacility on
ke konfigurasi rsyslogd. Saya sarankan membuat file khusus /etc/rsyslog.d/60-custom.conf
untuk menghindari pengeditan /etc/rsyslog.conf
, karena itu dikelola oleh dpkg. Sekarang pesan Upstart harus muncul dalam /var/log/syslog
, setelah Anda menetapkan Upstart ini log-priority
ke info
atau lebih.
Versi panjang
Ini membutuhkan waktu berhari-hari untuk saya lacak, tetapi tampaknya Upstart (1.5) tidak masuk ke syslog, artinya, ia tidak memanggil fungsi glibc syslog()
. Sebagai gantinya, Upstart log ke buffer ring kernel, yang dibaca dmesg. Sekarang, saya tidak berpikir itu mungkin untuk proses ruang pengguna untuk menulis ke buffer itu, tetapi tampaknya mereka bisa dengan menulis /dev/kmsg
, dan itulah yang dilakukan oleh pemula. Jadi itu bagian pertama dari teka-teki.
Bagian kedua adalah bahwa ada kepercayaan luas bahwa pesan yang ditulis ke buffer ring kernel secara otomatis disalin ke syslog oleh kernel (setidaknya itulah yang selalu saya pikirkan). Ternyata ini sebenarnya dilakukan oleh daemon ruang pengguna, secara tradisional klogd, yang beroperasi bersama-sama dengan syslogd. Jelas rsyslogd menggantikan syslogd tetapi ternyata juga menggantikan klogd (semacam: lihat catatan di bagian akhir).
Bagian ketiga adalah bahwa pesan yang ditulis ke buffer cincin kernel dari ruang pengguna sebenarnya terlihat berbeda dari pesan yang ditulis dari ruang kernel: mereka memiliki fasilitas yang berbeda. dmesg memiliki beberapa opsi yang berinteraksi dengan ini: -x
akan menampilkan fasilitas (dan prioritas), sementara -u
dan -k
memberi tahu dmesg untuk hanya menampilkan pesan fasilitas pengguna dan pesan fasilitas kernel.
Sekarang inilah yang menentukan: secara default, rsyslogd mengabaikan pesan dengan fasilitas non-kernel saat membaca pesan dari buffer cincin kernel. Opsi konfigurasi yang relevan adalah $KLogPermitNonKernelFacility
, yang mati secara default dan perlu dihidupkan jika Anda ingin rsyslogd memproses pesan-pesan ini. Perhatikan bahwa sisa konfigurasi rsyslogd akan memperlakukan semua pesan dari buffer ring kernel sebagai memiliki kern
fasilitas, terlepas dari fasilitas yang mereka miliki di buffer ring kernel.
Informasi lebih lanjut
syslog
Kode dapat menulis ke syslog dengan memanggil fungsi glibc syslog()
, dijelaskan dalam man 3 syslog
. Rupanya fungsi-fungsi ini menulis /dev/log
. Kode dapat membaca dari syslog dengan membaca /dev/log
, dan ini adalah apa syslogd
dan penggantiannya lakukan. rsyslogd
membaca /dev/log
menggunakan imuxsock
modul inputnya.
Buffer cincin kernel
Ruang kernel menulis ke buffer ini dengan memanggil fungsi kernel printk()
, sehingga kadang-kadang disebut buffer printk. Ruang pengguna dapat menulis ke sana dengan menulis ke /dev/kmsg
. Ruang pengguna dapat membaca dari buffer ini dengan beberapa metode: dapat membaca dari /proc/kmsg
(apa yang dilakukan dmesg secara default), atau dapat membaca dari /dev/kmsg
, atau dapat memanggil system call syslog()
, yang dijelaskan dalam man 2 syslog
dan benar - benar berbeda dari fungsi glibc yang syslog()
dijelaskan di man 3 syslog
. glibc sebenarnya menyediakan pembungkus untuk pemanggilan sistem syslog()
, dipanggil klogctl()
, untuk membantu meringankan kebingungan ini.
Secara tradisional, klogd
membaca dari salah satu antarmuka ini, lalu memanggil fungsi glibc syslog()
untuk menyalinnya ke syslog. rsyslogd membaca salah satu antarmuka ini melalui imklog
modul inputnya tetapi AFAIK tidak repot-repot memanggil glibc syslog()
, itulah sebabnya mengapa tidak persis seperti klogd; itu hanya memproses keluaran imklog
sama seperti memproses keluaran dari modul input lainnya. Ada peringatan tambahan bahwa semua imklog
output memiliki kern
fasilitas terlepas dari pesan-pesan fasilitas yang ada di buffer ring kernel.
Referensi
dmesg
tetapi tidak masuk akal tanpa konteks yang diberikan di sini.