Tarkibga o'tish

Tizim loglari va dmesg

Linux loglari maqolasida ko'rilgan to'rtta qatlamdan ikkitasi — kernel va syslog — eng eski va eng past darajadagilari. Ikkalasi ham systemd dan o'nlab yillar oldin paydo bo'lgan va ikkalasi bugun ham journal bilan yonma-yon ishlaydi. Bu maqola shu ikki qatlamni batafsil ochib beradi: kernelning halqa buferi va rsyslog xizmati — har biri qanday ishlaydi, ma’lumotlarni qayerda saqlaydi va production serverda qanday sozlanadi.

Kernel halqa buferi va dmesg

Kernel o'zi haqidagi xabarlarni — uskunani aniqlash, drayverlarni yuklash, xotiraga oid ogohlantirishlar va boshqalarni — qat’iy hajmli halqa buferiga (ring buffer) yozadi. U "halqa" deb ataladi, chunki bufer to'lgach, eng eski xabarlar avtomatik ravishda yangilari bilan ustiga yoziladi; buferning hajmi hech qachon o'zgarmaydi.

dmesg | tail -n 5
[    4.812301] nvme0n1: p1 p2
[    5.023117] EXT4-fs (nvme0n1p2): mounted filesystem with ordered data mode
[   12.441209] systemd[1]: Started Network Manager.
[  601.220304] usb 1-1: new high-speed USB device number 3 using xhci_hcd
[  601.331882] vfat: Unknown parameter 'utf8'

Qavs ichidagi son — boot’dan beri o'tgan soniyalar soni. Hodisani real vaqtga joylashtirmoqchi bo'lgan odam uchun bu uncha qulay emas. Uni o'qilishi oson sana va vaqtga aylantirish uchun:

dmesg -T | tail -n 5
[Fri Jul 24 08:12:05 2026] nvme0n1: p1 p2
[Fri Jul 24 08:12:06 2026] EXT4-fs (nvme0n1p2): mounted filesystem with ordered data mode
[Fri Jul 24 08:12:13 2026] systemd[1]: Started Network Manager.
[Fri Jul 24 08:22:01 2026] usb 1-1: new high-speed USB device number 3 using xhci_hcd
[Fri Jul 24 08:22:01 2026] vfat: Unknown parameter 'utf8'

Kernel modullari maqolasida dmesg modul yuklash xatolarini tekshirish uchun eng oddiy shaklda ishlatilgan edi. Bu yerda vositaning barcha imkoniyatlarini ko'rib chiqamiz.

Jiddiylik darajasi bo'yicha filtrlash

Kernel xabarlari ham syslog xabarlari kabi 0 dan 7 gacha jiddiylik darajasiga ega (keyingi bo'limdagi jadvalga qarang). Faqat xatolarni va undan jiddiyroq narsalarni ko'rish uchun:

dmesg --level=err,crit,alert,emerg

Yoki qisqaroq:

dmesg -l err

Jonli kuzatish

dmesg -w

-w (--follow) yangi kernel xabarlarini journalctl -f kabi real vaqtda ekranga chiqaradi. USB qurilma ulanganda yoki disk xatosi yuz berganda aynan nima bo'lishini ko'rish uchun foydali. Ctrl+C bilan to'xtating.

Info

Kernel halqa buferi xotirada turadi va hajmi qat’iy — yetarlicha yangi xabar kelsa, eng eskilari qayta yuklashsiz ham yo'qoladi. Ishonchli, uzoq muddatli tarix uchun journalctl -k (journal’dan olingan faqat kernel xabarlari) yoki /var/log/kern.log dan foydalaning — halqa buferidan farqli o'laroq, ikkalasi ham diskka yoziladi.

journalctl -k -b

-k (--dmesg) journalctl ni faqat kernel xabarlari bilan, -b esa joriy boot bilan cheklaydi — amalda bu dmesg ning journal orqali yetkaziladigan, diskka asoslangan versiyasi.

Syslog: facility va priority

rsyslog va u kelib chiqqan klassik syslog protokoli har bir xabarni ikki o'lchov bo'yicha tasniflaydi:

  • facility — xabar tizimning qaysi qismidan kelgani (kern, auth, daemon, mail, cron, local0–local7 va boshqalar);
  • priority (jiddiylik) — xabar qanchalik jiddiyligi.
Daraja Kalit so'z Ma’nosi
0 emerg Tizimdan foydalanib bo'lmaydi
1 alert Darhol chora ko'rish kerak
2 crit Kritik xato
3 err Oddiy xato
4 warning Ogohlantirish holati
5 notice Muhim, lekin xato emas
6 info Umumiy axborot xabari
7 debug Dasturchilarga mo'ljallangan batafsil ma’lumot

Bu journalctl maqolasidagi journalctl -p ishlatadigan o'sha jadval — tasodif emas, chunki ikkalasi ham bitta syslog standarti (RFC 5424) asosida qurilgan.

Intervyuda

local0 dan local7 gacha bo'lgan facility’lar aynan oldindan belgilangan biror toifaga sig'maydigan maxsus ilovalar uchun mavjud. Intervyuda ko'p beriladigan savol: o'zingiz yozgan skript chiqishini o'z log faylini boshqarish kodini yozish o'rniga standart log pipeline’iga qanday yo'naltirasiz? Javob — logger buyrug'i: logger -p local0.info -t myapp "message text" xabarga facility, priority va identifikatsiya tegi biriktiradi, so'ng uni boshqa har qanday dastur kabi syslog socket’iga topshiradi. Shundan keyin u kernel yoki auth xabarlari bilan bir xil rsyslog selector qoidalariga bo'ysunadi — ilovaning o'zida faylga yozadigan maxsus kod kerak emas.

rsyslog konfiguratsiyasi

Asosiy konfiguratsiya /etc/rsyslog.conf da, qo'shimcha konfiguratsiya fayllari esa /etc/rsyslog.d/ ostida turadi:

cat /etc/rsyslog.d/50-default.conf
auth,authpriv.*                /var/log/auth.log
*.*;auth,authpriv.none         -/var/log/syslog
kern.*                         -/var/log/kern.log
cron.*                         /var/log/cron.log

Har bir qator quyidagi tuzilishga ega: facility.priority destination.

  • auth,authpriv.* — auth yoki authpriv facility’sidan kelgan barcha jiddiylik darajalari /var/log/auth.log ga boradi;
  • *.*;auth,authpriv.none — auth/authpriv dan tashqari (none) har bir facility va har bir jiddiylik darajasi /var/log/syslog ga boradi;
  • kern.* — barcha kernel xabarlari /var/log/kern.log ga boradi.

Manzil yo'li oldidagi - prefiksi har bir yozuvdan keyin diskka sinxronlash o'rniga buferlashni yoqadi; bu o'tkazuvchanlikni oshiradi, lekin kutilmagan elektr uzilishida oxirgi bir nechta yozuv yo'qolishi mumkinligini anglatadi.

Yangi qoida qo'shish

Masalan, local0 facility’si ostida yozilgan har bir xabarni alohida faylga yo'naltirish:

sudo nano /etc/rsyslog.d/60-myapp.conf
local0.*    /var/log/myapp.log
sudo systemctl restart rsyslog

Konfiguratsiya o'zgarishi faqat rsyslog qayta ishga tushirilgandan keyin kuchga kiradi — bu Xizmatlarni boshqarish maqolasida ko'rilgan o'sha andoza.

Markaziy log serveriga uzatish

rsyslog ning serverlar parkida mavjud bo'lishining asl sababi shundaki, xuddi shu selector sintaksisi faylga emas, masofaviy hostga ishora qila oladi. Bu markazlashgan log yozishning asosi: har bir server o'z log'larini bitta yig'uvchiga jo'natadi:

*.*    @central-logserver:514      # single @  = UDP  (light, may drop under load)
*.*    @@central-logserver:514     # double @@ = TCP  (reliable, ordered)

Bitta @ (UDP) shakli — klassik intervyu tuzog'i: u yengilroq, lekin tarmoq yoki yig'uvchi to'lib qolganda xabarlarni indamay tashlab yuboradi — aynan log'lar eng muhim bo'lgan paytda. Production’dagi markazlashgan log yozish deyarli har doim @@ (TCP) dan, ko'pincha ustiga RELP yoki TLS bilan foydalanadi — aynan hodisa paytida diagnostik dalillar birinchi bo'lib yo'qolmasligi uchun.

rsyslog va journald o'rtasidagi munosabat

Ubuntu Server’da bu ikki tizim bir-birining o'rnini bosmaydi — ular birga ishlaydi:

flowchart LR
    A["Kernel"] --> B["systemd-journald"]
    C["Applications / services"] --> B
    B --> D["Journal (binary format)"]
    B --> E["rsyslog (via the imjournal module)"]
    E --> F["/var/log/syslog, kern.log, auth.log ..."]

systemd-journald har bir manbadan — kernel, xizmatlar, ilovalar — xabarlarni birinchi bo'lib qabul qiladi va ularni o'zining binary formatdagi bazasiga yozadi; bu journalctl maqolasida ko'rilgan mexanizm. So'ng rsyslog o'zining imjournal moduli orqali o'sha journal’dan o'qiydi va xabarlarni an’anaviy, oddiy matnli /var/log/ fayllariga qayta yozadi.

Tip

Amalda bu bitta xato xabarini ham journalctl -u nginx.service bilan, ham grep nginx /var/log/syslog bilan topish mumkinligini anglatadi — ikkalasi ham to'g'ri, faqat format va qidirish uchun ishlatiladigan vosita bilan farq qiladi. journalctl unit bilan cheklangan tezkor so'rovlar uchun qulayroq; oddiy matnli syslog fayllari esa umumiy matn qayta ishlash vositalari (grep, awk) bilan ishlashda yoki markaziy log serveriga uzatishda qulayroq.

Amaliy vaziyat: yangi ulangan USB diskni aniqlash

Faraz qilaylik, serverga tashqi disk ulandi, lekin u kutilganidek ko'rinmayapti. Faqat o'qiydigan buyruqlar bilan tekshiring:

dmesg -T -w

Diskni ulang va yangi qatorlarni kuzating — odatda shunga o'xshash narsa chiqadi:

[Fri Jul 24 12:40:11 2026] usb 1-1: new high-speed USB device number 5 using xhci_hcd
[Fri Jul 24 12:40:11 2026] usb-storage 1-1:1.0: USB Mass Storage device detected
[Fri Jul 24 12:40:12 2026] sd 4:0:0:0: [sdb] Attached SCSI disk

Agar disk umuman aniqlanmasa, hech qanday xabar chiqmaydi — bu uskuna yoki kabel muammosiga ishora qiladi. Agar [sdb] Attached SCSI disk chiqsa-yu, disk baribir mount qilinmagan bo'lsa, muammo endi kernel darajasida emas; u boshqa joyda ko'riladigan alohida mavzu — mount konfiguratsiyasiga o'tgan.

Keng tarqalgan xatolar

dmesg chiqishini vaqt belgilarisiz o'qish

Oddiy dmesg faqat boot’dan beri o'tgan soniyalarni ko'rsatadi, bu esa xabarni kalendar vaqt chizig'iga darhol joylashtirishni qiyinlashtiradi. Deyarli har doim dmesg -T yaxshiroq sukut bo'yicha tanlov.

Halqa buferi diskka yoziladi deb o'ylash

Halqa buferi faqat xotirada turadi — yetarlicha yangi xabar kelsa, eski ma’lumotlar qayta yuklashsiz ham yo'qolishi mumkin. Ishonchli tahlil uchun journalctl -k yoki /var/log/kern.log ishonchliroq.

rsyslog.conf ni tahrirlab, qayta ishga tushirishni unutish

Hatto to'g'ri yozilgan konfiguratsiya fayli ham rsyslog xizmati qayta yuklanmaguncha hech qanday ta’sir qilmaydi; shu paytgacha u eski qoidalar bilan ishlashda davom etadi.

dmesg sudo siz ishlaydi deb kutish

Ubuntu va ko'p kuchaytirilgan kernellarda kernel.dmesg_restrict sukut bo'yicha 1 ga o'rnatilgan, shuning uchun root bo'lmagan foydalanuvchi chiqish o'rniga dmesg: read kernel buffer failed: Operation not permitted xabarini oladi. dmesg ni (va dmesg -T/-w ni) sudo bilan ishga tushiring yoki xuddi shu ma’lumotni kirish huquqi guruh a’zoligi (adm/systemd-journal) bilan boshqariladigan, diskka asoslangan journalctl -k dan o'qing. Bu cheklov mavjud, chunki kernel buferining xom mazmuni hujumchi uchun foydali bo'lgan xotira manzillari va uskuna tafsilotlarini oshkor qilishi mumkin.

Mashqlar

  1. dmesg -T | tail -n 20 ni ishga tushiring, kamida uchta xabarni tanlang va har biri nima haqida ekanini tushuntiring.
  2. /etc/rsyslog.d/50-default.conf ni (yoki tizimingizdagi unga teng faylni) oching va kamida uchta qoidani facility.priority → destination shaklida tahlil qiling.
  3. Yuqoridagi mermaid diagrammasidan foydalanib, bitta xato xabari kerneldan journalctl ga va /var/log/kern.log ga qanday yo'l bosib o'tishini o'z so'zlaringiz bilan tasvirlab bering.
  4. Sinov VM’ida local0 facility’si uchun yangi qoida qo'shing, logger -p local0.info "test message" bilan sinov xabarini yuboring va uni o'zingiz yaratgan faylda toping.

Mashqni bajardim deyish uchun: 4-mashqdagi qoidangiz sinov xabarini faqat yangi faylga yo'naltirishi kerak, /var/log/syslog ga ham emas — agar u ikkalasida ham paydo bo'lsa, sukut bo'yicha konfiguratsiyada ishlatilgan .none istisno andozasini qayta ko'rib chiqing.

Manbalar

  • man7.org: dmesg(1): https://man7.org/linux/man-pages/man1/dmesg.1.html
  • man7.org: syslog(3): https://man7.org/linux/man-pages/man3/syslog.3.html
  • Rsyslog hujjatlari: https://www.rsyslog.com/doc/
  • RFC 5424: The Syslog Protocol: https://www.rfc-editor.org/rfc/rfc5424
  • man7.org: journalctl(1) — -k flag'i: https://man7.org/linux/man-pages/man1/journalctl.1.html