Di mana pesan log pemula pada Ubuntu 13.X?

28

Di Ubuntu 12.04, saya dapat menemukan pesan log pemula /var/log/syslog.

Perintah:

# initctl log-priority info
# initctl emit hello

Log:

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 syslogatau di mana pun di bawah /var/logdirektori, meskipun perintah seperti logger helloberfungsi 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-pertanyaan ini tidak menawarkan petunjuk untuk masalah ini.

Bradd Szonye
sumber

Jawaban:

39

Edit 2016-06-02

Jika Anda mencoba menemukan "pesan log baru" secara umum, periksa /var/log/upstart/. Di situlah Pemula menyimpan stdoutdan stderrdari layanan Pemula. Berkat jawaban leopd untuk menunjukkan ini.

Jika Anda mencari pesan log dari Pemula sendiri, yang dikonfigurasikan oleh initctl log-prioritydan 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/logjuga, tambahkan $KLogPermitNonKernelFacility onke konfigurasi rsyslogd. Saya sarankan membuat file khusus /etc/rsyslog.d/60-custom.confuntuk 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-priorityke infoatau 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: -xakan menampilkan fasilitas (dan prioritas), sementara -udan -kmemberi 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 kernfasilitas, 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 syslogddan penggantiannya lakukan. rsyslogdmembaca /dev/logmenggunakan imuxsockmodul 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 syslogdan 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, klogdmembaca dari salah satu antarmuka ini, lalu memanggil fungsi glibc syslog()untuk menyalinnya ke syslog. rsyslogd membaca salah satu antarmuka ini melalui imklogmodul inputnya tetapi AFAIK tidak repot-repot memanggil glibc syslog(), itulah sebabnya mengapa tidak persis seperti klogd; itu hanya memproses keluaran imklogsama seperti memproses keluaran dari modul input lainnya. Ada peringatan tambahan bahwa semua imklogoutput memiliki kernfasilitas terlepas dari pesan-pesan fasilitas yang ada di buffer ring kernel.

Referensi

Vanessa Phipps
sumber
4
Terima kasih atas penjelasan mendalam mengapa ini tidak berhasil dan bagaimana cara memperbaikinya. Salah satu jawaban untuk pertanyaan terkait disebutkan dmesgtetapi tidak masuk akal tanpa konteks yang diberikan di sini.
Bradd Szonye
16

Saya menemukan milik saya di /var/log/upstart/

Leopd
sumber
Saya menemukan milik saya di file di /var/log/upstart/job.logmana jobnama pekerjaan saya.
Kenny Evitt
AFAIK di situlah stdout / stderr dari pekerjaan pergi. Pertanyaan ini adalah tentang pesan log dari Pemula itu sendiri, yang tidak terkait dengan pekerjaan tertentu.
Vanessa Phipps