Ось готовий урок, створений за твоїм майстер-промптом. Вмикаймо режим CS50! 🚀
🕵️♂️ Урок: Логи доступу та помилок
1. 🔥 Вступ: Чорна скринька вашого сервера
Привіт, друзі! Радий вас бачити.
Уявіть ситуацію. Ви запустили свій ідеальний веб-сайт. Код красивий, тести пройшли, ви натиснули кнопку "Deploy", і пішли пити каву. Через 10 хвилин дзвонить клієнт: "Нічого не працює! Я натискаю 'Купити', а воно просто висить!".
Ви відкриваєте сайт у себе — все працює. Ви відкриваєте з телефону — все працює. Клієнт кричить, гроші втрачаються.
Питання: Як дізнатися, що саме сталося у клієнта 10 хвилин тому, якщо ви не стояли у нього за спиною?
Тут на сцену виходять Логи (Logs).
Уявіть, що ваш сервер — це літак. Коли літак летить, пілоти (це ви) не можуть бачити кожен гвинтик. Але якщо щось трапиться, рятувальники шукають "Чорну скриньку". Вона записує все: висоту, швидкість, розмови пілотів, помилки двигуна.
Логи — це і є чорна скринька вашої програми. Без них ви сліпі. З ними — ви детективи, які можуть відновити картину злочину (або багу) до секунди.
Сьогодні ми розберемося, як читати ці записи, щоб перетворити хаос "нічого не працює" на чіткий план дій. Поїхали!
2. 🧠 Теоретична база: Що "під капотом"?
Давайте спростимо. Що таке лог-файл? Це просто текстовий файл, у який ваша програма або сервер "дописує" нові рядки.
У світі веб-розробки (та й не тільки) існує два головних типи логів, які ви зобов’язані розрізняти.
🟢 1. Access Log (Лог доступу)
Це як журнал охоронця на вході в елітний клуб. Охоронець записує кожного, хто підходить до дверей:
* Хто прийшов? (IP-адреса)
* Коли? (Дата і час)
* Що хотів? (Яку сторінку просив: /home, /login)
* Ми його пустили? (Статус код: 200 OK, 403 Forbidden, 404 Not Found)
Інтуїтивно: Access Log показує нормальне життя вашого додатку. Хто ходить, куди клікає.
🔴 2. Error Log (Лог помилок)
Це медична картка пацієнта в реанімації. Сюди пишеться тільки те, що пішло не так. * Сервер не зміг підключитися до бази даних. * У коді сталася помилка ділення на нуль. * Закінчилася оперативна пам'ять.
Інтуїтивно: Error Log — це крик про допомогу. Якщо там з'являються нові записи — треба все кидати і лагодити.
Як це працює технічно?
Ваша програма має два стандартні потоки виводу (як дві труби):
1. stdout (Standard Output) — сюди зазвичай летить звичайна інформація (Access logs).
2. stderr (Standard Error) — сюди летять помилки.
Веб-сервери (Nginx, Apache) або Docker-контейнери просто ловлять усе, що вилітає з цих "труб", і складають у файли: access.log та error.log.
3. 🧪 Приклади: Від азбуки до розслідування
Давайте подивимось на це очима.
Приклад 1: Access Log (Класика Nginx)
Ось рядок, який ви побачите тисячі разів. Не лякайтесь, зараз ми його розберемо.
127.0.0.1 - - [28/Jan/2026:14:32:10 +0000] "GET /images/logo.png HTTP/1.1" 200 4501 "-" "Mozilla/5.0 Chrome/90.0"
Питання до вас: Як ви думаєте, чи успішним був цей запит? Подивіться на цифри.
(Пауза для роздумів...)
Розбір польотів:
1. 127.0.0.1 — Хто? IP-адреса клієнта.
2. [28/Jan/...] — Коли? Точний час.
3. "GET /images/logo.png..." — Що хотів? Метод GET (дай мені) і файл картинки.
4. 200 — Вердикт! Це HTTP статус код. 200 означає "Все супер, ось твій файл".
5. 4501 — Розмір. Скільки байтів ми віддали.
6. Mozilla/5.0... — Чим? Це User-Agent (браузер користувача).
Приклад 2: Той самий лог, але є проблема
192.168.1.50 - - [28/Jan/2026:14:35:00 +0000] "POST /api/login HTTP/1.1" 500 120 "-" "iPhone"
Що ми бачимо тут?
* Хтось з Айфона намагався залогінитись (POST /api/login).
* Статус код 500.
🚨 Увага: Коди 5xx (500, 502, 503) — це завжди ваша провина як розробника. Це "Internal Server Error". Користувач зробив усе правильно, але сервер впав.
Щоб зрозуміти, чому він впав, ми йдемо в наступний приклад.
Приклад 3: Error Log (Слідство ведуть знавці)
Ми відкриваємо error.log і шукаємо той самий час (14:35:00):
[ERROR] 2026-01-28 14:35:00: ConnectionError: Database refused connection at port 5432.
at Client.connect (/app/node_modules/pg/client.js:120)
at AuthService.login (/app/src/auth.js:45)
Ага! Ось воно.
1. Тип помилки: ConnectionError.
2. Повідомлення: База даних відмовила у з'єднанні.
3. Де: файл auth.js, рядок 45.
Висновок: Проблема не в коді логіна, а в тому, що "впала" база даних. Ми знаємо, кого "лікувати".
4. 🛠 Практична частина
Тепер ваша черга. Ось вам фрагменти логів. Увімкніть свого внутрішнього Шерлока Холмса.
🔹 Завдання 1: Хто тут?
45.33.22.11 - - [28/Jan/2026:10:00:00] "GET /admin/passwords.txt HTTP/1.1" 404 153
- Що намагався зробити користувач?
- Чи вдалося йому це? (Подивіться на код 404).
- Як ви думаєте, це звичайний користувач чи хакер?
🔹 Завдання 2: Знайди причину скарги
Клієнт каже: "Я завантажив нове фото профілю, а сайт видав помилку!". Ось Access Log за цей час:
10.0.0.5 - "POST /upload/avatar HTTP/1.1" 413 0 "-" "Android"
- Підказка: Загугліть або згадайте, що означає HTTP код 413.
- У чому проблема клієнта? (Спойлер: Payload Too Large).
🔹 Завдання 3: Міні-кейс "DDOS чи популярність?"
Ви бачите в логах таку картину (100 рядків за секунду):
88.99.11.22 - "GET / HTTP/1.1" 200 ...
88.99.11.22 - "GET / HTTP/1.1" 200 ...
88.99.11.22 - "GET / HTTP/1.1" 200 ...
IP-адреса одна й та сама. * Це нормальна поведінка людини? * Яке рішення ви б прийняли як адмін? (Заблокувати IP? Ввімкнути кешування?)
🔹 Завдання 4: А що, якщо...
А що, якщо ваш error.log важить 50 Гігабайт?
* Що станеться з сервером? (Підказка: місце на диску).
* Як це полагодити, не видаляючи логи вручну щодня? (Ключове слово для пошуку: Log Rotation).
5. 💡 Мислення як у розробника
Як відрізнити новачка від профі, дивлячись на те, як вони працюють з логами?
❌ Помилки початківця:
- "Логуємо все підряд": Писати
console.log(user)з паролями та кредитками прямо в лог. Це діра в безпеці! - "Ігноруємо Warning": Ну, це ж не Error, працює ж... А потім диск забивається попередженнями, і сервер падає.
- Дивитись логи тільки коли все згоріло. Профі заглядають туди періодично, щоб побачити аномалії до катастрофи.
✅ Як думає Senior Developer:
- Кореляція ID: У складних системах (мікросервісах) до кожного запиту додають унікальний ID (
Request-ID). Тоді можна відстежити шлях одного клієнта через 10 різних сервісів. - Рівні логування (Log Levels):
DEBUG— для розробки (дуже детально).INFO— загальна інфа (запустились, юзер зайшов).WARN— дивно, але працюємо.ERROR— біда. На проді вмикають зазвичайINFOабоWARN, щоб не смітити.
- Автоматизація: Ніхто не читає логи очима через блокнот на проді. Використовують системи типу ELK (Elasticsearch, Logstash, Kibana) або Datadog, які будують графіки.
6. 🧩 Підсумок
Отже, що ми маємо в сухому залишку?
- Логи — це не сміття, це докази.
- Access Log каже хто і що робив.
- Error Log каже, чому воно зламалося.
- HTTP-коди (200, 404, 500) — це ваша перша підказка.
Тепер ви не будете панікувати, коли хтось скаже "Сайт лежить". Ви спокійно відкриєте термінал, напишете tail -f error.log і відчуєте себе Нео з Матриці.
Що далі? Зараз ми дивилися на логи як на текст. Але що, якщо серверів 100? Читати 100 файлів? Ні. Наступного разу ми поговоримо про Моніторинг: як малювати красиві графіки з цих нудних текстів і отримувати SMS, коли серверу стає погано.
А поки — бережіть свої логи! 💻✨