НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ


Мова програмування Java. W3Schools українською. Уроки для початківців від hyperskill

En

Якість програмного забезпечення. Введення в логінг


Теорія

§1. Введення

Уявіть, що ви розслідуєте пограбування та намагаєтеся з’ясувати, що сталося. У вас є свідки, чиї свідчення дуже туманні, а доказів немає. Розплутати таку халепу буде дуже важко. Якби були записи з камер спостереження, щоб відновити хронологію подій...

Тепер, припустімо, ви розслідуєте помилку, але які «камери спостереження» у вас є на цей випадок? Очевидно, нам потрібні записи всього, що відбувалося з програмою до інциденту. Крім того, було б непогано знати, під час якої операції це сталося. Усі такі записи зазвичай зберігаються в журналі. Отже, що таке журнал?


§2. Журнал

Під журналюванням розуміється акт запису під час виконання програми. Журнали (логи) – це записи, які надають нам інформацію про події в програмному застосунку. Цей запис може бути повідомленням, якого достатньо, щоб зрозуміти подію, що сталася, він може містити позначку часу, опис і рівень серйозності. Ці події можуть бути згенеровані користувачем або системою. Для створення цих записів ми використовуємо файл журналу (лог-файл) або іноді, стандартне виведення.

Реєстрація потрібна з кількох причин. По-перше, це заощадить багато часу під час усунення несправностей нашої програми на пізнішому етапі. Якщо програма, наприклад, зламалася або в ній щось пішло не так, то в журналі можна знайти точний момент, коли сталася помилка. Це значно полегшує процес налагодження. По-друге, за допомогою журналу також можна відстежити, хто використовував програму. Якщо це, скажімо, сайт, то можна дізнатися, хто надсилав запити. Крім того, журнали допомагають контролювати роботу конкретної системи, що значно спрощує перевірку та звітування. Таким чином ми завжди знаємо, як працюють наші програми та наскільки вони ефективні.

Є декілька речей, які слід враховувати під час реєстрації: коли ми входимо? що ми реєструємо? як ми входимо? Давайте знайдемо відповіді на ці запитання.


§3. Коли, що та як

Як ми зазначали вище, існує кілька поширених причин для створення журналів:

  1. усунення несправностей
  2. аудит
  3. профілювання
  4. статистика

Те, що ми реєструємо, зазвичай залежить від програми. У будь-якому випадку ми повинні мати можливість зрозуміти шлях виконання програми через журнали. Важливо уникати надмірної вирубки, оскільки це дорого. Наприклад, немає необхідності реєструвати початок і кінець кожного методу та їхні аргументи, оскільки їх легко відстежувати. Журнали призначені для охоплення проблем із сервером, проблем із базою даних, проблем із мережею, помилок через непередбачені введення користувачами, станів динамічно створених об’єктів і значень конфігурації.

Надання контекстної інформації у ваших повідомленнях журналу також є дуже важливим. Часто успіх або невдача програми залежить від введення користувача. Отже, вам потрібно розмістити їх у своїх повідомленнях журналу, якщо це необхідно. Наприклад, під час автентифікації користувача зареєструйте введене ім’я користувача. Контекст також важливий, коли ваша програма працює в паралельному середовищі. У такому випадку назву потоку можна додати до повідомлення журналу.


§4. Рівні журналу

Раніше ми говорили, що до файлу журналу можна додати багато важливої інформації. Але що це за інформація? Існують різні типи, які відповідають прийнятним рівням журналювання: Debug, Info, Warn, Error і Fatal (від найменш критичного рівня до найбільш критичного).

Давайте подивимося, для чого ці рівні журналу.

Журнали Debug (відлагодження) використовуються для діагностики програм. Повідомлення про налагодження інформують нас про те, що програма робить на певному кроці та що вона отримує в результаті цих дій. Наприклад, повідомлення може містити інформацію про вихід певної функції, щоб ми могли побачити, чи потрібно це виправити.

Info (інформація) використовується для реєстрації важливої інформації про програму. Він використовується для реєстрації запуску служби, зупинки служби, конфігурацій, припущень. Наприклад, інформація про користувача, який щойно зареєструвався на сайті.

Журнали Warn (попереджень) вважаються першим рівнем збою програми. Зазвичай вони застосовуються для реєстрації повторних спроб доступу до ресурсу, відсутності вторинних даних або перемикання з основного сервера на резервний. Наприклад, може бути повідомлення про можливе відключення від сервера. Однак наразі це не впливає на користувача.

Рівень журналу Error (помилок) використовується для критичніших проблем. Такі проблеми зазвичай впливають на результат операції, але не припиняють роботу програми. Помилки вважаються другим рівнем збоїв програми. Наприклад, може бути повідомлення про те, що користувач не зміг увійти, оскільки база даних була тимчасово недоступна.

Fatal (фатально) – це третій рівень збоїв програми. Він використовується для позначення значно серйознішої помилки, яка спричиняє завершення роботи програми. Таке повідомлення може означати, що програма повністю вийшла з ладу, і залежно від часу та умов цього збою розробники можуть дізнатися, як розв’язати проблему.

Чудово, тепер ми знаємо, які помилки зазвичай записуються у файл журналу. Тепер нам потрібно відобразити журнал. Але що має бути відображено? Щоб журнал був читабельним і зрозумілим, існує спеціальний формат запису. Давайте дізнаємося більше про це нижче.


§5. Формат журналу (логів)

Щоб дослідити помилку, нам потрібно знати, коли вона сталася, наскільки серйозною була та хто на неї натрапив. Таким чином, формат журналу загалом виглядає так:

[дата час][рівень журналу][повідомлення]

Отже, журнал починається з дати й часу, коли сталася помилка. Потім йде рівень журналу, і останнє — повідомлення з поясненням того, що саме сталося. Точніше, якщо ми, наприклад, хочемо контролювати, хто реєструється на нашому сайті, нам потрібні відповідні журнали з рівнем журналу Info. Потім кожного разу, коли користувач надсилає дані на сайт, ми будемо реєструвати повідомлення про цю подію. Наприклад, 24 лютого 2023 року о 15:00 на сайті зареєструвався користувач з ніком 'demo'. Тоді журнал матиме такий вигляд:

[2023-02-24 15:00:00] [INFO] Користувач 'demo' зареєстрований

І якщо якийсь користувач під іменем 'alex98' не може увійти через деякі технічні проблеми, ми отримаємо повідомлення про помилку:

[2023-02-24 01:00:10] [ПОМИЛКА] Користувач 'alex98' не може ввійти, оскільки база даних тимчасово недоступна

Таким чином ми дізнаємося, що користувач 'alex98' не зміг увійти в систему через те, що наша база даних тимчасово недоступна. Ми локалізували проблему й точно знаємо, що нам потрібно зробити: перевірити базу даних і виправити її.

Існує також більш складна версія цього формату під назвою The Common Log Format (Загальний формат журналу).


§6. Висновок

Отже, ми з’ясували, що таке журнали та для чого вони потрібні. Ми також дізналися, які існують типи журналів і як ми можемо видавати повідомлення журналу. Тепер ви можете почати використовувати журнали для моніторингу роботи вашої системи в будь-який момент часу.


Ви також можете переглянути Урок на hyperskill.org.


Практичні завдання та відповіді

Подаються завдання та варіанти відповідей. Правильний варіант виділено синім кольором.

№1. Неочікувані результати

Питання: Який рівень журналу ви б використали, щоб написати повідомлення про те, що в програмі сталася помилка, і тому результат не збігається з очікуваним?

Виберіть один варіант зі списку:

  • Debug
  • Error ✔
  • Fatal
  • Info

Пояснення. Відповідний рівень журналу для запису повідомлення про те, що в програмі сталася помилка та результат не збігається з очікуваним, - це Error (Помилка).


№2. Додавання журналів налагодження для скрипту математичної операції

Питання: заповніть пропуски в наведеному нижче скрипті Python, щоб додати журналювання для цілей налагодження. Скрипт має на меті виконати просту математичну операцію (ділення), але це не вдається через необроблений виняток. Ваше завдання — заповнити порожні поля, щоб завершити конфігурацію журналу.

Заповніть прогалини відповідними елементами коду:

import

def example_function():
   logging.basicConfig(level=logging.INFO)
       ('Це приклад лог-журналу')
   try:
       print(5/0)
   except Exception as e:
       ('Стався виняток', exc_info=True)

example_function()

Варіанти: logging, logging.info, logging.error.

Рішення:

Ось завершений скрипт Python із доданим журналюванням:

import logging

def example_function():
   logging.basicConfig(level=logging.INFO)
   logging.info('Це приклад лог-журналу')
   try:
       print(5/0)
   except Exception as e:
   logging.error('Стався виняток', exc_info=True)

example_function()

Пояснення. У цьому оновленому скрипті ми імпортували модуль журналювання. Потім ми налаштовуємо рівень журналювання на INFO за допомогою basicConfig. Потім ми додаємо інформаційне повідомлення журналу, щоб вказати, що функція запущена. Усередині блоку try ми намагаємося виконати математичну операцію, яка викличе виняток. Якщо виникає виняток, ми реєструємо повідомлення про помилку з exc_info=True, яке включатиме трасування стека у вивід журналу.


№3. Формат журналу

Питання: Які основні речі слід зазначити в журналі відповідно до прикладів з теми?

Виберіть один або кілька варіантів зі списку:

  • дата ✔
  • рівень журналу ✔
  • час ✔
  • статус розробника у Facebook
  • номер телефону користувача
  • повідомлення журналу ✔

Пояснення. Важливо включити чітке та стисле повідомлення журналу з описом того, що сталося, разом із датою та часом події та рівнем журналу, щоб вказати серйозність події. Статус розробника у Facebook або номер телефону користувача не є актуальною інформацією для включення в журнал.


№4. Поширені причини

Питання: Які загальні причини створення журналу? Виберіть кілька відповідей.

Виберіть один або кілька варіантів зі списку:

  • завантаження веб-сайту
  • знайти проблему ✔
  • замовлення піци онлайн
  • статистика ✔

Пояснення. Журнали часто використовуються для вирішення проблем або виявлення помилок у програмному забезпеченні. Їх також можна використовувати для збору статистики чи іншої інформації про роботу системи. Завантаження веб-сайту або замовлення піци в Інтернеті не є поширеними причинами створення журналу.


№5. Припинення програми

Питання: Припустімо, у вашій програмі виникла проблема, через яку вона повністю припинила роботу. Який рівень журналу можна використовувати для реєстрації цієї проблеми?

Виберіть один варіант зі списку:

  • Debug
  • Info
  • Warn
  • Error
  • Fatal ✔

Пояснення. Відповідний рівень журналу, який слід використовувати, коли програма стикається з проблемою, яка спричиняє повне припинення її роботи, — Fatal. Рівень журналу Fatal вказує на те, що програма виявила серйозну помилку та не може продовжити роботу. Цей рівень журналу слід використовувати, коли програма перебуває в невідновному стані та має бути негайно припинена.


№6. Підключення до сервера бази даних

Питання: Ваша програма підключатиметься до сервера бази даних. Ви хочете зареєструвати дані конфігурації сервера бази даних. Який рівень журналу більше підходить для цього?

Виберіть один варіант зі списку

  • Debug
  • Info ✔
  • Warn
  • Error
  • Fatal

Пояснення. Відповідним рівнем журналу для використання під час реєстрації даних конфігурації сервера бази даних є інформація. Рівень журналу Info використовується для надання інформації про стан і поведінку програми та підходить для реєстрації таких деталей, як конфігураційні дані. Цей рівень журналу вказує на те, що програма працює нормально, і надає корисну інформацію для усунення несправностей і налагодження.


№7. Погана практика

Питання: що з наведеного НЕ є хорошою практикою для журналювання?

Виберіть один варіант зі списку

  • Проведення структурного каротажу
  • Виконання контекстного журналювання
  • Реєстрація кожного виклику функції ✔
  • Використання екземпляра журналювання для кожного класу

Пояснення. Журналювання кожного виклику функції НЕ є хорошою практикою для журналювання. Хоча журналювання може бути корисним інструментом для усунення несправностей і налагодження, важливо використовувати його розумно, щоб уникнути захаращення журналу непотрібною інформацією. Реєстрація кожного виклику функції може швидко призвести до величезної кількості даних журналу, ускладнюючи ідентифікацію відповідної інформації. Замість цього краще зосередитися на структурному журналюванні та контекстному журналюванні, а також використовувати екземпляр журналювання для кожного класу, щоб організувати повідомлення журналу та полегшити керування ними.


№8. Створення простої функції журналювання

Питання: Припустімо, що вам доручили створити просту функцію журналювання в програмі Python. Ваше призначене завдання включає встановлення рівня журналу на INFO та реєстрування повідомлення «Введення в логінг Python». Заповніть пропуски у наданому коді, щоб виконати цю функцію:

Заповніть прогалини відповідними елементами коду:

import  

def intro_to_logging():
   logging.  (level=logging.INFO)
   logging.  ("Введення в логінг Python")

intro_to_logging()

Варіанти: info, logging, basicConfig.

Рішення:

Ось завершений скрипт Python із доданим журналюванням:

import logging

def intro_to_logging():
   logging.basicConfig(level=logging.INFO)
   logging.info("Введення в логінг Python")

intro_to_logging()

Пояснення. У цьому оновленому скрипті ми імпортували модуль журналювання. Потім ми налаштовуємо рівень журналювання на INFO за допомогою basicConfig. Потім ми додаємо інформаційне повідомлення журналу, щоб вказати, що функція запущена. Повідомлення журналу «Введення в логінг Python» буде відображено у вихідних даних консолі.


№9. Порядок реєстрації залежно від серйозності

Питання: Який ПОРЯДОК рівня журналу на основі серйозності? Змініть порядок наведених нижче рівнів журналу від найменшого (верхній) до найвищого (нижній).

Розмістіть елементи в правильному порядку:

  • Debug (найменший рівень)
  • Info
  • Warn
  • Error
  • Fatal (найвищий рівень)