Логирование: оставь print позади
ฝัง
- เผยแพร่เมื่อ 26 ก.ย. 2024
- Логирование - это фиксация состояния вашего приложения в определенный момент времени.
Оно позволяет понимать, что система работает как ожидается (и вообще работает), а также облегчает диагностику проблем
Минусы print:
- нет общего формата (дата)
- не ясно какой модуль в каком месте написал информацию, насколько она важна
- нужно выключать/включать, обязательно забудем удалить
- нельзя гибко настроить куда писать (файл/консоль)
Когда уместен print: в очень простых, маленьких приложениях и скриптах.
Чем больше и сложнее приложение тем важнее использовать специальные инструменты логирования
DIWEC = DEBUG - INFO - WARNING - ERROR - CRITICAL
DEBUG - самая подробная информация, нужна только разработчику и только для отладки, например значения переменных, какие данные получены и т.д.
INFO - информационные сообщения, как подтверждение работы, например запуск сервиса
WARNING - еще не ошибка, но уже надо посмотреть - мало места на диске, мало памяти, много созданных объектов и т.д
ERROR - приложение еще работает и может работать, но что-то пошло не так
CRITICAL - приложение не может работать дальше
logger = getLogger(__name__) - принятый подход для логирования с именем модуля
логеры с именами наследуют настройки от root, но могут быть настроены иначе
logger.debug("Get expression %s", exp) - для обратной совместимости используется старый формат через %
Читать:
docs.python.or...
docs.python.or...
docs.python.or...
Присоединяйтесь к помощи каналу, будет интересно)
✔️Бусти boosty.to/pyth...
✔️Юмани 410011506612886
Будь первым везде и всегда, включай уведомления о новых выпусках 🔔
Смотри там где удобно🤩
✔️ python_...
✔️ boosty.to/pyth...
✔️ / pythonrussian
✔️ t.me/python_ru...
✔️ dzen.ru/python...
✔️ rutube.ru/chan...
#Python #PythonRussian #PyCharm
друзья, не забываем подписываться на канал, спасибо! Друзья, я оговорился по поводу ф-строк, мы конечно можем их использовать в логгинге, но это не принято и любой линтер вам будет жаловаться на такое использование. Дело в том что ф-строки будут вычисляться всегда, даже для тех событий, которые нам по уровню не нужны (например мы ловим только ЕРРОР, но ф-строка будет скомпонована и для ДЕБАГ/ИНФО). Именно поэтому все используют старый формат %s при логировании
Вижу у вас в PyCharm есть штучка интересная по имени GIGA CODE, на сколько полезный плагин и стоит ли его ставить?)
Ахпхпхаххах😂 когда мое логгирование - это вначале print, а потом, когда в продакшн, просто авто-замена принта на log.print("какой-то вывод")
P.S. Если вы думаете, что я шучу, то я не шучу :) даже библиотеку свою написал для этого...
Сложная? Дай ссылку))
Ты не поверишь, какой это частый кейс))
Тоже самое) Только расширил библиотеку с возможностью писать в файл, с отметкой времени и ещё по мелочи)
Python Russian,
Продолжайте в том же духе, ВЫ МОЛОДЕЦ!
Огромное спасибо за такой детальный подход к объяснению этой темы.
Особо хочу отметить структуру подачи материала - каждый шаг был логичен и последователен,
что позволило легко усваивать информацию.
Спасибо за всю проделанную работу на твоем канале, ты делаешь бесценный материал. И хотел попросить раскрыть тему с енамами в python, когда применяется, какие проблемы решает, когда нужно его задействовать. Будет очень здорово. Ещё раз спасибо 🙂🙂
а ведь точно, про енамы то я и забыл, даже в планах не было рассказать, спасибо за подсказку!!!
теперь есть
Прекрасная работа!
Логирование занимательная вещь. Не знал что такое есть. Очень доступно изложено. Спасибо.
У себя использовал следующую комбинацию:
def txtSave(txt):
with open('data.log', 'a') as file:
file.write(txt + "
")
txt = f"{время} сообщение"
txtSave(txt)
Лучший видос на русском ютубе по теме логирования на python. Автору безмерное уважение, за то что начал объяснять с таких азов, это очень помогло осознать и понять вообще что такое логирование
спасибо за добрые слова!
Большой молодец! Спасибо за объяснение доступным языком.
Топовый контент, спасибо!
Всегда хотел попробовать, но никак руки не доходили!) Welemir1, спасибо!
твое время пришло!
Хорошая подача материала, все понятно!
Огромное спасибо, за пояснения!
Полезная информация, спасибо!
огромное спасибо! Как всегда крайне интересно и полезно!
Приятная связанная речь, подписался)
Чтоб совсем тему раскрыть, было бы хорошо дополнить про ротацию логов которые пишутся в файл. Дабы в прекрасный момент не увидеть, что всё свободное дисковое пространство пожрано, но да, в документации это всё есть, RotatingFileHandler нас выручит. А так в целом толково, спасибо за видео.
чтобы совсем тему раскрыть много видео надо, но кстати если снимать продолжение то вот там уже углубляться в разные фишки
Спасибо!
Можно ли использовать логирование, чтобы отслеживать статистку для дальнейшего анализа? Например количество вызова какой-то команды пользователем в боте, какое-то может количество запросов, количество новых пользователей (т.е например загрузить потом логи в pandas)?
Видео, как всегда 🔥🔥
да, конечно. По сути логирование это просто фиксация каких то моментов в системе, а кто и как будет информацию полученную использовать - это уже не выбор пользователя. Можно для отладки, можно просто для инфы, для статистики, для сбора и анализа данных и т.д.
Видео очень полезно, спасибо за объяснения. 👍
И сразу вопрос: а зачем в basicConfig нужел level, если у каждого логгера свой уровень?
основной уровень это ты как бы говоришь, что вообще в целом собирать, (например ДЕБАГ) и отправлять обработчикам. А на уровне хендлеров (обработчиков) ты уже говоришь: если событие тебе пришло и оно уровнем от твоего и выше -фиксируй. То есть, если ты на бейсике установишь ЕРРОР, то он ничего не соберет кроме ошибок и не передаст свои обработчикам, им нечего будет фиксировать, кроме ошибок. Вот возьми прямо поэкспериментируй с уровнями логирования на бейские и хендлерах.
@@PythonRussian Я уже после отправки сообщения додумал до этого. Спасибо за ответ.
Опа, новый контентик
сделал очень удобный формат для себя
время, имя логгера, урвоень, сообщение, название файла.py, название функции, номер строки
format='%(asctime)s - %(name)s - %(levelname)s | %(message)s | %(filename)s - def: %(funcName)s - line: %(lineno)d',
Это великолепно. Спасибо огромное, ооочень доступное объяснение!
Во время разработки накидывать логирование бесмысленно, только со стадии фикса ошибок, тот же сервис на фласке должен иметь свою папочку с логами как по мне (без ротации использовать логи - вредительство) 😅
Спаибо и лайк.
Спасибо
А в чём проблема в logging использовать f-строки? Они прекрасно работают, да и как logging их отличить от обычных строк сможет?
вы правы, я неверно выразился, просто принято использовать старый формат или extra, и любой линтер будет ругаться на использование ф-строк в логгинге. Причина в том, что ф-строка вычисляется всегда, даже когда данное лог-выражение ниже по уровню (скажем Дебаг, а мы ловим только Еррор), то есть она нам не нужна, но мы ее все равно вычислим и память займем. Возможно, если буду снимать продолжение -отдельно проговорю, спасибо
А что будет если использовать f-строки?
Сделайте видео про библиотеки abc и future, пожалуйста. И расскажите про абстрактные классы
в список себе добавил, но это не быстро будет
по названию видоса, я подумал, что в очередной раз подразумевается "кончай юзать принт, переходи на нашу супер СаВрЕмЕнНуЮ новую либу, она вабще крутая, а ещё она модная и ей все гиганты пользуются, да еще и она новый стандарт индустрии" (которая на самом деле напичкана мусором и вообще работает хорошо только на чем-то мощном)
нет, я только о стандартной библиотеке рассказываю, коммерческие решения каждый пусть ищет сам вместе с указанными вами проблемами.
Братан.... Попробуй свои видео смотреть на телефоне!!! Ну ты же не вчерашний блогер??? Ну нереально... Полезная информация занимает 5-10 процентов от всего экрана... Шрифт увеличь плиз....
это уже 20 шрифт, больше не могу, привет мир будет весь экран занимать
Я смотрю с телефона в основном, все прекрасно
Секрет полишенеля
Все хорошо, а возможно делать в какой строчке произошел этот критикал или еррор? А то если прога на много строк, и тебе выдали эти критикал, и ты не знаешь от куда ноги ростут
да, я то пример максимально простой показал, но на самом деле можно ошибку представлять всем стеком вызовов, где будет вся инфа, вплоть до строки, где упало.
@@PythonRussian круто! Надо будет тогда в тему входить, логирование в файл вообще огонь, сейчас мучаюсь этими принтами, спасибо за тему
Привет! Увидел что используется giga ide, можешь прокомментировать его работу? Сильно ли отличается от PyCharm CE и от PyCharm Professional? На сколько знаю, то за основу взята именно CE версия
а это не гига ИДЕ, это пичарм про + плагин гигачат (про него есть отдельное видео). Но я гигаиде пробовал, скажем так - не увидел причину выбирать ее вместо пичарм комьюнити, там очень много сразу всего на борту и нужно отключать всякую джаву и груви, оставлять только питон, чтобы не мешалось
@@PythonRussian спасибо за развёрнутый ответ!
Я думал будет что то еще более изящное. Но нет. Всё равно надо засорять код строчками print или logger
это кстати интересная идея -логгер без изменения логики кода
@@PythonRussian да. Как прекрасен был бы код без строк для отладки
Если будет желание, напишите, пожалуйста, в каких случаях надо переходить к созданию пакетов, а не модулей. Т.е. у меня есть какой-то проект, в нём куча модулей, в каждом модуле куча классов, процедур и т.д. Вопрос, зачем их группировать в пакеты, если они уже вполне логично и функционально сгруппированы в модули?
группировка в пакеты по той же причине, по какой ты группируешь и в модули - относятся к какой то теме. Ты сгруппировал предложения в главу, главы в часть, части в книгу) Это конечно не всегда нужно, но в сложно проекте обычно каждые 3-5-7 модулей относятся к чему то конкретному, например работа с клиентом, выносим в /client . Просто чтобы не было в одной папке десятков модулей. Надо подумать в какой теме про это рассказать.
@@PythonRussian Во-первых, спасибо за ответ. Во-вторых, да, понятно, что пакеты - это следующий уровень организации кода. Возможно есть какие-то хорошие практики, которые как-то регламентируют это дело или дают признаки того, что надо уже создавать пакеты, иначе получишь в одной папочке море модулей , в котором очень быстро утонешь.
Господя, 12 минут просмотрел - задолбался
Пришло лето, говоришь? Ну, некоторые признаки пришли, кроме тепла))
и не говори, не успели порадоваться, ночью опять 0
Очень классная штука. А в каком-нибудь Django, у которого модули плодятся как тараканы, такое тоже можно применять?
уверен у Джанго уже есть какая нибудь библиотека\плагин для этого, надо просто поискать
у джанго есть логгер. но можно завести свой. гуглите :)
Тебе бы обучающий курс открыть, бро. А то в моём курсе только принт учат
это ближе к пенсии, как много времени появится
Большое спасибо. А где найти конфигурационный файл ?
по обеим ссылкам что в подписи -есть примеры конфигов
А как логировать асинхронный код?
точно также, docs.python.org/3/library/asyncio-dev.html#logging
а вы точно работаете программистами ? прямо за деньги ? )) я вот тут писал более-менее большой проект, где делил функции по файлам. и в каждой функции есть необязательный параметр debug. дальше if debug: print) если функция вызывается из __main__, то там дебаг стоит в true, если из основного файла, то false. получается у меня отладка идет с принтами, а в проде никаких лишних сообщений)
точно. А вот вы видимо невнимательно смотрели, ваше решение неудобное. Что если часть инфы нам стала нужна, а не вся (пример с INFO)? Как поменять формат даты и есть ли он там? Как начать писать в файл? Одному то с таким работать куда ни шло, а в любой компании, где есть и другие программисты надо о поддержке думать. Я не говорю про лишний аргумент в каждой(!) функции.
@@PythonRussian не, что откатывать удобнее не спорю. про уровни - ну сделать еще одну переменную)) я просто дебажу и тестирую каждую функцию отдельно, а потом выключаю логи почти совсем) в результате видно ок или не ок.
@@PythonRussianя вообще собственный класс логгера делал, тоже самое что и этот модуль, только убрал ненужный мне функционал
я вот только задаюсь вопросом, как в logging цвета текста настраивать
@@PlayTheGames2 это может быть простым решением, когда работаешь один. С другой стороны а зачем делать то, что уже есть? Ну и такое решение вряд ли оценит команда программистов - логгинг они знают или должны знать, а вот ваш класс нет.
Почему мы не можем использовать f-string в логинге?
да, это я оговорился, можем конечно, но не рекомендуется, сейчас напишу об этом в закрепленном комменте
@@PythonRussian теперь понятно. Спасибо за разъяснение. Теперь надо всё переделывать...
Поправочка, logger переваривает Ф-строки
да, оговорка, в закрепленном комменте поправился
На Урале лето, ты сам откуда?
Пермь
Принта хватает, ботлее чем. Всё прочие решается одним классом коим можно настроить любое поведение принта. Велосипед в виде сторолнней библиотеки бессмысленен. Учите грамоту - там всё есть!
Спасибо брат ... Дебилом себя чувствую с пхп привычка шлейфом осталась принтовать все....
до какого то момента это может быть выходом, но чем сложнее приложение тем тяжелее с принтами
Python Is Not russian, Try To Understand!
Спасибо за ваш труд.
Крутяк! Лучшее видео про логирование
Отличный материал. Не понял вот что, основной экземпляр логгера должне создаваться именно в файле где точка входа в программу или не обязательно? logging.conf создается при первом срабатывании логгера, и потом настройки в main файле можно удалить и использовать загрузив их из logging.conf?
Вообще не обязательно, но нередко именно так делают, рутовый и все наследники. Второй вопрос если честно не понял. На самой ранней стадии программы, при старте надо загрузить настройки логирования и применить их, после этого файл .конф тебе не нужен.
нет, конфиг для логгера он написал отдельно еще до записи видео и потом просто применил его в программе