Вхід у Python
Ведення журналу — це засіб відстеження подій, які відбуваються під час роботи певного програмного забезпечення. Ведення журналів є важливим для розробки програмного забезпечення, налагодження та запуску. Якщо у вас немає жодного запису журналу, а ваша програма аварійно завершує роботу, шансів виявити причину проблеми дуже мало. А якщо виявити причину, то це забере багато часу. За допомогою реєстрації ви можете залишити навігаційний слід, щоб ми могли визначити причину проблеми, якщо щось піде не так.
Існує кілька ситуацій, наприклад, якщо ви очікуєте ціле число, вам надано число з плаваючою точкою, і ви можете хмару API , служба не працює на технічне обслуговування та багато іншого. Такі проблеми вийшли з-під контролю, і їх важко визначити.
Чому оператор друку не є Pythonic
Деякі розробники використовують концепцію друку операторів, щоб перевірити, чи правильно виконуються оператори, чи сталася помилка. Але друк — не дуже гарна ідея. Це може вирішити ваші проблеми для простих сценаріїв, але для складних сценаріїв підхід до друку не вдасться.
Python має вбудований модуль лісозаготівля який дозволяє записувати повідомлення про стан у файл або будь-які інші вихідні потоки. Файл може містити інформацію про те, яка частина коду виконується і які проблеми виникли.
Рівні журналювання Python
Є п'ять вбудованих рівнів повідомлення журналу.
- Відлагоджувати: Вони використовуються для надання детальної інформації, яка зазвичай цікава лише під час діагностики проблем.
- Інформація: Вони використовуються для підтвердження того, що все працює належним чином
- УВАГА: Вони використовуються як вказівка на те, що сталося щось несподіване, або вказують на якусь проблему в найближчому майбутньому
- Помилка: Це говорить про те, що через більш серйозну проблему програмне забезпечення не змогло виконати деякі функції
- Критично: Це повідомляє про серйозну помилку, яка вказує на те, що сама програма може не працювати далі
Якщо потрібно, розробники мають можливість створити більше рівнів, але їх достатньо, щоб впоратися з будь-якою можливою ситуацією. Кожному вбудованому рівню присвоєно своє числове значення.
Модуль журналювання містить кілька функцій. Він має кілька констант, класів і методів. Елементи з великими літерами є постійними, елементи з великої літери є класами, а елементи, які починаються з малих літер є методами.
Існує декілька об’єктів реєстратора, які пропонує сам базовий обробник.
- Logger.info(повідомлення): Це зареєструє повідомлення з рівнем INFO у цьому реєстраторі.
- Logger.warning(msg): Це зареєструє повідомлення з рівнем ПОПЕРЕДЖЕННЯ в цьому реєстраторі.
- Logger.error(msg): Це зареєструє повідомлення з рівнем ERROR у цьому реєстраторі.
- Logger.critical(msg): Це зареєструє повідомлення з рівнем КРИТИЧНИЙ у цьому реєстраторі.
- Logger.log(lvl,msg): Це зареєструє повідомлення з цілочисельним рівнем lvl у цьому реєстраторі.
- Logger.exception(msg): Це зареєструє повідомлення з рівнем ERROR у цьому реєстраторі.
- Logger.setLevel(lvl): Ця функція встановлює поріг цього реєстратора на lvl. Це означає, що всі повідомлення нижче цього рівня ігноруватимуться.
- Logger.addFilter(filt): Це додає певний фільтр, який підходить для цього реєстратора.
- Logger.removeFilter(filt): Це видаляє певний фільтр, який підходить для цього реєстратора.
- Logger.filter(запис): Цей метод застосовує фільтр реєстратора до наданого запису та повертає True, якщо запис потрібно обробити. Інакше він поверне значення False.
- Logger.addHandler(hdlr): Це додає певний обробник hdlr до цього реєстратора.
- Logger.removeHandler(hdlr) : Це видаляє певний обробник hdlr із цього реєстратора.
- Logger.hasHandlers(): Це перевіряє, чи реєстратор має налаштований обробник чи ні.
Корисні обробники
На додаток до базового класу обробника надається багато корисних підкласів.
| обробник | опис |
|---|---|
| StreamHandler | Надсилає повідомлення в потоки (файлоподібні об’єкти). |
| FileHandler | Надсилає повідомлення на дискові файли. |
| BaseRotatingHandler | Базовий клас для обробників, які обертають файли журналу в певний момент. використання RotatingFileHandler або TimedRotatingFileHandler замість цього. |
| RotatingFileHandler | Надсилає повідомлення на дискові файли з підтримкою максимального розміру файлу журналу та ротації файлів журналу. |
| TimedRotatingFileHandler | Надсилає повідомлення до файлів на диску, чергуючи файл журналу через певні проміжки часу. |
| SocketHandler | Надсилає повідомлення на сокети TCP/IP. Також підтримує доменні сокети Unix, починаючи з Python 3.4. |
| DatagramHandler | Надсилає повідомлення до UDP-сокетів. Також підтримує доменні сокети Unix, починаючи з Python 3.4. |
| SMTPHandler | Надсилає повідомлення на вказану електронну адресу. |
| SysLogHandler | Надсилає повідомлення до демона Unix Syslog, можливо, на віддаленій машині. |
| NTEventLogHandler | Надсилає повідомлення до журналу подій Windows NT/2000/XP. |
| MemoryHandler | Надсилає повідомлення до буфера в пам’яті, який очищається щоразу, коли виконуються певні критерії. |
| HTTPHandler | Надсилає повідомлення на сервер HTTP за допомогою семантики GET або POST. |
| WatchedFileHandler | Спостерігає за файлом, до якого здійснюється вхід. Якщо файл змінюється, він закривається та знову відкривається з використанням імені файлу. |
| QueueHandler | Надсилає повідомлення до черги, наприклад ті, що реалізовані в черзі або багатопроцесорних модулях. |
| NullHandler | Нічого не робить із повідомленнями про помилки. Використовується розробниками бібліотек, щоб уникнути повідомлення «Немає обробників для реєстратора». |
Основи журналювання Python
Основи використання модуля журналювання для запису подій у файл дуже прості. Для цього просто імпортуйте модуль із бібліотеки.
- Створіть і налаштуйте реєстратор. Він може мати кілька параметрів. Але важливо передати назву файлу, у який ви хочете записати події.
- Тут також можна встановити формат реєстратора. За замовчуванням файл працює в додавати але ми можемо змінити його на режим запису, якщо потрібно.
- Крім того, можна встановити рівень реєстратора, який діє як поріг для відстеження на основі числових значень, призначених кожному рівню.
Є кілька атрибутів, які можна передати як параметри. - Перелік усіх цих параметрів наведено в Бібліотека Python . Користувач може вибрати необхідний атрибут відповідно до вимог.
Після цього створіть об’єкт і використовуйте різні методи, як показано в прикладі.
Реєстрація змінної
Цей код демонструє, як реєструвати повідомлення про помилку. Функція logging.error() використовується для реєстрації повідомлення про помилку з заповнювачем %s для імені змінної.
Python3
import> logging> name> => 'GFG'> logging.error(> '%s raised an error'> , name)> |
Вихід:
ERROR:root:GFG raised an error
Логування всіх рівнів
Цей код демонструє всі рівні журналювання.
Python
# importing module> import> logging> # Create and configure logger> logging.basicConfig(filename> => 'newfile.log'> ,> > format> => '%(asctime)s %(message)s'> ,> > filemode> => 'w'> )> # Creating an object> logger> => logging.getLogger()> # Setting the threshold of logger to DEBUG> logger.setLevel(logging.DEBUG)> # Test messages> logger.debug(> 'Harmless debug Message'> )> logger.info(> 'Just an information'> )> logger.warning(> 'Its a Warning'> )> logger.error(> 'Did you try to divide by zero'> )> logger.critical(> 'Internet is down'> )> |
Наведений вище код створить файл із вказаною назвою, і якщо ми відкриємо файл, він міститиме такі дані.
Налаштування журналювання
Вхід у файл: temp.conf
[loggers] keys=root,simpleExample [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler]
приклад:
Код налаштовує систему журналювання, використовуючи конфігурацію з temp.conf файл. Він отримує реєстратор з іменем простий приклад і реєструє повідомлення з різними рівнями журналу.
Python3
import> logging> import> logging.config> logging.config.fileConfig(> 'temp.conf'> )> # create logger> logger> => logging.getLogger(> 'simpleExample'> )> # 'application' code> logger.debug(> 'debug message'> )> logger.info(> 'info message'> )> logger.warning(> 'warn message'> )> logger.error(> 'error message'> )> logger.critical(> 'critical message'> )> |
Вихід:
2023-06-15 18:16:21 - simpleExample - DEBUG - debug message 2023-06-15 18:16:21 - simpleExample - INFO - info message 2023-06-15 18:16:21 - simpleExample - WARNING - warn message 2023-06-15 18:16:21 - simpleExample - ERROR - error message 2023-06-15 18:16:21 - simpleExample - CRITICAL - critical message
Виняток журналювання Python
Створення винятків під час журналювання може бути корисним у певних сценаріях, щоб вказати на виняткові умови або помилки у вашій програмі. Викликаючи виняток, ви можете зупинити звичайний потік виконання та повідомити абонента або систему журналювання про виявлену проблему.
У цьому коді ми створюємо виняток, який перехоплюється журналюванням. виняток.
Python3
import> logging> logging.basicConfig(level> => logging.DEBUG,> > format> => '%(asctime)s - %(levelname)s - %(message)s'> )> def> perform_operation(value):> > if> value <> 0> :> > raise> ValueError(> 'Invalid value: Value cannot be negative.'> )> > else> :> > # Continue with normal execution> > logging.info(> 'Operation performed successfully.'> )> try> :> > input_value> => int> (> input> (> 'Enter a value: '> ))> > perform_operation(input_value)> except> ValueError as ve:> > logging.exception(> 'Exception occurred: %s'> ,> str> (ve))> |
Вихід:
Enter a value: -1 2023-06-15 18:25:18,064 - ERROR - Exception occurred: Invalid value: Value cannot be negative. ValueError: Invalid value: Value cannot be negative.