Tizim loglari — journalctl, /var/log
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:
- journald — systemd ning log tizimi; barcha xizmatlarning chiqishini yig'adi;
journalctlbilan o'qiladi /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 —
sudoyokiadm/systemd-journalguruhiga 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 kunlikcompress— gzipcopytruncate— 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-serverjournalctl -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/logfayllarini aylantirish va siqish - Ilovalar — stdout ga yozsin, journald yig'adi
Keyingi dars
27-dars: Disk va xotira — df, du, free, ncdu