13-bo‘lim

Jurnal - journalctl bilan ishlash

Xatoni topish uchun jurnalni filtrlash, doimiy saqlash, hajmni cheklash va o'z xabarlaringizni yozish.

🕑 20 daqiqa o‘qish 📄 1 473 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ikki jurnal tizimi
  2. Asosiy filtrlar
  3. Muhimlik darajalari
  4. Xatoni topish yo'li
  5. Chiqish formatlari
  6. O'z xabaringizni yozish
  7. Doimiy saqlash
  8. Hajmni cheklash
  9. rsyslog fayllari
  10. Xulosa

Serverda nimadir buzilganda javob deyarli har doim jurnalda yotadi. Muammo - uni topish: kunlik jurnal minglab satrdan iborat, keraklisi esa uchtasi.

Ikki jurnal tizimi #

TizimQayerdaFormat
journald/var/log/journal/Ikkilik, indekslangan
rsyslog/var/log/syslog, auth.logOddiy matn

Zamonaviy Ubuntuda ikkalasi ham ishlaydi: journald yig'adi, rsyslog esa nusxasini matn fayllarga yozadi.

Nima uchun ikkilik format

journald jurnalni matn emas, indekslangan ikkilik faylda saqlaydi. Bu g'alati qaror kabi ko'rinadi, lekin sababi bor:

ImkoniyatMatn fayldajournald da
Xizmat bo'yicha filtrlashgrep bilan taxminanAniq (-u)
Vaqt oralig'iQo'lda--since / --until
Muhimlik darajasiYo'q-p err
Kim yozganini soxtalashtirishOsonMetama'lumot yadrodan
Buzilganini aniqlashYo'qjournalctl --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 #

Terminal
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
Terminal
journalctl -t sr-jurnal -n 3 --no-pager -o cat
Natija
oddiy ish davom etmoqda
disk 80 foiz to'ldi
bazaga ulanib bo'lmadi
FiltrNima qiladi
-u nginxXizmat bo'yicha
-t tegSyslog tegi bo'yicha
-p errMuhimlik darajasi va undan yuqori
-bFaqat joriy yuklanishdan beri
-b -1Oldingi yuklanish
--since, --untilVaqt oralig'i
-kFaqat yadro xabarlari
-fJonli kuzatish
-n 50Oxirgi 50 satr
-rTeskari tartib (yangisi birinchi)

Muhimlik darajalari #

Sakkiz daraja - kichik raqam muhimroq 0 emerg Tizim ishlatib bo'lmaydigan holatda 1 alert Darhol aralashuv kerak 2 crit Kritik - disk nosozligi, apparat 3 err Xato - ish bajarilmadi. BUNDAN BOSHLANG 4 warning Ogohlantirish - hozircha ishlayapti 5 notice Muhim, lekin normal hodisa 6 info Odatiy ma'lumot - standart daraja 7 debug Nosozlikni qidirish uchun - odatda o'chirilgan journalctl -p err = 0, 1, 2 va 3 - ya'ni "err VA UNDAN MUHIMROQ"
-p bayrog'i chegara qo'yadi, aniq darajani tanlamaydi
Terminal
journalctl -t sr-jurnal -p err -n 1 --no-pager -o cat
Natija
bazaga ulanib bo'lmadi
Terminal
journalctl -t sr-jurnal -p warning -n 2 --no-pager -o cat
Natija
disk 80 foiz to'ldi
bazaga ulanib bo'lmadi
-p warning faqat warning ni bermaydi

Yuqoridagi 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:

Terminal
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:

QadamBuyruq
1. Yiqilgan xizmat bormisystemctl --failed
2. Yuklanishdan beri xatolarjournalctl -p err -b --no-pager
3. Aniq xizmatjournalctl -u nginx -n 100
4. Vaqt bo'yicha toraytirishjournalctl --since "10:00" --until "10:30"
5. Yadro xabarlarijournalctl -k -b
6. Jonli kuzatishjournalctl -u nginx -f
--since odam tilida yoziladi

journald vaqt ifodalarini juda erkin qabul qiladi:

IfodaMa'no
--since "-1h"Bir soat oldin
--since todayBugun yarim tundan
--since yesterdayKechadan
--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:

Terminal
journalctl --since "-30min" --until "-20min" -p warning

Foydalanuvchi "soat o'nlarda sayt ochilmadi" desa - aynan shu oraliqni kesib olasiz.

Chiqish formatlari #

Terminal
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"])'
Natija
3 sr-jurnal
FormatQachon
shortStandart - syslog ga o'xshash
short-isoISO vaqt belgisi bilan
catFaqat xabar - skript uchun qulay
jsonBitta satr - bitta JSON
json-prettyO'qish uchun
verboseBarcha metama'lumot
exportBoshqa 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:

MaydonNima
_PID, _UID, _GIDKim yozdi
_COMM, _EXE, _CMDLINEQaysi dastur
_SYSTEMD_UNITQaysi xizmat
_BOOT_IDQaysi yuklanish
_HOSTNAMEQaysi mashina
_TRANSPORTQanday 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:

Terminal
journalctl SYSLOG_IDENTIFIER=sr-jurnal -n 2 --no-pager -o cat
Natija
disk 80 foiz to'ldi
bazaga ulanib bo'lmadi

O'z xabaringizni yozish #

Terminal
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
Natija
zaxira nusxa 20 daqiqa oldi
VositaIzoh
systemd-cat -t teg buyruqBuyruq chiqishini jurnalga yo'naltiradi
logger -t teg "matn"Bitta xabar (syslog orqali)
logger -p user.err "matn"Daraja bilan
Skriptlaringiz jurnalga yozsin

Zaxira skripti echo bilan ekranga yozsa, cron uni pochtaga jo'natadi yoki umuman yo'qotadi.

To'g'ri yondashuv:

Terminal
#!/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:

Terminal
journalctl -t zaxira --since today

19-bo'limdagi zaxira skriptida aynan shu usulni ishlatamiz.

Doimiy saqlash #

Terminal
ls -d /var/log/journal && echo "jurnal doimiy saqlanmoqda"
Natija
/var/log/journal
jurnal doimiy saqlanmoqda
/var/log/journal bo'lmasa, jurnal qayta yuklashda YO'QOLADI

journald standart holatda Storage=auto rejimida ishlaydi:

HolatJurnal qayerda
/var/log/journal mavjudDiskda - 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:

Terminal
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:

Natija
[Journal]
Storage=persistent

Shundan keyin journalctl -b -1 bilan oldingi yuklanish jurnalini o'qiy olasiz - bu yiqilish sababini topishning asosiy usuli.

Hajmni cheklash #

Terminal
journalctl --disk-usage 2>&1 | grep -c 'take up'
Natija
1

Jurnal diskni to'ldirishi mumkin - shuning uchun chegara qo'yiladi.

SozlamaVazifa
SystemMaxUse=500MJami hajm chegarasi
SystemKeepFree=1GDiskda shuncha bo'sh joy qolsin
SystemMaxFileSize=50MBitta fayl hajmi
MaxRetentionSec=1monthNecha vaqt saqlansin
MaxFileSec=1weekFayl qachon almashsin

Qo'lda tozalash:

BuyruqVazifa
journalctl --vacuum-size=200M200 MB gacha qisqartirish
journalctl --vacuum-time=7d7 kundan eskisini o'chirish
journalctl --vacuum-files=55 ta fayl qoldirish
Jurnal to'lganda --vacuum yechim emas

Disk to'lganda birinchi refleks - jurnalni tozalash. U joy bo'shatadi, lekin sababni yashiradi.

To'g'ri tartib:

QadamNima uchun
1. Nima yozayotganini topingjournalctl --since "-1h" | awk '{print $5}' | sort | uniq -c | sort -rn
2. Sababni tuzatingOdatda bitta xizmat sekundiga o'nlab xabar yozadi
3. Keyin cheklov qo'yingSystemMaxUse=
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:

FaylIchida nima
/var/log/auth.logSSH kirishlari, sudo chaqiruvlari
/var/log/syslogUmumiy tizim xabarlari
/var/log/nginx/access.logVeb-server so'rovlari
/var/log/nginx/error.logVeb-server xatolari
/var/log/dpkg.logPaket o'rnatishlari
/var/log/apt/history.logapt amallari

3-bo'limdagi grep, awk, sort | uniq -c iboralari aynan shu fayllar uchun kerak:

Natija
grep "Failed password" /var/log/auth.log \
    | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
Jurnal aylanishi (logrotate)

Matn jurnallari logrotate bilan boshqariladi - /etc/logrotate.d/ da har xizmat uchun alohida fayl bor.

SozlamaMa'no
daily / weeklyQanchalik tez-tez
rotate 14Necha nusxa saqlanadi
compressEskilarini siqish
delaycompressOxirgisini siqmaslik
copytruncateFaylni ko'chirib, aslini bo'shatish
postrotateKeyin 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:

Terminal
sudo logrotate -d /etc/logrotate.d/nginx

-d hech nima o'zgartirmaydi, faqat nima qilishini aytadi.

Amaliy topshiriq
  1. systemd-cat bilan uch xil darajada xabar yozing.
  2. -p err va -p warning chiqishlarini solishtiring.
  3. Nima uchun -p warning err ni ham beradi - tushuntiring.
  4. --since va --until bilan o'n daqiqalik oraliqni kesing.
  5. -o json bilan bitta yozuvning maydonlarini ko'ring.
  6. -o verbose da pastki chiziqli maydonlarni toping.
  7. /var/log/journal mavjudligini tekshiring.
  8. journalctl --disk-usage bilan hajmni ko'ring.
  9. /var/log/auth.log dan muvaffaqiyatsiz kirishlarni sanang.
  10. logrotate -d bilan sozlamani sinab ko'ring.

Xulosa #

  • journald ikkilik va indekslangan - grep emas, journalctl kerak.
  • Pastki chiziqli maydonlar yadrodan keladi - ularni soxtalashtirib bo'lmaydi.
  • -p err "err va undan muhimroq" degani, faqat err emas.
  • Xatoni qidirish: systemctl --failedjournalctl -p err -b-u xizmat.
  • --since odam tilida yoziladi: "-1h", today, "10 min ago".
  • -o cat skript uchun, -o verbose tergov uchun.
  • Skriptlaringiz systemd-cat orqali jurnalga yozsin.
  • /var/log/journal bo'lmasa, jurnal qayta yuklashda yo'qoladi.
  • journalctl -b -1 - yiqilish sababini topishning asosiy usuli.
  • Jurnal to'lganda avval sababni toping, keyin --vacuum qiling.

Keyingi bo'limda diskni ko'ramiz: df, inode, fayl tizimlari va disk to'lganda nima qilish kerak.

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.