друзья, не забываем подписываться на канал, спасибо! Друзья, я оговорился по поводу ф-строк, мы конечно можем их использовать в логгинге, но это не принято и любой линтер вам будет жаловаться на такое использование. Дело в том что ф-строки будут вычисляться всегда, даже для тех событий, которые нам по уровню не нужны (например мы ловим только ЕРРОР, но ф-строка будет скомпонована и для ДЕБАГ/ИНФО). Именно поэтому все используют старый формат %s при логировании
Ахпхпхаххах😂 когда мое логгирование - это вначале print, а потом, когда в продакшн, просто авто-замена принта на log.print("какой-то вывод") P.S. Если вы думаете, что я шучу, то я не шучу :) даже библиотеку свою написал для этого...
Спасибо за всю проделанную работу на твоем канале, ты делаешь бесценный материал. И хотел попросить раскрыть тему с енамами в python, когда применяется, какие проблемы решает, когда нужно его задействовать. Будет очень здорово. Ещё раз спасибо 🙂🙂
Python Russian, Продолжайте в том же духе, ВЫ МОЛОДЕЦ! Огромное спасибо за такой детальный подход к объяснению этой темы. Особо хочу отметить структуру подачи материала - каждый шаг был логичен и последователен, что позволило легко усваивать информацию.
Лучший видос на русском ютубе по теме логирования на python. Автору безмерное уважение, за то что начал объяснять с таких азов, это очень помогло осознать и понять вообще что такое логирование
Логирование занимательная вещь. Не знал что такое есть. Очень доступно изложено. Спасибо. У себя использовал следующую комбинацию: def txtSave(txt): with open('data.log', 'a') as file: file.write(txt + " ") txt = f"{время} сообщение" txtSave(txt)
Можно ли использовать логирование, чтобы отслеживать статистку для дальнейшего анализа? Например количество вызова какой-то команды пользователем в боте, какое-то может количество запросов, количество новых пользователей (т.е например загрузить потом логи в pandas)? Видео, как всегда 🔥🔥
да, конечно. По сути логирование это просто фиксация каких то моментов в системе, а кто и как будет информацию полученную использовать - это уже не выбор пользователя. Можно для отладки, можно просто для инфы, для статистики, для сбора и анализа данных и т.д.
Привет! Увидел что используется giga ide, можешь прокомментировать его работу? Сильно ли отличается от PyCharm CE и от PyCharm Professional? На сколько знаю, то за основу взята именно CE версия
а это не гига ИДЕ, это пичарм про + плагин гигачат (про него есть отдельное видео). Но я гигаиде пробовал, скажем так - не увидел причину выбирать ее вместо пичарм комьюнити, там очень много сразу всего на борту и нужно отключать всякую джаву и груви, оставлять только питон, чтобы не мешалось
Чтоб совсем тему раскрыть, было бы хорошо дополнить про ротацию логов которые пишутся в файл. Дабы в прекрасный момент не увидеть, что всё свободное дисковое пространство пожрано, но да, в документации это всё есть, RotatingFileHandler нас выручит. А так в целом толково, спасибо за видео.
Отличный материал. Не понял вот что, основной экземпляр логгера должне создаваться именно в файле где точка входа в программу или не обязательно? logging.conf создается при первом срабатывании логгера, и потом настройки в main файле можно удалить и использовать загрузив их из logging.conf?
Вообще не обязательно, но нередко именно так делают, рутовый и все наследники. Второй вопрос если честно не понял. На самой ранней стадии программы, при старте надо загрузить настройки логирования и применить их, после этого файл .конф тебе не нужен.
вы правы, я неверно выразился, просто принято использовать старый формат или extra, и любой линтер будет ругаться на использование ф-строк в логгинге. Причина в том, что ф-строка вычисляется всегда, даже когда данное лог-выражение ниже по уровню (скажем Дебаг, а мы ловим только Еррор), то есть она нам не нужна, но мы ее все равно вычислим и память займем. Возможно, если буду снимать продолжение -отдельно проговорю, спасибо
Если будет желание, напишите, пожалуйста, в каких случаях надо переходить к созданию пакетов, а не модулей. Т.е. у меня есть какой-то проект, в нём куча модулей, в каждом модуле куча классов, процедур и т.д. Вопрос, зачем их группировать в пакеты, если они уже вполне логично и функционально сгруппированы в модули?
группировка в пакеты по той же причине, по какой ты группируешь и в модули - относятся к какой то теме. Ты сгруппировал предложения в главу, главы в часть, части в книгу) Это конечно не всегда нужно, но в сложно проекте обычно каждые 3-5-7 модулей относятся к чему то конкретному, например работа с клиентом, выносим в /client . Просто чтобы не было в одной папке десятков модулей. Надо подумать в какой теме про это рассказать.
@@PythonRussian Во-первых, спасибо за ответ. Во-вторых, да, понятно, что пакеты - это следующий уровень организации кода. Возможно есть какие-то хорошие практики, которые как-то регламентируют это дело или дают признаки того, что надо уже создавать пакеты, иначе получишь в одной папочке море модулей , в котором очень быстро утонешь.
Все хорошо, а возможно делать в какой строчке произошел этот критикал или еррор? А то если прога на много строк, и тебе выдали эти критикал, и ты не знаешь от куда ноги ростут
да, я то пример максимально простой показал, но на самом деле можно ошибку представлять всем стеком вызовов, где будет вся инфа, вплоть до строки, где упало.
основной уровень это ты как бы говоришь, что вообще в целом собирать, (например ДЕБАГ) и отправлять обработчикам. А на уровне хендлеров (обработчиков) ты уже говоришь: если событие тебе пришло и оно уровнем от твоего и выше -фиксируй. То есть, если ты на бейсике установишь ЕРРОР, то он ничего не соберет кроме ошибок и не передаст свои обработчикам, им нечего будет фиксировать, кроме ошибок. Вот возьми прямо поэкспериментируй с уровнями логирования на бейские и хендлерах.
Встроенный логгер Python позволяет использовать f-строки, но есть нюансы. Логгер Python предоставляет возможность форматирования сообщений через старый стиль с процентами (например, %s), который встроен в библиотеку. Однако вы можете использовать f-строки или метод .format() напрямую при создании строки лога, но это будет выполнено сразу при вызове функции логгера, в то время как использование %s позволяет логгеру откладывать форматирование строки до тех пор, пока это не понадобится (например, если уровень лога ниже порога, сообщение не будет формироваться).
сделал очень удобный формат для себя время, имя логгера, урвоень, сообщение, название файла.py, название функции, номер строки format='%(asctime)s - %(name)s - %(levelname)s | %(message)s | %(filename)s - def: %(funcName)s - line: %(lineno)d',
я сам его создал перед видео, там все настройки, которые нам нужны, его формат и другие варианты вынесения всех настроек в файл есть в документации. Я не сгенерировал его какой то кнопкой, если ты об этом, он был создан заранее
а вы точно работаете программистами ? прямо за деньги ? )) я вот тут писал более-менее большой проект, где делил функции по файлам. и в каждой функции есть необязательный параметр debug. дальше if debug: print) если функция вызывается из __main__, то там дебаг стоит в true, если из основного файла, то false. получается у меня отладка идет с принтами, а в проде никаких лишних сообщений)
точно. А вот вы видимо невнимательно смотрели, ваше решение неудобное. Что если часть инфы нам стала нужна, а не вся (пример с INFO)? Как поменять формат даты и есть ли он там? Как начать писать в файл? Одному то с таким работать куда ни шло, а в любой компании, где есть и другие программисты надо о поддержке думать. Я не говорю про лишний аргумент в каждой(!) функции.
@@PythonRussian не, что откатывать удобнее не спорю. про уровни - ну сделать еще одну переменную)) я просто дебажу и тестирую каждую функцию отдельно, а потом выключаю логи почти совсем) в результате видно ок или не ок.
@@PlayTheGames2 это может быть простым решением, когда работаешь один. С другой стороны а зачем делать то, что уже есть? Ну и такое решение вряд ли оценит команда программистов - логгинг они знают или должны знать, а вот ваш класс нет.
по названию видоса, я подумал, что в очередной раз подразумевается "кончай юзать принт, переходи на нашу супер СаВрЕмЕнНуЮ новую либу, она вабще крутая, а ещё она модная и ей все гиганты пользуются, да еще и она новый стандарт индустрии" (которая на самом деле напичкана мусором и вообще работает хорошо только на чем-то мощном)
Во время разработки накидывать логирование бесмысленно, только со стадии фикса ошибок, тот же сервис на фласке должен иметь свою папочку с логами как по мне (без ротации использовать логи - вредительство) 😅
Братан.... Попробуй свои видео смотреть на телефоне!!! Ну ты же не вчерашний блогер??? Ну нереально... Полезная информация занимает 5-10 процентов от всего экрана... Шрифт увеличь плиз....
Принта хватает, ботлее чем. Всё прочие решается одним классом коим можно настроить любое поведение принта. Велосипед в виде сторолнней библиотеки бессмысленен. Учите грамоту - там всё есть!
друзья, не забываем подписываться на канал, спасибо! Друзья, я оговорился по поводу ф-строк, мы конечно можем их использовать в логгинге, но это не принято и любой линтер вам будет жаловаться на такое использование. Дело в том что ф-строки будут вычисляться всегда, даже для тех событий, которые нам по уровню не нужны (например мы ловим только ЕРРОР, но ф-строка будет скомпонована и для ДЕБАГ/ИНФО). Именно поэтому все используют старый формат %s при логировании
Вижу у вас в PyCharm есть штучка интересная по имени GIGA CODE, на сколько полезный плагин и стоит ли его ставить?)
Ахпхпхаххах😂 когда мое логгирование - это вначале print, а потом, когда в продакшн, просто авто-замена принта на log.print("какой-то вывод")
P.S. Если вы думаете, что я шучу, то я не шучу :) даже библиотеку свою написал для этого...
Сложная? Дай ссылку))
Ты не поверишь, какой это частый кейс))
Тоже самое) Только расширил библиотеку с возможностью писать в файл, с отметкой времени и ещё по мелочи)
Спасибо за всю проделанную работу на твоем канале, ты делаешь бесценный материал. И хотел попросить раскрыть тему с енамами в python, когда применяется, какие проблемы решает, когда нужно его задействовать. Будет очень здорово. Ещё раз спасибо 🙂🙂
а ведь точно, про енамы то я и забыл, даже в планах не было рассказать, спасибо за подсказку!!!
теперь есть
Это великолепно. Спасибо огромное, ооочень доступное объяснение!
Python Russian,
Продолжайте в том же духе, ВЫ МОЛОДЕЦ!
Огромное спасибо за такой детальный подход к объяснению этой темы.
Особо хочу отметить структуру подачи материала - каждый шаг был логичен и последователен,
что позволило легко усваивать информацию.
чувак, твой канал - лучший, от души спасибо!
спасибо, друг!
Лучший видос на русском ютубе по теме логирования на python. Автору безмерное уважение, за то что начал объяснять с таких азов, это очень помогло осознать и понять вообще что такое логирование
спасибо за добрые слова!
Логирование занимательная вещь. Не знал что такое есть. Очень доступно изложено. Спасибо.
У себя использовал следующую комбинацию:
def txtSave(txt):
with open('data.log', 'a') as file:
file.write(txt + "
")
txt = f"{время} сообщение"
txtSave(txt)
Прекрасная работа!
Большой молодец! Спасибо за объяснение доступным языком.
Можно ли использовать логирование, чтобы отслеживать статистку для дальнейшего анализа? Например количество вызова какой-то команды пользователем в боте, какое-то может количество запросов, количество новых пользователей (т.е например загрузить потом логи в pandas)?
Видео, как всегда 🔥🔥
да, конечно. По сути логирование это просто фиксация каких то моментов в системе, а кто и как будет информацию полученную использовать - это уже не выбор пользователя. Можно для отладки, можно просто для инфы, для статистики, для сбора и анализа данных и т.д.
Крутяк! Лучшее видео про логирование
Привет! Увидел что используется giga ide, можешь прокомментировать его работу? Сильно ли отличается от PyCharm CE и от PyCharm Professional? На сколько знаю, то за основу взята именно CE версия
а это не гига ИДЕ, это пичарм про + плагин гигачат (про него есть отдельное видео). Но я гигаиде пробовал, скажем так - не увидел причину выбирать ее вместо пичарм комьюнити, там очень много сразу всего на борту и нужно отключать всякую джаву и груви, оставлять только питон, чтобы не мешалось
@@PythonRussian спасибо за развёрнутый ответ!
Топовый контент, спасибо!
Полезная информация, спасибо!
Всегда хотел попробовать, но никак руки не доходили!) Welemir1, спасибо!
твое время пришло!
Хорошая подача материала, все понятно!
Приятная связанная речь, подписался)
Чтоб совсем тему раскрыть, было бы хорошо дополнить про ротацию логов которые пишутся в файл. Дабы в прекрасный момент не увидеть, что всё свободное дисковое пространство пожрано, но да, в документации это всё есть, RotatingFileHandler нас выручит. А так в целом толково, спасибо за видео.
чтобы совсем тему раскрыть много видео надо, но кстати если снимать продолжение то вот там уже углубляться в разные фишки
Огромное спасибо, за пояснения!
огромное спасибо! Как всегда крайне интересно и полезно!
Отличный материал. Не понял вот что, основной экземпляр логгера должне создаваться именно в файле где точка входа в программу или не обязательно? logging.conf создается при первом срабатывании логгера, и потом настройки в main файле можно удалить и использовать загрузив их из logging.conf?
Вообще не обязательно, но нередко именно так делают, рутовый и все наследники. Второй вопрос если честно не понял. На самой ранней стадии программы, при старте надо загрузить настройки логирования и применить их, после этого файл .конф тебе не нужен.
нет, конфиг для логгера он написал отдельно еще до записи видео и потом просто применил его в программе
Сделайте видео про библиотеки abc и future, пожалуйста. И расскажите про абстрактные классы
в список себе добавил, но это не быстро будет
А в чём проблема в logging использовать f-строки? Они прекрасно работают, да и как logging их отличить от обычных строк сможет?
вы правы, я неверно выразился, просто принято использовать старый формат или extra, и любой линтер будет ругаться на использование ф-строк в логгинге. Причина в том, что ф-строка вычисляется всегда, даже когда данное лог-выражение ниже по уровню (скажем Дебаг, а мы ловим только Еррор), то есть она нам не нужна, но мы ее все равно вычислим и память займем. Возможно, если буду снимать продолжение -отдельно проговорю, спасибо
Если будет желание, напишите, пожалуйста, в каких случаях надо переходить к созданию пакетов, а не модулей. Т.е. у меня есть какой-то проект, в нём куча модулей, в каждом модуле куча классов, процедур и т.д. Вопрос, зачем их группировать в пакеты, если они уже вполне логично и функционально сгруппированы в модули?
группировка в пакеты по той же причине, по какой ты группируешь и в модули - относятся к какой то теме. Ты сгруппировал предложения в главу, главы в часть, части в книгу) Это конечно не всегда нужно, но в сложно проекте обычно каждые 3-5-7 модулей относятся к чему то конкретному, например работа с клиентом, выносим в /client . Просто чтобы не было в одной папке десятков модулей. Надо подумать в какой теме про это рассказать.
@@PythonRussian Во-первых, спасибо за ответ. Во-вторых, да, понятно, что пакеты - это следующий уровень организации кода. Возможно есть какие-то хорошие практики, которые как-то регламентируют это дело или дают признаки того, что надо уже создавать пакеты, иначе получишь в одной папочке море модулей , в котором очень быстро утонешь.
Все хорошо, а возможно делать в какой строчке произошел этот критикал или еррор? А то если прога на много строк, и тебе выдали эти критикал, и ты не знаешь от куда ноги ростут
да, я то пример максимально простой показал, но на самом деле можно ошибку представлять всем стеком вызовов, где будет вся инфа, вплоть до строки, где упало.
@@PythonRussian круто! Надо будет тогда в тему входить, логирование в файл вообще огонь, сейчас мучаюсь этими принтами, спасибо за тему
Опа, новый контентик
Видео очень полезно, спасибо за объяснения. 👍
И сразу вопрос: а зачем в basicConfig нужел level, если у каждого логгера свой уровень?
основной уровень это ты как бы говоришь, что вообще в целом собирать, (например ДЕБАГ) и отправлять обработчикам. А на уровне хендлеров (обработчиков) ты уже говоришь: если событие тебе пришло и оно уровнем от твоего и выше -фиксируй. То есть, если ты на бейсике установишь ЕРРОР, то он ничего не соберет кроме ошибок и не передаст свои обработчикам, им нечего будет фиксировать, кроме ошибок. Вот возьми прямо поэкспериментируй с уровнями логирования на бейские и хендлерах.
@@PythonRussian Я уже после отправки сообщения додумал до этого. Спасибо за ответ.
А что будет если использовать f-строки?
Спасибо!
Встроенный логгер Python позволяет использовать f-строки, но есть нюансы.
Логгер Python предоставляет возможность форматирования сообщений через старый стиль с процентами (например, %s), который встроен в библиотеку. Однако вы можете использовать f-строки или метод .format() напрямую при создании строки лога, но это будет выполнено сразу при вызове функции логгера, в то время как использование %s позволяет логгеру откладывать форматирование строки до тех пор, пока это не понадобится (например, если уровень лога ниже порога, сообщение не будет формироваться).
спасибо, именно так и написано в закрепленном комменте xD
сделал очень удобный формат для себя
время, имя логгера, урвоень, сообщение, название файла.py, название функции, номер строки
format='%(asctime)s - %(name)s - %(levelname)s | %(message)s | %(filename)s - def: %(funcName)s - line: %(lineno)d',
Большое спасибо. А где найти конфигурационный файл ?
по обеим ссылкам что в подписи -есть примеры конфигов
не понял, а файл logging.conf откуда взялся?
я сам его создал перед видео, там все настройки, которые нам нужны, его формат и другие варианты вынесения всех настроек в файл есть в документации. Я не сгенерировал его какой то кнопкой, если ты об этом, он был создан заранее
а вы точно работаете программистами ? прямо за деньги ? )) я вот тут писал более-менее большой проект, где делил функции по файлам. и в каждой функции есть необязательный параметр debug. дальше if debug: print) если функция вызывается из __main__, то там дебаг стоит в true, если из основного файла, то false. получается у меня отладка идет с принтами, а в проде никаких лишних сообщений)
точно. А вот вы видимо невнимательно смотрели, ваше решение неудобное. Что если часть инфы нам стала нужна, а не вся (пример с INFO)? Как поменять формат даты и есть ли он там? Как начать писать в файл? Одному то с таким работать куда ни шло, а в любой компании, где есть и другие программисты надо о поддержке думать. Я не говорю про лишний аргумент в каждой(!) функции.
@@PythonRussian не, что откатывать удобнее не спорю. про уровни - ну сделать еще одну переменную)) я просто дебажу и тестирую каждую функцию отдельно, а потом выключаю логи почти совсем) в результате видно ок или не ок.
@@PythonRussianя вообще собственный класс логгера делал, тоже самое что и этот модуль, только убрал ненужный мне функционал
я вот только задаюсь вопросом, как в logging цвета текста настраивать
@@PlayTheGames2 это может быть простым решением, когда работаешь один. С другой стороны а зачем делать то, что уже есть? Ну и такое решение вряд ли оценит команда программистов - логгинг они знают или должны знать, а вот ваш класс нет.
по названию видоса, я подумал, что в очередной раз подразумевается "кончай юзать принт, переходи на нашу супер СаВрЕмЕнНуЮ новую либу, она вабще крутая, а ещё она модная и ей все гиганты пользуются, да еще и она новый стандарт индустрии" (которая на самом деле напичкана мусором и вообще работает хорошо только на чем-то мощном)
нет, я только о стандартной библиотеке рассказываю, коммерческие решения каждый пусть ищет сам вместе с указанными вами проблемами.
Очень классная штука. А в каком-нибудь Django, у которого модули плодятся как тараканы, такое тоже можно применять?
уверен у Джанго уже есть какая нибудь библиотека\плагин для этого, надо просто поискать
у джанго есть логгер. но можно завести свой. гуглите :)
Спаибо и лайк.
На Урале лето, ты сам откуда?
Пермь
Во время разработки накидывать логирование бесмысленно, только со стадии фикса ошибок, тот же сервис на фласке должен иметь свою папочку с логами как по мне (без ротации использовать логи - вредительство) 😅
Тебе бы обучающий курс открыть, бро. А то в моём курсе только принт учат
это ближе к пенсии, как много времени появится
А как логировать асинхронный код?
точно также, docs.python.org/3/library/asyncio-dev.html#logging
Пришло лето, говоришь? Ну, некоторые признаки пришли, кроме тепла))
и не говори, не успели порадоваться, ночью опять 0
Братан.... Попробуй свои видео смотреть на телефоне!!! Ну ты же не вчерашний блогер??? Ну нереально... Полезная информация занимает 5-10 процентов от всего экрана... Шрифт увеличь плиз....
это уже 20 шрифт, больше не могу, привет мир будет весь экран занимать
Я смотрю с телефона в основном, все прекрасно
Я думал будет что то еще более изящное. Но нет. Всё равно надо засорять код строчками print или logger
это кстати интересная идея -логгер без изменения логики кода
@@PythonRussian да. Как прекрасен был бы код без строк для отладки
Господя, 12 минут просмотрел - задолбался
Спасибо
Секрет полишенеля
Поправочка, logger переваривает Ф-строки
да, оговорка, в закрепленном комменте поправился
Почему мы не можем использовать f-string в логинге?
да, это я оговорился, можем конечно, но не рекомендуется, сейчас напишу об этом в закрепленном комменте
@@PythonRussian теперь понятно. Спасибо за разъяснение. Теперь надо всё переделывать...
Принта хватает, ботлее чем. Всё прочие решается одним классом коим можно настроить любое поведение принта. Велосипед в виде сторолнней библиотеки бессмысленен. Учите грамоту - там всё есть!
Спасибо брат ... Дебилом себя чувствую с пхп привычка шлейфом осталась принтовать все....
до какого то момента это может быть выходом, но чем сложнее приложение тем тяжелее с принтами
Python Is Not russian, Try To Understand!
Спасибо за ваш труд.