Asosiy kontentga o‘tish

Maqolalar

Darslik · 2026-08-16 · ~4 daqiqa o‘qiladi · o'rta

«Sayt yotibdi!» — journalctl bilan sababni besh daqiqada topish

#linux #devops #monitoring

Mundarija

Qo'ng'iroq keladi: "sayt ochilmayapti". Shu daqiqada ikki xil yo'l bor. Birinchisi — taxmin qilish: restart berib ko'ramiz, balki o'tib ketar. Ikkinchisi — jurnalga qarash va nima bo'lganini bilib harakat qilish. Birinchi yo'l ba'zan tezroq tuyuladi, lekin sabab topilmagani uchun muammo ertaga yana qaytadi. Bu maqola ikkinchi yo'l haqida.

Seriya davomida hamma xizmatni systemd ostiga olib, loglarni stdout'ga yozdirib keldik — endi shu intizom o'z mevasini beradi: hamma narsaning jurnali bitta joyda, bitta asbob bilan o'qiladi.

Boshlanish nuqtasi: status va oxirgi satrlar#

Muammo bo'lganda birinchi buyruq har doim bitta:

systemctl status mysite-web

Bu yerda uch narsani birdan ko'rasiz: xizmat holati (active, failed, activating auto-restart...), qachondan beri shu holatda ekani va — eng foydalisi — jurnaldan oxirgi o'nta satr. Ko'p hollarda sabab shu o'nta satrning ichida yozib turadi: import xatosi, band port, topilmagan fayl.

Yetmasa, jurnalning o'zini ochamiz:

journalctl -u mysite-web -e     # -e: oxiridan boshlab ko'rsat
journalctl -u mysite-web -f     # -f: jonli oqim (yangi satrlar tushib turadi)

To'g'ri savol berish san'ati#

journalctl -u mysite-web ni ochsangiz, oldingizda minglab satr turadi. Loglar bilan ishlashning asosiy mahorati — hammasini o'qish emas, so'rovni toraytirish. Uchta filtr kundalik ishning to'qson foizini yopadi:

# vaqt bo'yicha: muammo qachon boshlangan bo'lsa, o'sha atrofga qaraymiz
journalctl -u mysite-web --since "14:20" --until "14:40"
journalctl -u mysite-web --since "10 min ago"

# daraja bo'yicha: faqat xatolar
journalctl -u mysite-web -p err --since today

# matn bo'yicha: aniq nimanidir qidirsak
journalctl -u mysite-web -g "Timeout" --since yesterday

Va yana bittasi — reboot bilan bog'liq muammolarda oltinga teng:

journalctl -b          # faqat shu yonishdan beri
journalctl -b -1 -e    # OLDINGI yonishning oxiri — o'chishdan avval nima bo'lgan?

-b -1 ko'p narsani ochib beradi: server o'zi o'chib qolgan bo'lsa, sababning izi (masalan OOM-killer ishi) aynan oldingi sessiyaning so'nggi satrlarida qoladi.

Yashirin kasallik: restart-halqa#

Restart=always bilan ishlaydigan xizmatning bir ayyor holati bor: u yiqilib-turib ishlayotgan bo'lishi mumkin — har safar restart uni qutqaradi va tashqaridan hammasi joyida ko'rinadi. Buni Aladdin seriyasida ogohlantirgan edim, endi ushlash usulini ko'rsataman:

# bugun necha marta ishga tushgan?
journalctl -u mysite-web --since today | grep -c "Started"

Javob 1 bo'lishi kerak (yoki deploy qilgan bo'lsangiz, deploy soniga mos). Javob 47 chiqsa — xizmatingiz kun bo'yi o'lib-tirilib yurgan. Sabab odatda takrorlanuvchi xato bo'ladi va uni yiqilish paytlarining logidan topasiz:

# oxirgi yiqilish atrofini ko'ramiz:
journalctl -u mysite-web -p err -e

Qatlamlarni ajratish: log qaysi savolga javob beradi#

Muammo har doim ham ilovada emas. "Sayt ochilmayapti" degan shikoyat ortida to'rt xil qatlam turishi mumkin va har birining o'z jurnali bor:

Savol Qayerga qaraymiz
Umuman serverga yetib kelyaptimi? journalctl -u nginx va tashqaridan curl -I — bu ayrimda server emas, tarmoq muammosi bo'lib chiqadi
Nginx qabul qilib, orqaga uzatolmayaptimi? /var/log/nginx/error.log502 tekshiruv tartibi
Ilova ichida xato bormi? journalctl -u mysite-web -p err
Baza javob bermayaptimi? journalctl -u postgresql -e

Tartib muhim: tashqaridan ichkariga qarab yurasiz. Har qatlamda "bu qatlam sog'mi?" degan bitta savolga javob olasiz va muammo qaysi chegarada yotganini toraytirasiz — xuddi binar qidiruv kabi.

Jurnalning o'zi diskni yemasin#

Bitta amaliy detal ko'pincha e'tibordan chetda qoladi: journald ham disk egallaydi va default sozlamalarda ancha keng yashaydi. Kichik VPS'da buni chegaralab qo'ygan ma'qul:

sudo nano /etc/systemd/journald.conf
[Journal]
Storage=persistent    # jurnal reboot'dan keyin ham saqlansin (default ba'zan RAM'da!)
SystemMaxUse=500M     # jami hajm chegarasi — eski yozuvlar o'zi o'chadi
sudo systemctl restart systemd-journald
journalctl --disk-usage    # hozir qancha joy egallayotganini ko'rsatadi

Storage=persistent'ni tekshiring

Ba'zi tizimlarda jurnal faqat xotirada yashaydi — reboot bo'ldi, loglar yo'q. Ayni "server nega o'chdi" degan eng muhim savolni tekshirayotganda -b -1 bo'sh chiqadi. Storage=persistent bir qator, lekin aynan qora kunda kerak bo'ladigan qator.

Yakun#

Loglar bilan ishlash tartibi qisqa: systemctl statusdan boshlang, vaqt va daraja bilan toraytiring, reboot masalasida -b -1ni unutmang, restart- halqani grep -c "Started" bilan tekshiring va qatlamma-qatlam tashqaridan ichkariga yuring. Restart — davolash emas, og'riq qoldiruvchi; tashxis esa har doim jurnalda.

Seriyaning so'nggi qismi oldinda: sirlarni boshqarish — token va parollar qayerda yashashi kerak, qayerda esa hech qachon ko'rinmasligi kerak.