Чому в python використовується журналювання замість друку?


92

Для простої налагодження в складному проекті є причина використовувати реєстратор python замість print? А як щодо інших випадків використання? Чи є прийнятний найкращий варіант використання для кожного (особливо, коли ви шукаєте лише stdout)?

Я завжди чув, що це «найкраща практика», але не міг зрозуміти, чому.


3
Для великих проектів ведення журналу завжди є "найкращою практикою", оскільки ви можете легко його вмикати чи вимикати та отримувати більш-менш інформацію. друк не пропонує жодної з цих переваг.
Chris Eberle


3
Я не думаю, що коли-небудь є найкращий варіант використання для print.
SingleNegationElimination

4
У документації з ведення журналу python зазначено, що найкращим варіантом використання printє відображення довідкових повідомлень для користувача у програмі командного рядка.
млявий

Читаючи всі ці відповіді, я хочу поставити зворотне запитання: чи є коли-небудь причина не використовувати реєстрацію?
інформацією

Відповіді:


101

Пакет реєстрації має багато корисних функцій:

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

Друк не має жодного з них.

Крім того, якщо ваш проект призначений для імпорту іншими інструментами python, це погана практика для вашого пакету друкувати речі у stdout, оскільки користувач, ймовірно, не знатиме, звідки надходять повідомлення для друку. За допомогою журналювання користувачі вашого пакету можуть вибрати, чи хочуть вони пропонувати повідомлення про реєстрацію з вашого інструменту чи ні.


2
Дуже добре сказано. Іноді я використовую print при налагодженні викидного сценарію, який я маю намір запустити рівно один раз, але будь-який код, який коли-небудь побачать інші людські очі або який повинен тривати більше одного дня, отримує реєстратор.
TimothyAWiseman

22

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

Також журнали можна налаштувати. Ви можете легко відфільтрувати їх, відправити у файли, відформатувати, додати позначки часу та будь-які інші речі, які можуть вам знадобитися на глобальній основі. Друкувати виписки непросто в управлінні.


3
Безумовно +1 для надсилання вихідних даних у файли. Розбір файлу журналу в посмертному набагато краще, ніж змушувати його знову зламатися у відкритому вікні консолі, щоб знайти помилку. В основному, реєстратор ідеально підходить для будь-якого часу, коли вам потрібно налагодити сценарій після того, як він вийшов з ладу, а не в той час, коли він не працює. Це також ідеально підходить для будь-якого часу, коли вам доведеться налагоджувати складну проблему, яка вимагає аналізу результатів роботи програми. В основному, щоразу, коли ви стикаєтеся з помилками, більш складними, ніж синтаксичні помилки, реєстратор, ймовірно, спростить це для вас.
Джонатанб

11

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

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

Інструментарій програми може зайняти певну роботу, модифікуючи певним чином вихідний код, але отриманий діагностичний результат може мати надзвичайно багато деталей і може бути ввімкнений або вимкнений до дуже конкретної міри. Модуль протоколювання python може відображати не лише зареєстроване повідомлення, але також файл і функцію, які його викликали, зворотне відстеження, якщо таке було, фактичний час випуску повідомлення тощо. Більше того; діагностичний прилад ніколи не потрібно видаляти; Він настільки ж дійсний і корисний, коли програма закінчена і запущена, як і в день її додавання; але у нього може бути вихід закріплений у файлі журналу, де це, ймовірно, нікого не дратує, або рівень журналу може бути відхилений, щоб усі повідомлення, крім найгостріших, не виходили.

передбачити потребу або використання налагоджувача насправді не складніше, ніж використовувати ipython під час тестування, і ознайомитись із командами, які він використовує для управління вбудованим налагоджувачем pdb.

Коли ви виявляєте, що думка про те, що оператор друку може бути простішим, ніж використання pdb (як це часто буває), ви виявите, що використання реєстратора призводить до того, що ваша програма набагато легше працювати в стані, ніж якщо ви використовуєте та пізніше видаляєте оператори друку .

У моєму редакторі налаштовано висвітлювати оператори друку як синтаксичні помилки , а оператори реєстрації - як коментарі, оскільки саме так я їх розглядаю.


4

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


1

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

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

tail -f mylogfile.log | egrep "key_word1|key_word2"

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

Я, як правило, використовую оператори друку, оскільки це лінько і просто, додавання журналу вимагає певного кодового значка, ей, у нас є яніпети (emacs) та ultisnips (vim) та інші інструменти для шаблонування, то чому навіщо відмовлятися від реєстрації для простих операторів друку !?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.