Mashqlar — log fayllarni tahlil qilish
Muammodan boshlaylik
Dushanba ertalab. Rahbar yozadi: "Kecha sayt sekin ishladi, ba'zilarda xato chiqdi. Nima bo'lgan? Kim ko'p so'rov yuborgan? Qaysi sahifalar muammoli?"
Sizda — Nginx access.log va ilova app.log. Grafana yo'q, monitoring yo'q. Faqat terminal va 12–16-darslarda o'rgangan vositalar. Bu — real hayotdagi eng tipik vaziyatlardan biri.
Tayyorgarlik
Sinov loglarini yaratuvchi skript:
mkdir -p ~/mashq-log && cd ~/mashq-log
cat > yarat.sh << 'EOF'
#!/bin/bash
ipler=(185.220.101.4 91.213.8.92 213.230.112.5 84.54.70.18 95.46.98.12 10.0.0.5)
yollar=("/" "/mahsulotlar" "/mahsulot/42" "/savat" "/api/buyurtma" "/login" "/wp-admin")
kodlar=(200 200 200 200 200 200 301 404 500 502)
for i in $(seq 1 5000); do
ip=${ipler[$((RANDOM % 6))]}
[ $((RANDOM % 3)) -eq 0 ] && ip=185.220.101.4
yol=${yollar[$((RANDOM % 7))]}
kod=${kodlar[$((RANDOM % 10))]}
hajm=$((RANDOM % 50000))
soat=$(printf "%02d" $((RANDOM % 24)))
daq=$(printf "%02d" $((RANDOM % 60)))
usul=GET; [ "$yol" = "/api/buyurtma" ] && usul=POST
echo "$ip - - [05/Nov/2026:$soat:$daq:00 +0500] \"$usul $yol HTTP/1.1\" $kod $hajm \"-\" \"Mozilla/5.0\""
done > access.log
for i in $(seq 1 2000); do
soat=$(printf "%02d" $((RANDOM % 24)))
r=$((RANDOM % 10))
if [ $r -lt 6 ]; then echo "2026-11-05 $soat:00:00 INFO So'rov bajarildi"
elif [ $r -lt 8 ]; then echo "2026-11-05 $soat:00:00 WARN Sekin so'rov: $((RANDOM % 5000))ms"
elif [ $r -lt 9 ]; then echo "2026-11-05 $soat:00:00 ERROR Baza ulanmadi: timeout"
else echo "2026-11-05 $soat:00:00 ERROR Buyurtma $((RANDOM % 100)) topilmadi"
fi
done > app.log
EOF
bash yarat.sh
wc -l access.log app.log
Nginx log formati:
185.220.101.4 - - [05/Nov/2026:14:23:00 +0500] "GET /mahsulotlar HTTP/1.1" 200 12345 "-" "Mozilla/5.0"
$1 $4 $6 $7 $9 $10
awk bo'shliq bo'yicha ajratganda: $1 — IP, $7 — yo'l, $9 — status kodi, $10 — hajm.
1-mashq: Umumiy manzara
- Jami nechta so'rov bo'lgan?
- Nechta so'rov xato bilan tugagan (status 500 yoki 502)?
- Nechta 404?
Yechim
wc -l < access.log
awk '$9 >= 500' access.log | wc -l
awk '$9 == 404' access.log | wc -l
Yoki grep bilan: grep -cE '" 5[0-9]{2} ' access.log.
2-mashq: Status kodlari taqsimoti
Har bir status kodi necha marta uchragan — kamayish tartibida.
Yechim
awk '{print $9}' access.log | sort | uniq -c | sort -rn
3012 200
498 301
511 404
492 500
487 502
3-mashq: Shubhali IP
- Eng ko'p so'rov yuborgan 5 ta IP
- Eng faol IP ning ulushi necha foiz?
- Kim
/wp-adminga urinishgan (bizda WordPress yo'q — bu skaner)?
Yechim
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -5
awk '{c[$1]++} END {for (ip in c) printf "%s %.1f%%\n", ip, c[ip]*100/NR}' access.log \
| sort -k2 -rn | head -1
grep "/wp-admin" access.log | awk '{print $1}' | sort | uniq -c | sort -rn
185.220.101.4 — so'rovlarning ~40% i. Bu bot yoki hujum bo'lishi mumkin; uni bloklash — 36-dars (firewall).
4-mashq: Muammoli sahifalar
- Qaysi yo'llar eng ko'p 5xx xato bergan?
- Har bir yo'l bo'yicha xatolar foizi (jami so'rovlarga nisbatan)
Yechim
awk '$9 >= 500 {print $7}' access.log | sort | uniq -c | sort -rn
awk '{jami[$7]++} $9 >= 500 {xato[$7]++}
END {for (y in jami) printf "%-15s %5d %5d %5.1f%%\n", y, jami[y], xato[y], xato[y]*100/jami[y]}' \
access.log | sort -k4 -rn
/savat 712 151 21.2%
/api/buyurtma 698 145 20.8%
...
Ikkinchi buyruqda ikki blok: birinchisi har qatorda, ikkinchisi faqat shart bajarilganda.
5-mashq: Vaqt bo'yicha
Qaysi soatda eng ko'p so'rov bo'lgan? Soatlar bo'yicha taqsimot.
Yechim
awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c
$4 = [05/Nov/2026:14:23:00 → : bo'yicha 2-qism — soat.
Eng ko'p:
awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c | sort -rn | head -3
Grafik ko'rinishda (oddiy "ustunlar"):
awk '{split($4, t, ":"); c[t[2]]++} END {for (h in c) {printf "%s ", h; for (i=0; i<c[h]/10; i++) printf "#"; print ""}}' access.log | sort
6-mashq: Trafik hajmi
- Jami qancha ma'lumot yuborilgan (MB)?
- Qaysi IP eng ko'p trafik olgan?
Yechim
awk '{s += $10} END {printf "%.1f MB\n", s/1024/1024}' access.log
awk '{t[$1] += $10} END {for (ip in t) printf "%s %.1f MB\n", ip, t[ip]/1024/1024}' access.log \
| sort -k2 -rn | head -3
7-mashq: Ilova logi
app.log da:
- Har bir daraja (INFO, WARN, ERROR) necha marta?
- Xatolar turlari bo'yicha (raqamlarni hisobga olmasdan) — "Buyurtma 15 topilmadi" va "Buyurtma 87 topilmadi" — bitta tur
- Eng sekin so'rov necha ms?
Yechim
awk '{print $3}' app.log | sort | uniq -c
grep ERROR app.log | cut -d' ' -f4- | sed 's/[0-9]\+/N/g' | sort | uniq -c | sort -rn
204 Baza ulanmadi: timeout
198 Buyurtma N topilmadi
grep "Sekin" app.log | grep -oE "[0-9]+ms" | tr -d 'ms' | sort -n | tail -1
sed 's/[0-9]\+/N/g' — barcha raqamlarni N ga almashtirish: shunda bir xil turdagi xatolar guruhlanadi. Bu real log tahlilida juda foydali usul.
8-mashq: Hisobot
Yuqoridagilarni birlashtirib, hisobot.txt faylini yarating: sana, jami so'rovlar, xatolar soni, top-3 IP, top-3 muammoli sahifa.
Yechim
{
echo "=== Kunlik hisobot: $(date +%F) ==="
echo
echo "Jami so'rovlar: $(wc -l < access.log)"
echo "5xx xatolar: $(awk '$9 >= 500' access.log | wc -l)"
echo "404: $(awk '$9 == 404' access.log | wc -l)"
echo
echo "--- Top 3 IP ---"
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -3
echo
echo "--- Eng ko'p 5xx bergan sahifalar ---"
awk '$9 >= 500 {print $7}' access.log | sort | uniq -c | sort -rn | head -3
echo
echo "--- Ilova xatolari ---"
grep ERROR app.log | cut -d' ' -f4- | sed 's/[0-9]\+/N/g' | sort | uniq -c | sort -rn
} > hisobot.txt
cat hisobot.txt
{ ...; } > fayl — bir nechta buyruq chiqishini bitta faylga. 37–41-darslarda buni skriptga aylantirib, cron bilan har kuni avtomatik ishga tushiramiz.
Nima uchun shunday?
Nima uchun bu ko'nikma muhim — monitoring tizimlari (Grafana, ELK) bor-ku?
Chunki ular har doim ham yo'q: kichik loyiha, yangi server, mijozning serveri, yoki monitoringning o'zi ishlamay qolgan. Va ular bo'lsa ham, ko'pincha oldindan o'ylanmagan savol tug'iladi — "faqat /savat dagi, faqat shu IP dan, faqat 14:00–15:00 orasidagi 502 lar" — bunday so'rov uchun dashboard yo'q. Terminal vositalari esa istalgan savolga bir necha daqiqada javob beradi, har qanday formatdagi log bilan. Bu — "muammo nima" degan savolga mustaqil javob topa oladigan dasturchining ko'nikmasi.
Xulosa
Siz mashq qildingiz:
- Nginx log ustunlari:
$1IP,$7yo'l,$9status,$10hajm awk '$9 >= 500'— filtrlash;sort | uniq -c | sort -rn | head— top-Nawkmassivlari — guruhlash va foizlarcut -d:— vaqtni ajratishsed 's/[0-9]\+/N/g'— xatolarni turlar bo'yicha guruhlash{ ...; } > fayl— hisobot yaratish
Keyingi bo'lim
4-bo'lim: Foydalanuvchilar va ruxsatlar — sudo, chmod, va nega "Permission denied".