Sederhana, ini kurang lebih seperti ini:
Kernel mencatat pesan (menggunakan printk()
fungsi) ke buffer cincin di ruang kernel. Pesan-pesan ini tersedia untuk aplikasi ruang pengguna dalam dua cara: melalui /proc/kmsg
file (asalkan /proc
sudah terpasang), dan melalui sys_syslog
syscall.
Ada dua aplikasi utama yang membaca (dan, sampai batas tertentu, dapat mengontrol) buffer cincin kernel: dmesg(1)
dan klogd(8)
. Yang pertama dimaksudkan untuk dijalankan atas permintaan oleh pengguna, untuk mencetak isi buffer cincin. Yang terakhir adalah daemon yang membaca pesan dari /proc/kmsg
(atau panggilan sys_syslog
, jika /proc
tidak dipasang) dan mengirimkannya ke syslogd(8)
, atau ke konsol. Itu mencakup sisi kernel.
Di ruang pengguna, ada syslogd(8)
. Ini adalah daemon yang mendengarkan pada sejumlah soket domain UNIX (terutama /dev/log
, tetapi yang lain dapat dikonfigurasi juga), dan secara opsional ke port UDP 514 untuk pesan. Itu juga menerima pesan dari klogd(8)
( syslogd(8)
tidak peduli /proc/kmsg
). Ini kemudian menulis pesan-pesan ini ke beberapa file di /log
, atau ke pipa bernama, atau mengirimkannya ke beberapa host jarak jauh (melalui syslog
protokol, pada port UDP 514), sebagaimana dikonfigurasi dalam /etc/syslog.conf
.
Aplikasi ruang pengguna biasanya menggunakan libc
fungsi ini syslog(3)
untuk mencatat pesan. libc
mengirim pesan-pesan ini ke soket domain UNIX /dev/log
(di mana mereka dibaca oleh syslogd(8)
), tetapi jika aplikasi chroot(2)
-ed pesan mungkin berakhir ditulis ke soket lain, fi ke /var/named/dev/log
. Tentu saja, ini penting untuk aplikasi yang mengirimkan log ini dan syslogd(8)
untuk menyetujui lokasi soket ini. Untuk alasan ini syslogd(8)
dapat dikonfigurasi untuk mendengarkan soket tambahan selain dari standar /dev/log
.
Akhirnya, syslog
protokol hanyalah protokol datagram. Tidak ada yang menghentikan aplikasi dari mengirim datagram syslog ke soket domain UNIX (asalkan kredensial memungkinkannya untuk membuka soket), melewati syslog(3)
fungsi libc
sepenuhnya. Jika datagram diformat dengan benar syslogd(8)
dapat menggunakannya seolah-olah pesan telah dikirim syslog(3)
.
Tentu saja, di atas hanya mencakup teori logging "klasik". Daemon lain (seperti rsyslog
dan syslog-ng
, seperti yang Anda sebutkan) dapat menggantikan dataran syslogd(8)
, dan melakukan segala macam hal bagus, seperti mengirim pesan ke host jarak jauh melalui koneksi TCP terenkripsi, memberikan stempel waktu resolusi tinggi, dan sebagainya. Dan ada juga systemd
, yang secara perlahan memfagositosis bagian UNIX Linux. systemd
memiliki mekanisme penebangannya sendiri, tetapi cerita itu harus diceritakan oleh orang lain. :)
Perbedaan dengan dunia * BSD:
Pada * BSD tidak ada klogd(8)
, dan /proc
tidak ada (pada OpenBSD) atau sebagian besar sudah usang (pada FreeBSD dan NetBSD). syslogd(8)
membaca pesan kernel dari perangkat karakter /dev/klog
, dan dmesg(1)
digunakan /dev/kmem
untuk mendekode nama kernel. Hanya OpenBSD yang memiliki /dev/log
. FreeBSD menggunakan dua soket domain UNIX /var/run/log
dan var/rub/logpriv
sebagai gantinya, dan NetBSD memiliki a /var/run/log
.
rsyslog
tidak digunakanklogd(8)
karena akarnya kembali, bukan karena baru-baru ini membuat keputusan eksplisit untuk menghapusnya. Ingatan saya bisa gagal. Lagi pula, seperti yang saya katakan, saya hanya mencoba untuk menutupi penebangan "klasik".rsyslogd
menjalankan dan satu Ubuntu 12,04 dengansyslog-ng
menjalankan dan mereka berdua memiliki file/proc/kmsg
terbuka sesuailsof
, yaituklogd
tidak digunakan. Hal lain yang menarik yang saya perhatikan adalah bahwa pesan log disimpan dalam/proc/kmsg
file jika tidak ada daemon syslog yang berjalan dan orang dapat melihatnya dengan contohcat
atau editor teks. Namun, itu hanya mungkin untuk melihat pesan-pesan itu sekali saja karena mereka menghilang setelah melihatnya. Last but not least, mengeksekusidmesg
tidak menghapus konten/proc/kmsg
file./proc/kmsg
bukan file biasa, tidak ada yang "disimpan" di sana, melainkan hanya tampilan buffer cincin kernel. Anda dapat membacanya dengancat
tepat karena Anda tidak memilikiklogd(8)
menjalankan (harus Anda jalankanklogd(8)
,cat /proc/kmsg
akan memblokir).dmesg(1)
membaca pesan dari/dev/kmsg
daripada/proc/kmsg
; dan itu juga dapat menghapus buffer jika Anda menyuruhnya.systemd has its own logging mechanisms, but that story would have to be told by somebody else. :)
- Tolong katakan, Anda punya bakat :-)Jawaban lainnya menjelaskan, seperti yang dikatakan penulisnya, "logging klasik" di Linux. Itu bukan cara kerja banyak sistem saat ini.
Kernel
Mekanisme kernel telah berubah.
Kernel menghasilkan output ke buffer dalam memori. Perangkat lunak aplikasi dapat mengakses ini dengan dua cara. Subsistem logging biasanya mengaksesnya dengan nama pseudo-FIFO
/proc/kmsg
. Sumber informasi log ini tidak dapat dibagi secara bermanfaat di antara pembaca log, karena ini dibaca sekali. Jika beberapa proses membagikannya, mereka masing-masing hanya mendapatkan sebagian dari aliran data log kernel. Ini juga hanya baca.Cara lain untuk mengaksesnya adalah
/dev/kmsg
perangkat karakter yang lebih baru . Ini adalah antarmuka baca-tulis yang dapat dibagikan di antara beberapa proses klien. Jika beberapa proses berbagi, mereka semua membaca aliran data lengkap yang sama, tidak terpengaruh satu sama lain. Jika mereka membukanya untuk akses tulis, mereka juga dapat menyuntikkan pesan ke aliran log kernel, seolah-olah dihasilkan oleh kernel./proc/kmsg
dan/dev/kmsg
menyediakan data log dalam bentuk non-RFC-5424.Aplikasi
Aplikasi telah berubah.
Fungsi pustaka GNU C
syslog()
dalam upaya utama untuk terhubung keAF_LOCAL
soket datagram bernama/dev/log
dan menulis entri log untuk itu. (Fungsi pustaka BSD Csyslog()
saat ini menggunakan/var/run/log
sebagai nama soket, dan mencoba/var/run/logpriv
terlebih dahulu.) Aplikasi tentu saja dapat memiliki kode sendiri untuk melakukan ini secara langsung. Fungsi perpustakaan hanyalah kode (untuk membuka, menghubungkan, menulis, dan menutup soket) yang mengeksekusi dalam konteks proses aplikasi sendiri, setelah semua.Aplikasi juga dapat mengirim pesan RFC 5424 melalui UDP ke server RFC 5426 lokal, jika seseorang mendengarkan pada soket
AF_INET
/AF_INET6
datagram pada mesin.Berkat tekanan dari dunia daemontools selama dua dekade terakhir, banyak dukungan demon berjalan dalam mode di mana mereka tidak menggunakan
syslog()
fungsi pustaka GNU C, atau soket UDP, tetapi hanya memuntahkan data log mereka ke kesalahan standar di mode Unix biasa.manajemen log dengan nosh dan keluarga daemontools secara umum
Dengan rangkaian alat keluarga daemontools, ada banyak fleksibilitas dalam pencatatan. Tetapi secara umum di seluruh keluarga idenya adalah bahwa setiap demon "utama" memiliki dikaitkan "logging" demon. "main" demon bekerja seperti halnya proses non-demon dan menulis pesan log mereka ke kesalahan standar (atau output standar), yang diatur oleh subsistem manajemen layanan untuk terhubung melalui pipa (yang dipegang terbuka agar data log tidak hilang lebih dari restart layanan) ke input standar dari "logging" dasmon.
Semua dasmon "logging" menjalankan program yang mencatat suatu tempat . Secara umum program ini adalah sesuatu seperti
multilog
ataucyclog
yang membaca dari input standar dan menulis (catatan waktu nanosecond) file log dalam direktori ukuran-capped, otomatis diputar, eksklusif-menulis, eksklusif. Secara umum, semua demon ini berjalan di bawah naungan akun pengguna khusus yang tidak memiliki hak pribadi.Jadi seseorang berakhir dengan sistem logging yang sebagian besar didistribusikan, dengan data log masing-masing layanan diproses secara terpisah.
Seseorang dapat menjalankan sesuatu seperti
klogd
atausyslogd
atau dirsyslogd
bawah manajemen layanan keluarga-daemontools. Tetapi dunia daemontools menyadari bertahun-tahun yang lalu bahwa struktur manajemen layanan dengan "logging" dasmon cocok untuk melakukan berbagai hal dengan cara yang lebih sederhana. Tidak perlu mengipasi semua stream log menjadi satu mash mash-mash, mengurai data log, dan kemudian mengipasi stream kembali ke file log yang terpisah; dan kemudian (dalam beberapa kasus) membaut mekanisme rotasi log eksternal yang tidak dapat diandalkan di samping. Struktur daemontools-family sebagai bagian dari manajemen log standarnya sudah melakukan rotasi log, penulisan logfile, dan pemisahan aliran.Selanjutnya: Model pemuatan rantai untuk menjatuhkan hak istimewa dengan alat-alat yang umum di semua layanan berarti bahwa program logging tidak memerlukan hak pengguna super; dan model UCSPI berarti mereka hanya perlu peduli tentang perbedaan seperti transport stream versus datagram.
Toolset nosh mencontohkan ini. Sementara seseorang dapat berjalan
rsyslogd
di bawahnya, di luar kotak, dan hanya mengelola kernel/run/log
,, dan input log UDP dengan cara lama; ini juga menyediakan lebih banyak cara "daemontools asli" untuk mencatat hal-hal ini:klogd
layanan yang membaca dari/proc/kmsg
dan hanya menulis bahwa aliran log kesalahan standar. Ini dilakukan oleh sebuah program sederhana bernamaklog-read
. Log logging terkait memberi aliran log pada input standarnya ke/var/log/sv/klogd
direktori log.local-syslog-read
layanan yang bertuliskan datagram dari/dev/log
(/run/log
di BSD) dan hanya menulis bahwa aliran log kesalahan standar. Ini dilakukan oleh sebuah program bernamasyslog-read
. Log logging terkait memberi aliran log pada input standarnya ke/var/log/sv/local-syslog-read
direktori log.udp-syslog-read
layanan yang mendengarkan pada port syslog UDP, membaca apa yang dikirimkan kepadanya dan hanya menulis aliran log itu ke kesalahan standarnya. Sekali lagi, programnya adalahsyslog-read
. Log logging terkait memberi aliran log pada input standarnya ke/var/log/sv/udp-syslog-read
direktori log.local-priv-syslog-read
layanan yang membaca datagrams dari/run/logpriv
dan hanya menulis aliran log itu ke kesalahan standarnya. Sekali lagi, programnya adalahsyslog-read
. Log logging terkait memberi aliran log pada input standarnya ke/var/log/sv/local-priv-syslog-read
direktori log.Toolset ini juga dilengkapi dengan
export-to-rsyslog
alat yang dapat memantau satu atau beberapa direktori log (menggunakan sistem kursor log yang tidak mengganggu ) dan mengirim entri baru dalam formulir RFC 5424 melalui jaringan ke server RFC 5426 yang ditunjuk.manajemen log dengan systemd
systemd memiliki program manajemen log monolitik tunggal
systemd-journald
,. Ini berjalan sebagai layanan yang dikelola oleh systemd./dev/kmsg
untuk data log kernel./dev/log
(tautan simbolik ke/run/systemd/journal/dev-log
) untuk data log aplikasi darisyslog()
fungsi pustaka GNU C.AF_LOCAL
soket aliran di/run/systemd/journal/stdout
untuk data log yang datang dari layanan yang dikelola sistem.AF_LOCAL
soket datagram di/run/systemd/journal/socket
untuk data log yang berasal dari program yang berbicara protokol jurnal khusus sistem (yaitusd_journal_sendv()
et al.)./run/log/journal/
atau/var/log/journal/
.AF_LOCAL
soket datagram di/run/systemd/journal/syslog
situ menulis data jurnal di sana, jika penerusan ke syslog dikonfigurasi./dev/kmsg
mekanisme yang bisa ditulis .Hal-hal buruk terjadi di seluruh sistem jika program ini macet, atau layanan dihentikan.
systemd sendiri mengatur output standar dan kesalahan (beberapa) layanan yang harus dipasang ke
/run/systemd/journal/stdout
soket. Jadi demon yang masuk ke standard error dalam mode normal memiliki output mereka dikirim ke jurnal.Ini sepenuhnya menggantikan klogd, syslogd, syslog-ng, dan rsyslogd.
Ini sekarang harus spesifik sistemd. Pada sistem systemd mereka tidak bisa menjadi server akhir
/dev/log
. Sebagai gantinya, mereka mengambil satu dari dua pendekatan:/run/systemd/journal/syslog
, yang (jika Anda ingat)systemd-journald
mencoba untuk terhubung dan menulis data jurnal. Beberapa tahun yang lalu, seseorang akan mengkonfigurasiimuxsock
metode input rsyslogd untuk melakukan ini.imjournal
metode input rsyslogd untuk melakukan ini.sumber