Di Ubuntu 12.04, saya dapat menemukan pesan log Pemula di /var/log/syslog
.
Perintah:
# initctl log-priority info
# initctl emit hello
Catatan:
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
Di Ubuntu 13.10, pesan tidak muncul di syslog
atau di mana pun di bawah /var/log
direktori, meskipun perintah seperti logger hello
bekerja seperti yang diharapkan. Haruskah saya mencari mereka di tempat lain? Apakah ada pengaturan konfigurasi yang perlu saya ubah di suatu tempat?
Ada pertanyaan tentang Kesalahan Server dari seseorang yang tampaknya memiliki masalah yang sama di Ubuntu 13.04, dan lebih banyak lagi di sini dan di sini yang mungkin juga menjelaskan masalah yang sama. Sayangnya, pertanyaan ini tidak memberikan petunjuk untuk masalah tersebut.
Jawaban Terbaik
Edit 02-06-2016
Jika Anda mencoba menemukan “Pesan log pemula” secara umum, periksa /var/log/upstart/
. Di situlah Pemula menyimpan stdout
dan stderr
dari layanan pemula. Terima kasih atas jawaban leopd untuk menunjukkan hal ini.
Jika Anda mencari pesan log dari Pemula itu sendiri, yang dikonfigurasi 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 di /var/log
juga, tambahkan $KLogPermitNonKernelFacility on
ke konfigurasi rsyslogd. Saya sarankan membuat file khusus seperti /etc/rsyslog.d/60-custom.conf
untuk menghindari pengeditan /etc/rsyslog.conf
, karena itu dikelola oleh dpkg. Sekarang pesan Pemula akan muncul di /var/log/syslog
, setelah Anda menyetel log-priority
Up Pemula ke info
atau lebih.
Versi panjang
Ini membutuhkan waktu berhari-hari bagi saya untuk melacaknya, tetapi tampaknya Pemula (1.5) tidak log ke syslog, yaitu, tidak memanggil fungsi glibc syslog()
. Sebagai gantinya, Pemula masuk ke buffer ring kernel, yang dibaca dmesg. Sekarang, saya tidak berpikir itu mungkin untuk proses ruang pengguna untuk menulis ke buffer itu, tetapi ternyata mereka bisa dengan menulis ke /dev/kmsg
, dan itulah yang dilakukan Pemula. Jadi itulah 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 itu juga menggantikan klogd (semacam:lihat catatan di akhir).
Bagian ketiga adalah bahwa pesan yang ditulis ke buffer ring 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), sedangkan -u
dan -k
beri tahu dmesg untuk masing-masing hanya menampilkan pesan fasilitas pengguna dan pesan fasilitas kernel.
Sekarang inilah penentunya:secara default, rsyslogd mengabaikan pesan dengan fasilitas non-kernel ketika sedang membaca pesan dari buffer ring kernel. Opsi konfigurasi yang relevan adalah $KLogPermitNonKernelFacility
, yang dinonaktifkan secara default dan perlu diaktifkan jika Anda ingin rsyslogd memproses pesan-pesan ini. Perhatikan bahwa konfigurasi rsyslogd lainnya 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 ke /dev/log
. Kode dapat dibaca dari syslog dengan membaca /dev/log
, dan inilah yang syslogd
dan penggantinya lakukan. rsyslogd
membaca /dev/log
menggunakan imuxsock
modul masukan.
Buffer cincin kernel
Ruang kernel menulis ke buffer ini dengan memanggil fungsi kernel printk()
, jadi terkadang disebut buffer printk. Ruang pengguna dapat menulisnya dengan menulis ke /dev/kmsg
. Ruang pengguna dapat membaca dari buffer ini dengan beberapa metode:dapat dibaca dari /proc/kmsg
(apa yang dilakukan dmesg secara default), atau dapat dibaca dari /dev/kmsg
, atau dapat memanggil panggilan sistem syslog()
, yang dijelaskan dalam man 2 syslog
dan sangat berbeda dari fungsi glibc syslog()
dijelaskan dalam man 3 syslog
. glibc sebenarnya menyediakan pembungkus untuk panggilan sistem syslog()
, disebut 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 input tetapi AFAIK tidak repot memanggil glibc syslog()
, itulah sebabnya tidak persis seperti klogd; itu hanya memproses output imklog
sama seperti memproses output dari modul input lainnya. Ada peringatan tambahan bahwa semua imklog
keluaran memiliki kern
fasilitas terlepas dari pesan fasilitas yang ada di buffer ring kernel.
Referensi
- http://upstart.ubuntu.com/cookbook/#initctl-log-priority (Salah menyatakan bahwa Pemula masuk ke syslog)
- https://www.kernel.org/doc/Documentation/ABI/testing/dev-kmsg
- http://www.gnu.org/software/libc/manual/html_node/Overview-of-Syslog.html
- http://www.rsyslog.com/doc/v5-stable/configuration/modules/imklog.html (Perhatikan bahwa ini untuk v5, digunakan di Ubuntu 12.04. Opsi ini dianggap warisan dalam versi rsyslog terbaru)