Tizim loglari — journalctl, /var/log

~10 daq · Linux · Jarayonlar va tizim

Muammodan boshlaylik

Ertalab ko'rdingiz: ilova kechasi 03:14 da qayta ishga tushgan. Nega? Xotira tugaganmi? Server qayta yuklanganmi? Kimdir SSH orqali kirib, nimadir qilganmi?

Linux hamma narsani yozib boradi. Javob loglarda — faqat qayerga qarashni bilish kerak.


Loglar qayerda

Zamonaviy Linux da ikki tizim parallel ishlaydi:

  1. journald — systemd ning log tizimi; barcha xizmatlarning chiqishini yig'adi; journalctl bilan o'qiladi
  2. /var/log/ — an'anaviy matnli log fayllar
Fayl Nima
/var/log/syslog Umumiy tizim xabarlari (Ubuntu/Debian)
/var/log/auth.log Kirishlar, sudo, SSH — xavfsizlik
/var/log/kern.log Yadro xabarlari
/var/log/nginx/access.log Nginx so'rovlari
/var/log/nginx/error.log Nginx xatolari
/var/log/mysql/error.log MySQL xatolari
/var/log/apt/history.log Qaysi paketlar qachon o'rnatilgan
sudo tail -f /var/log/syslog
sudo grep "Failed password" /var/log/auth.log | tail

journalctl — systemd loglari

Xizmat bo'yicha

journalctl -u nginx                   # nginx ning barcha loglari
journalctl -u dokon -f                # jonli kuzatish (tail -f kabi)
journalctl -u dokon -n 100            # oxirgi 100 qator
journalctl -u dokon -e                # oxiriga sakrab ochish
journalctl -u dokon -u nginx          # bir nechta xizmat

25-darsdagi xizmatingiz console.log bilan yozgan hamma narsa — shu yerda. Hech qanday log fayl sozlash shart emas.

Vaqt bo'yicha

journalctl --since "1 hour ago"
journalctl --since today
journalctl --since "2026-11-06 03:00" --until "2026-11-06 03:30"
journalctl -u dokon --since yesterday

Muhimlik darajasi bo'yicha

journalctl -p err                     # faqat xatolar va jiddiyroq
journalctl -p warning --since today
journalctl -u dokon -p err -n 20

Darajalar: emerg, alert, crit, err, warning, notice, info, debug.

Yuklanishlar bo'yicha

journalctl -b                         # joriy yuklanishdan beri
journalctl -b -1                      # oldingi yuklanish (qulashdan oldin nima bo'lgan?)
journalctl --list-boots               # barcha yuklanishlar

-b -1 — "server nega qayta yuklandi" savoliga javob: oldingi sessiyaning oxirgi xabarlari.

Yadro xabarlari

journalctl -k                         # yoki: sudo dmesg
journalctl -k | grep -i "out of memory"

Foydali formatlar

journalctl -u dokon --no-pager | grep ERROR     # less siz, grep bilan
journalctl -u dokon -o cat                      # faqat xabarlar, vaqtsiz
journalctl -u dokon -o json-pretty -n 1         # barcha maydonlar

[!INFO] Oddiy foydalanuvchi faqat o'z loglarini ko'radi. Tizim loglari uchun — sudo yoki adm / systemd-journal guruhiga a'zolik.


Tipik tergov: "ilova kechasi nega qayta ishga tushdi?"

# 1. Ilova loglari o'sha vaqtda
journalctl -u dokon --since "03:00" --until "03:30"

# 2. Xotira tugaganmi? (OOM killer)
journalctl -k --since "03:00" --until "03:30" | grep -i -E "oom|killed process"

# 3. Server qayta yuklanganmi?
journalctl --list-boots | tail -3
last reboot | head -3

# 4. Kimdir kirganmi?
sudo grep -E "Accepted|sudo" /var/log/auth.log | grep "Nov  6 03"

OOM topilsa:

Out of memory: Killed process 2214 (node) total-vm:1824000kB, anon-rss:1650000kB

— ilova xotirani tugatgan. Keyingi qadam: xotira oqishini topish yoki systemd da chegaralash (MemoryMax=512M).


Log hajmini boshqarish

journald

journalctl --disk-usage
Archived and active journals take up 1.8G in the file system.
sudo journalctl --vacuum-time=14d        # 14 kundan eskilarini o'chirish
sudo journalctl --vacuum-size=500M       # 500 MB gacha qisqartirish

Doimiy chegara — /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=500M
sudo systemctl restart systemd-journald

logrotate — /var/log fayllari

/var/log dagi fayllarni logrotate avtomatik "aylantiradi": har kuni/haftada eski log yangi nom oladi, siqiladi, eng eskilari o'chiriladi:

access.log          ← joriy
access.log.1        ← kecha
access.log.2.gz     ← siqilgan
...
access.log.14.gz    ← keyin o'chiriladi

O'z ilovangiz faylga log yozsa — sozlama:

sudo nano /etc/logrotate.d/dokon
/var/log/dokon/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}
  • daily, rotate 14 — har kuni, 14 kunlik
  • compress — gzip
  • copytruncate — ilovani qayta ishga tushirmasdan faylni qisqartirish

Sinash: sudo logrotate -d /etc/logrotate.d/dokon (-d — faqat ko'rsatish).

[!TIP] Eng sodda yo'l — ilova loglarini fayl emas, stdout ga yozsin; systemd ularni journald ga yig'adi, hajmini o'zi boshqaradi. Docker da ham xuddi shu tamoyil.


Nima uchun shunday?

Nima uchun journald binar formatda saqlaydi — oddiy matnli fayllar yaxshiroq emasmi?

Matnli fayllarni grep bilan o'qish oson, lekin ularda tuzilma yo'q: "faqat nginx ning, faqat xatolar, faqat kecha 03:00 dan 03:30 gacha, faqat oldingi yuklanishda" — bunday so'rov uchun murakkab regex kerak. journald har bir yozuvni maydonlar bilan saqlaydi (xizmat, PID, foydalanuvchi, daraja, vaqt, yuklanish ID) — shuning uchun -u, -p, --since, -b filtrlari bir zumda ishlaydi. Matn kerak bo'lsa — --no-pager bilan istalgan vaqtda grep ga uzatiladi. Ikki dunyoning eng yaxshisi.


Xulosa

Eslab qoling:

  • /var/log/syslog — umumiy; auth.log — kirishlar va sudo; nginx/ — veb-server
  • journalctl -u xizmat -f — xizmat loglarini jonli kuzatish
  • --since "1 hour ago", --until, -p err, -n 100
  • -b -1 — oldingi yuklanish; -k — yadro (OOM)
  • --vacuum-size=500M — journal hajmini cheklash
  • logrotate — /var/log fayllarini aylantirish va siqish
  • Ilovalar — stdout ga yozsin, journald yig'adi

Keyingi dars

27-dars: Disk va xotira — df, du, free, ncdu