Модуль 26

Логи доступу та помилок

Ось готовий урок, створений за твоїм майстер-промптом. Вмикаймо режим 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. 💡 Мислення як у розробника

Як відрізнити новачка від профі, дивлячись на те, як вони працюють з логами?

❌ Помилки початківця:

  1. "Логуємо все підряд": Писати console.log(user) з паролями та кредитками прямо в лог. Це діра в безпеці!
  2. "Ігноруємо Warning": Ну, це ж не Error, працює ж... А потім диск забивається попередженнями, і сервер падає.
  3. Дивитись логи тільки коли все згоріло. Профі заглядають туди періодично, щоб побачити аномалії до катастрофи.

✅ Як думає Senior Developer:

  1. Кореляція ID: У складних системах (мікросервісах) до кожного запиту додають унікальний ID (Request-ID). Тоді можна відстежити шлях одного клієнта через 10 різних сервісів.
  2. Рівні логування (Log Levels):
    • DEBUG — для розробки (дуже детально).
    • INFO — загальна інфа (запустились, юзер зайшов).
    • WARN — дивно, але працюємо.
    • ERROR — біда. На проді вмикають зазвичай INFO або WARN, щоб не смітити.
  3. Автоматизація: Ніхто не читає логи очима через блокнот на проді. Використовують системи типу ELK (Elasticsearch, Logstash, Kibana) або Datadog, які будують графіки.

6. 🧩 Підсумок

Отже, що ми маємо в сухому залишку?

  1. Логи — це не сміття, це докази.
  2. Access Log каже хто і що робив.
  3. Error Log каже, чому воно зламалося.
  4. HTTP-коди (200, 404, 500) — це ваша перша підказка.

Тепер ви не будете панікувати, коли хтось скаже "Сайт лежить". Ви спокійно відкриєте термінал, напишете tail -f error.log і відчуєте себе Нео з Матриці.

Що далі? Зараз ми дивилися на логи як на текст. Але що, якщо серверів 100? Читати 100 файлів? Ні. Наступного разу ми поговоримо про Моніторинг: як малювати красиві графіки з цих нудних текстів і отримувати SMS, коли серверу стає погано.

А поки — бережіть свої логи! 💻✨