13-bo‘lim
Jurnal - journalctl bilan ishlash
Xatoni topish uchun jurnalni filtrlash, doimiy saqlash, hajmni cheklash va o'z xabarlaringizni yozish.
Ushbu bo‘lim mundarijasi
Serverda nimadir buzilganda javob deyarli har doim jurnalda yotadi. Muammo - uni topish: kunlik jurnal minglab satrdan iborat, keraklisi esa uchtasi.
Ikki jurnal tizimi #
| Tizim | Qayerda | Format |
|---|---|---|
journald | /var/log/journal/ | Ikkilik, indekslangan |
rsyslog | /var/log/syslog, auth.log | Oddiy matn |
Zamonaviy Ubuntuda ikkalasi ham ishlaydi: journald yig'adi,
rsyslog esa nusxasini matn fayllarga yozadi.
journald jurnalni matn emas, indekslangan ikkilik faylda
saqlaydi. Bu g'alati qaror kabi ko'rinadi, lekin sababi bor:
| Imkoniyat | Matn faylda | journald da |
|---|---|---|
| Xizmat bo'yicha filtrlash | grep bilan taxminan | Aniq (-u) |
| Vaqt oralig'i | Qo'lda | --since / --until |
| Muhimlik darajasi | Yo'q | -p err |
| Kim yozganini soxtalashtirish | Oson | Metama'lumot yadrodan |
| Buzilganini aniqlash | Yo'q | journalctl --verify |
Oxirgi ikkitasi xavfsizlik uchun muhim: hujumchi
/var/log/auth.log dan satr o'chira oladi, journald
faylida esa bu iz qoldiradi.
Narxi - cat va tail ishlamaydi, journalctl kerak.
Asosiy filtrlar #
systemd-cat -t sr-jurnal -p info echo "oddiy ish davom etmoqda"
systemd-cat -t sr-jurnal -p warning echo "disk 80 foiz to'ldi"
systemd-cat -t sr-jurnal -p err echo "bazaga ulanib bo'lmadi"
sleep 1
journalctl -t sr-jurnal -n 3 --no-pager -o cat
oddiy ish davom etmoqda
disk 80 foiz to'ldi
bazaga ulanib bo'lmadi
| Filtr | Nima qiladi |
|---|---|
-u nginx | Xizmat bo'yicha |
-t teg | Syslog tegi bo'yicha |
-p err | Muhimlik darajasi va undan yuqori |
-b | Faqat joriy yuklanishdan beri |
-b -1 | Oldingi yuklanish |
--since, --until | Vaqt oralig'i |
-k | Faqat yadro xabarlari |
-f | Jonli kuzatish |
-n 50 | Oxirgi 50 satr |
-r | Teskari tartib (yangisi birinchi) |
Muhimlik darajalari #
journalctl -t sr-jurnal -p err -n 1 --no-pager -o cat
bazaga ulanib bo'lmadi
journalctl -t sr-jurnal -p warning -n 2 --no-pager -o cat
disk 80 foiz to'ldi
bazaga ulanib bo'lmadi
-p warning faqat warning ni bermaydiYuqoridagi ikkinchi misolda warning va err chiqdi.
-p bayrog'i "shu daraja va undan muhimroq" degani.
Bu syslog ning tarixiy mantiqi va uni chalkashtirish oson.
Faqat bitta darajani olish uchun oraliq yozing:
journalctl -p warning..warning
Amalda esa deyarli har doim chegara kerak bo'ladi: siz "ogohlantirish va undan yomoni" ni qidirasiz, faqat ogohlantirishlarni emas.
Xatoni topish yo'li #
Serverda muammo bo'lganda tartib shunday:
| Qadam | Buyruq |
|---|---|
| 1. Yiqilgan xizmat bormi | systemctl --failed |
| 2. Yuklanishdan beri xatolar | journalctl -p err -b --no-pager |
| 3. Aniq xizmat | journalctl -u nginx -n 100 |
| 4. Vaqt bo'yicha toraytirish | journalctl --since "10:00" --until "10:30" |
| 5. Yadro xabarlari | journalctl -k -b |
| 6. Jonli kuzatish | journalctl -u nginx -f |
--since odam tilida yoziladijournald vaqt ifodalarini juda erkin qabul qiladi:
| Ifoda | Ma'no |
|---|---|
--since "-1h" | Bir soat oldin |
--since today | Bugun yarim tundan |
--since yesterday | Kechadan |
--since "2026-09-01 10:00" | Aniq vaqtdan |
--since "10 min ago" | O'n daqiqa oldin |
--until "-5min" | Besh daqiqa oldingacha |
Ikkalasini birga ishlatish eng foydali:
journalctl --since "-30min" --until "-20min" -p warning
Foydalanuvchi "soat o'nlarda sayt ochilmadi" desa - aynan shu oraliqni kesib olasiz.
Chiqish formatlari #
journalctl -t sr-jurnal -n 1 --no-pager -o json \
| python3 -c 'import sys, json; d = json.load(sys.stdin); print(d["PRIORITY"], d["SYSLOG_IDENTIFIER"])'
3 sr-jurnal
| Format | Qachon |
|---|---|
short | Standart - syslog ga o'xshash |
short-iso | ISO vaqt belgisi bilan |
cat | Faqat xabar - skript uchun qulay |
json | Bitta satr - bitta JSON |
json-pretty | O'qish uchun |
verbose | Barcha metama'lumot |
export | Boshqa serverga uzatish uchun |
-o verbose - "bu xabarni kim yozdi?"Har jurnal yozuvida o'nlab yashirin maydon bor. Ular xabar bilan birga yadro tomonidan yoziladi va ularni dastur soxtalashtira olmaydi:
| Maydon | Nima |
|---|---|
_PID, _UID, _GID | Kim yozdi |
_COMM, _EXE, _CMDLINE | Qaysi dastur |
_SYSTEMD_UNIT | Qaysi xizmat |
_BOOT_ID | Qaysi yuklanish |
_HOSTNAME | Qaysi mashina |
_TRANSPORT | Qanday yetib keldi |
Pastki chiziq bilan boshlangan maydonlar - ishonchli
maydonlar. Ularsizlari (MESSAGE, PRIORITY) dasturning
o'zidan keladi.
Shuning uchun "bu xabarni nginx yozdimi yoki kimdir uni
taqlid qildimi?" degan savolga _SYSTEMD_UNIT javob beradi.
Maydon bo'yicha to'g'ridan-to'g'ri filtrlash ham mumkin:
journalctl SYSLOG_IDENTIFIER=sr-jurnal -n 2 --no-pager -o cat
disk 80 foiz to'ldi
bazaga ulanib bo'lmadi
O'z xabaringizni yozish #
systemd-cat -t sr-mening -p warning echo "zaxira nusxa 20 daqiqa oldi"
sleep 1
journalctl -t sr-mening -n 1 --no-pager -o cat
zaxira nusxa 20 daqiqa oldi
| Vosita | Izoh |
|---|---|
systemd-cat -t teg buyruq | Buyruq chiqishini jurnalga yo'naltiradi |
logger -t teg "matn" | Bitta xabar (syslog orqali) |
logger -p user.err "matn" | Daraja bilan |
Zaxira skripti echo bilan ekranga yozsa, cron uni
pochtaga jo'natadi yoki umuman yo'qotadi.
To'g'ri yondashuv:
#!/bin/bash
exec > >(systemd-cat -t zaxira -p info) 2>&1
echo "zaxira boshlandi"
Endi skriptning butun chiqishi jurnalga tushadi va uni xizmat kabi qidira olasiz:
journalctl -t zaxira --since today
19-bo'limdagi zaxira skriptida aynan shu usulni ishlatamiz.
Doimiy saqlash #
ls -d /var/log/journal && echo "jurnal doimiy saqlanmoqda"
/var/log/journal
jurnal doimiy saqlanmoqda
/var/log/journal bo'lmasa, jurnal qayta yuklashda YO'QOLADIjournald standart holatda Storage=auto rejimida ishlaydi:
| Holat | Jurnal qayerda |
|---|---|
/var/log/journal mavjud | Diskda - qayta yuklashdan omon qoladi |
| Katalog yo'q | /run/log/journal - ya'ni xotirada |
Ikkinchi holatda server qayta yuklanganda jurnal butunlay yo'qoladi - va siz "nega yiqildi?" degan savolga hech qachon javob topa olmaysiz.
Yangi serverda birinchi kuni tekshiring:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
Yoki /etc/systemd/journald.conf da aniq yozing:
[Journal]
Storage=persistent
Shundan keyin journalctl -b -1 bilan oldingi yuklanish
jurnalini o'qiy olasiz - bu yiqilish sababini topishning
asosiy usuli.
Hajmni cheklash #
journalctl --disk-usage 2>&1 | grep -c 'take up'
1
Jurnal diskni to'ldirishi mumkin - shuning uchun chegara qo'yiladi.
| Sozlama | Vazifa |
|---|---|
SystemMaxUse=500M | Jami hajm chegarasi |
SystemKeepFree=1G | Diskda shuncha bo'sh joy qolsin |
SystemMaxFileSize=50M | Bitta fayl hajmi |
MaxRetentionSec=1month | Necha vaqt saqlansin |
MaxFileSec=1week | Fayl qachon almashsin |
Qo'lda tozalash:
| Buyruq | Vazifa |
|---|---|
journalctl --vacuum-size=200M | 200 MB gacha qisqartirish |
journalctl --vacuum-time=7d | 7 kundan eskisini o'chirish |
journalctl --vacuum-files=5 | 5 ta fayl qoldirish |
--vacuum yechim emasDisk to'lganda birinchi refleks - jurnalni tozalash. U joy bo'shatadi, lekin sababni yashiradi.
To'g'ri tartib:
| Qadam | Nima uchun |
|---|---|
| 1. Nima yozayotganini toping | journalctl --since "-1h" | awk '{print $5}' | sort | uniq -c | sort -rn |
| 2. Sababni tuzating | Odatda bitta xizmat sekundiga o'nlab xabar yozadi |
| 3. Keyin cheklov qo'ying | SystemMaxUse= |
| 4. Faqat shundan keyin tozalang | --vacuum-size= |
Eng ko'p uchraydigan sabab - yiqilib-qayta ko'tarilayotgan
xizmat (12-bo'limdagi Restart=always sikli). U sekundiga
o'nlab satr yozadi va bir kunda gigabaytlab joy egallaydi.
rsyslog fayllari #
Ba'zi ma'lumot hali ham matn fayllarda:
| Fayl | Ichida nima |
|---|---|
/var/log/auth.log | SSH kirishlari, sudo chaqiruvlari |
/var/log/syslog | Umumiy tizim xabarlari |
/var/log/nginx/access.log | Veb-server so'rovlari |
/var/log/nginx/error.log | Veb-server xatolari |
/var/log/dpkg.log | Paket o'rnatishlari |
/var/log/apt/history.log | apt amallari |
3-bo'limdagi grep, awk, sort | uniq -c iboralari aynan
shu fayllar uchun kerak:
grep "Failed password" /var/log/auth.log \
| awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
logrotate)Matn jurnallari logrotate bilan boshqariladi -
/etc/logrotate.d/ da har xizmat uchun alohida fayl bor.
| Sozlama | Ma'no |
|---|---|
daily / weekly | Qanchalik tez-tez |
rotate 14 | Necha nusxa saqlanadi |
compress | Eskilarini siqish |
delaycompress | Oxirgisini siqmaslik |
copytruncate | Faylni ko'chirib, aslini bo'shatish |
postrotate | Keyin bajariladigan buyruq |
copytruncate muhim nuqta: usiz logrotate faylni
qayta nomlaydi, va xizmat eski (nomi o'zgargan) faylga
yozishda davom etadi - yangi fayl esa bo'sh qoladi.
Shuning uchun ko'p sozlamalarda postrotate ichida
systemctl reload yoki kill -HUP turadi (10-bo'lim).
Sozlamani sinab ko'rish:
sudo logrotate -d /etc/logrotate.d/nginx
-d hech nima o'zgartirmaydi, faqat nima qilishini
aytadi.
systemd-catbilan uch xil darajada xabar yozing.-p errva-p warningchiqishlarini solishtiring.- Nima uchun
-p warningerrni ham beradi - tushuntiring. --sinceva--untilbilan o'n daqiqalik oraliqni kesing.-o jsonbilan bitta yozuvning maydonlarini ko'ring.-o verboseda pastki chiziqli maydonlarni toping./var/log/journalmavjudligini tekshiring.journalctl --disk-usagebilan hajmni ko'ring./var/log/auth.logdan muvaffaqiyatsiz kirishlarni sanang.logrotate -dbilan sozlamani sinab ko'ring.
Xulosa #
journaldikkilik va indekslangan -grepemas,journalctlkerak.- Pastki chiziqli maydonlar yadrodan keladi - ularni soxtalashtirib bo'lmaydi.
-p err"err va undan muhimroq" degani, faqaterremas.- Xatoni qidirish:
systemctl --failed→journalctl -p err -b→-u xizmat. --sinceodam tilida yoziladi:"-1h",today,"10 min ago".-o catskript uchun,-o verbosetergov uchun.- Skriptlaringiz
systemd-catorqali jurnalga yozsin. /var/log/journalbo'lmasa, jurnal qayta yuklashda yo'qoladi.journalctl -b -1- yiqilish sababini topishning asosiy usuli.- Jurnal to'lganda avval sababni toping, keyin
--vacuumqiling.
Keyingi bo'limda diskni ko'ramiz: df, inode, fayl tizimlari
va disk to'lganda nima qilish kerak.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.