что такое уровень логирования

Логирование Java: терминология, уровни логирования, log-файлы

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Логирование Java напоминает процесс работы «черного ящика» в самолете — в случае возникновения критических ситуаций оно способно «рассказать», что не так работает и на что обратить внимание.

Термин «лог» — что это такое?

Лог ирование — это процесс, который неразрывно связан с термином «лог». Лог с английского можно перевести как «бортовой журнал».

Лог-файлы помогают «следить» за действиями программы, например, что она функционирует в конкретный момент времени или как она реагирует на действия пользователя.

Отметим различия между «логированием» и «логом»:

Уровни логирования

Мы выяснили, что такое логи и что такое логирование Java. Не трудно догадаться, что если в лог-фай л записывать все действия программы, то там будет большое количество различных сведений. В некоторых ситуациях лог-файлы могут генерироваться очень быстро и в огромных размерах. В этом случае найти нужную информацию в логах будет очень не легко. Поэтому, чтобы контролировать объемы записываемой информации, придумали различные уровни логирования.

Уровни логирования применяются в программах на различных языках программирования, в том числе и на Java. Различают несколько основных уровней:

«Поддержать» уровни логирования в Java можно двумя способами:

Логирование Java: термины

Библиотеки логирования Java включают в себя 3 основных термина:

Библиотеки логирования Java

Библиотеки логирования Java — это набор инструментов, который применяют при логировании программ. Различают несколько популярных инструментов логирования:

Заключение

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

Что такое уровень логирования

Логирование в Java

Хотя правильнее было бы говорить наверное журналирование/протоколирование и вести журнал/протокол соответственно.

Но так никто никогда не говорит, конечно ¯\(ツ)

Поэтому «логи всякие нужны, логи всякие важны».

Все ли нужно логировать?

Если вы вдруг залогируете в общий файл-лога пароль и логин пользователя, то никто такому рад не будет, что подводит нас к мысли, что логировать надо тоже с умом.

Т.е возникает требование управления информацией, которая нам нужна в данный момент, а также форматом ее вывода.

При этом, логично, что изменения этого формата и того, что мы хотим видеть в логе не должны требовать перекомпиляции всего проекта или изменения кода.

Уровень логированияОписание
ALLВсе сообщения
TRACEСообщение для более точной отладки
DEBUGДебаг-сообщение, для отладки
INFOОбычное сообщение
WARNПредупреждение, не фатально, но что-то не идеально
ERRORОшибка
FATALФатальная ошибка, дело совсем плохо
OFFБез сообщения

Если проиллюстрировать это:

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Принципы и понятия

Логер создается с помощью фабрики и на этапе создания ему присваивается имя. Имя может быть любым, но по стандарту имя должно быть сопряжено с именем класса, в котором вы собираетесь что-то логировать:

Почему так рекомендуется делать?

Получается выстраивается следующая иерархия логеров:

И каждому логеру можно выставить свой уровень. Установленный логгеру уровень вывода распространяется на все его дочерние логгеры, для которых явно не выставлен уровень.

При этом во главе иерархии логеров всегда стоит некотрый дефолтный рутовый(корневой) логер.

Поэтому у всех логеров будет уровень логирования, даже если явно мы не прописали для ru.aarexer.example.SomeClass его, то он унаследуется от рутового.

Вопрос:

ЛогерНазначенный уровень
rootINFO
ruНе назначен
ru.aarexerDEBUG
ru.aarexer.exampleНе назначен

Какой у какого логера будет уровень логирования?

Ответ:

Вспоминаем, что, если уровень логирования не назначен для логера, то он унаследует его от родительского, смотрим на иерархию:

LoggerНазначенный уровеньУровень, который будет
rootВсе сообщенияINFO
ruНе назначенINFO
ru.aarexerDEBUGDEBUG
ru.aarexer.exampleНе назначенDEBUG

Это событие по сути состоит из двух полей:

Аппендер – это та точка, куда события приходят в конечном итоге. Это может быть файл, БД, консоль, сокет и т.д.

У одного логгера может быть несколько аппендеров, а к одному аппендеру может быть привязано несколько логгеров.

Логеры при этому наследуют от родительских не только уровни логирования, но и аппендеры.

Например, если к root-логгеру привязан аппендер A1, а к логгеру ru.aarexer – A2, то вывод в логгер ru.aarexer попадет в A2 и A1, а вывод в ru – только в A1.

Вопрос:

Пусть у нас есть несколько аппендеров и логеров

LoggerAppender
rootА1
ru.aarexerА2
ru.aarexer.example.SomeClassА3

В какой аппендер попадет лог-сообщение:

Ответ:

Это говорит о том, что логер-наследник будет свои события передавать логеру-родителю.

Смотрим на иерархию:

Из всего вышесказанного делаем вывод, что событие «hello» с уровнем Level.INFO попадет во все три аппендера.

Но такое наследование аппендеров можно отключить через конфигурацию, для этого стоит посмотреть в сторону выставления флага additivity=»false» на логгерах.

Т.е как лог-сообщения будут отформативарованы, соответственно тут у каждой библиотеки свой набор доступных форматов.

Библиотеки логирования в Java

Однако он не отвечает всем тем требованиям, которые мы сформулировали выше, поэтому рассмотрим альтернативы.

Наиболее популярные библиотеки логирования в Java :

И поэтому появились еще две библиотеки:

Это самая первая библиотека логирования, появилась еще в 1999 году.

Поддерживает большое количество способов вывода логов: от консоли и файла до записи в БД.

Благодаря подобной иерархии лишнее отсекается и поэтому логер работает быстро.

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Проект сейчас не развивается и по сути заброшен, с версией Java 9 уже не совместим.

Вклад log4j в мир логирования настолько велик, что многие идеи были взяты в библиотеки логирования для других языков.

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Чувствуете насколько все переосложнено?

Так как стандартных средств форматирования логов недостаточно, то все сводилось к тому, что писались свои. Это при том, что log4j предоставлял больший функционал, работал как минимум не медленнее и в целом себя чувствовал хорошо.

Уровни логгирования у JCL совпадают с log4j, а в случае взаимодействия с JUL происходит следующее сопоставление:

JCLJUL
ALLВсе сообщения
TRACELevel.FINEST
DEBUGLevel.FINE
INFOLevel.INFO
WARNLevel.WARNING
ERRORLevel.SEVERE
FATALLevel.SEVERE
OFFБез сообщения

С уверенностю можно сказать сейчас, что в эту сторону даже смотреть не стоит. Пациент мертв.

ЛицензияApache License Version 2.0
Последняя версия1.2
Дата выпуска последней версиииюль 2014

Но добавили много нового, парочка из них:

Правда перестали поддерживать properties конфигурации и конфигурации от log4j на xml надо было переписывать заново.

ЛицензияApache License Version 2.0
Последняя версия2.11.2
Дата выпуска последней версиифевраль 2019
ЛицензияMIT License
Последняя версия2.0.0-alpha0
Дата выпуска последней версиииюнь 2019

При этом, logback не является частью Apache или еще какой-то компании и независим.

ЛицензияEPL/LGPL 2.1
Последняя версия1.3.0-alpha4
Дата выпуска последней версиифевраль 2018

Так как из адаптеров это по сути единственный выбор, да и встречается slf4j все чаще, то стоит рассмотреть его устройство.

Вопрос:

Ответ:

Вроде все проблемы решены, пусть и такими радикальными способоами.

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Таким образом, чтобы работать со Spring получается надо сделать CLASSPATH подобным образом:

Если конфигурация сделана программно, то bridge не будет работать.

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Бесконтрольно подтягиваемые транзитивные зависимости библиотек, которые вы используете в своем проекте, рано или поздно принесут какие-то свои библиотеки логирования, отчего могут открыться врата прямиком в ад.

При этом, если вы разрабатываете библиотеку, то:

Очень важно также не забывать о том, что такое логирование и для чего оно нужно.

Поэтому нельзя скатываться в бесмысленные записи в лог, вывод личных данных и так далее.

Думайте о том что вы пишите в лог!

Источник

Архитектура логирования

Мой опыт разработки в основном строится вокруг разнообразных сетевых cервисов под Windows и Linux. Я обычно стремлюсь добиться максимальной кроссплатформенности вплоть до бинарной совместимости. И конечно, накопилось некоторое количество стабильных решений связанных с логированием.

Топик написан как продолжение к этой статье и будет полезен в первую очередь начинающим программистам.

Итак, начну со своих дополнений к предыдущей статье.
Я как и автор пользуюсь NLog’ом и разумеется широко использую его особенности. Конечно, после
их реализации в любом другом логгере, нижеописанную практику можно применять и у них.

Кстати, log4net продолжает развиваться.

Под капотом NLog

Сразу обсудим полезность второй фичи.

Часто, при разработке кода, возникает необходимость посмотреть значение какой либо переменной в процессе выполнения. Обычно, используют дебаггер и останавливают программу в интересующем месте. Для меня же, это явный признак, что этом месте будет полезен Trace вывод. В комплекте с юнит-тестами мы сразу получаем развертку этой переменной во времени и протокол для сравнения с тестами в других условиях. Таким образом, дебаггером я практически не пользуюсь.

Очевидно, что в боевом применении, даже выключенное подробное логирование, может мешать как скорости выполнения так и параллельности.

Исходный код класса можно посмотреть тут.

Отлично! Для NLog можно быть уверенным, что ваши сколь угодно детальные сообщения могут быть отключены и это минимально скажется на производительности. Но, это не повод посвящать логированию половину кода.

Что и как логировать

Следует придерживаться правил:

В целом, при выводе в лог, всегда отмечайте, то количество потенциально лишних вычислений, которые потребуются для случая когда лог отключен.

Простой пример (фрагмент некоторого класса):

private static Logger Log = LogManager. GetCurrentClassLogger ( ) ;

public string Request ( string cmd, string getParams )

Uri uri = new Uri ( _baseUri, cmd + «?» + getParams ) ;

HttpWebRequest webReq = ( HttpWebRequest ) WebRequest. Create ( uri ) ;

webReq. Method = «GET» ;

webReq. Timeout = _to ;

using ( WebResponse resp = webReq. GetResponse ( ) )

using ( Stream respS = resp. GetResponseStream ( ) )

using ( StreamReader sr = new StreamReader ( respS ) )

page = sr. ReadToEnd ( ) ;

catch ( Exception err )

Все аргументы логирования требовались для логики. Сообщение Debug отмечает аргументы с которыми мы пришли в функцию. В обработчике ошибки мы дублируем входные параметры на случай отключения Debug уровня. А это уже даст информацию при необходимости написать юнит-тест. Стек исключения не выводим, так как остается возможность сделать это вышестоящим обработчиком.

Вообще, в текущем обработчике ошибок полезно детализировать контекст который к привел к исключению и специфичные особенности исключения. В примере было бы полезно вывести поле Status для случая WebException.

Гарантии сохранности лога

Несмотря на некоторые возможности NLog по авто записи логов, нет гарантии сохранности лога при завершении процесса.

Первое, что следует сделать, это обработать событие AppDomain.UnhandledException. В нем следует записать в лог полную информацию об ошибке и вызвать LogManager.Flush(). Обработчик этого события использует тот же поток, который и вызвал исключение, а по окончании, немедленно выгружает приложение.

private static readonly Logger Log = LogManager. GetCurrentClassLogger ( ) ;

public static void Main ( string [ ] args )

static void OnUnhandledException ( object sender, UnhandledExceptionEventArgs e )

Кроме того, следует вызывать LogManager.Flush() везде, где потенциально возможно завершение процесса. В конце всех не фоновых потоков.

Если ваше приложение представляет собой win-service или Asp.Net, то следует обработать соответствующие события начала и завершения кода.

Сколько логировать

Серьезная проблема для разработчика. Всегда хочется получать больше информации, но код начинает выглядеть очень плохо. Я руководствуюсь следующими соображениями.

Вывод в лог это по сути комментарий. Логирование уровня Trace по большей части их и заменяет.
Уровни Trace и Debug читают разработчики, а все что выше — техподдержка и админы. Поэтому до уровня Info сообщения должны точно отвечать на вопросы: «Что произошло?», «Почему?» и по возможности «Как исправить?». Особенно это касается ошибок в файлах конфигурации.

Боевое развертывание

Предположим, разработка дошла до внедрения.
Отложим вопросы ротации логов, размера файлов и глубины истории. Это все очень специфично для каждого проекта и настраивается в зависимости от реальной работы сервиса.

Остановлюсь только на смысловой организации файлов. Их следует разделить на 3 группы. Может потребуется развести логи модулей в разные файлы, но дальше я все равно буду говорить об одном файле для каждой группы.

Если приложение успешно внедрено, то в работе остаются только первые две группы.

Расследование сбоев

Когда работающий сервис подает признаки ошибки, то не следует его пытаться сразу перезагружать. Возможно нам «повезло» поймать ошибки связанные с неверной синхронизацией потоков. И не известно сколько в следующий раз ждать ее повторения.
В первую очередь следует подключить заготовленные заранее конфиги для группы наблюдения. Как раз это и должен позволять делать приличный логгер. Когда мы получили подтверждение о том, что новая конфигурация успешно применена, то пытаемся опять спровоцировать сбой. Желательно несколько раз. Это обеспечит возможность для его воспроизведения в «лабораторных» условиях. Дальше уже работа программистов. А пока можно и перезагрузиться.

name = «fileInfo» type = «AsyncWrapper» queueLimit = «5000» overflowAction = «Block» >

type = «File» fileName = «$/logs/info.log» />

name = «fileWarn» type = «AsyncWrapper» queueLimit = «5000» overflowAction = «Block» >

type = «File» fileName = «$/logs/warn.log» />

name = «*» minlevel = «Info» writeTo = «fileInfo» />

name = «*» minlevel = «Warn» writeTo = «fileWarn» />

При настройке фильтров следует учитывать относительность уровней логирования для каждой из подсистем. Например, некоторый модуль, имея Info сообщение об инициализации, может быть создан для каждого подключенного пользователя. Разумеется, его вывод в Info группу следует ограничить уровнем Warn.

Чего с логгером делать не следует

Логгер должен быть простым и надежным как молоток. И у него должна быть четко очерчена область применения в конкретном проекте. К сожалению, разработчиков часто трудно удержать. Паттерны проектирования, это в основном полезно, но не этом случае. Достаточно часто стал замечать предложения выделить для логгера обобщенный интерфейс (пример) или реализовать обертку в проекте, чтобы отложить муки выбора NLog vs log4net на потом.

Что бы ни было тому причиной, надо точно помнить, что в первую очередь, такие удобства напрочь убивают компилятору возможность оптимизации.

Не стоит напрямую выводить информацию логгера пользователю, даже с фильтрами. Проблема в том, что эта информация зависит от внутренней структуры программы. Вряд ли вы в процессе рефакторинга пытаетесь сохранить вывод логгера. Наверное, здесь стоит просто задуматься и разделить функционал. Возможно, в проекте просто требуется еще один уровень логирования. В этом случае как раз и уместна будет обертка над логгером.

Чего же мне еще не хватает в NLog?
NLog, Log4Net, Enterprise Library, SmartInspect.

Разнообразные сравнения логгеров между собой, упускают одну важную деталь.
Важно сравнивать не только ограничения/возможности, но и возможность быстро добавить свои «хотелки».

Поэтому, буду пока дружить с NLog.
Чего и Вам желаю.

Источник

Python: Логируем как профессионалы

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Часто вижу, что помимо обработки исключений, люди мучаются кое с чем еще, а именно с логированием.

Большинство людей не знают, что писать в логи, поэтому решают логировать все, что угодно, думая, что все подряд – это в любом случае лучше, чем ничего, и, в конечном итоге, просто создают шум. А шум – это информация, которая никак не помогает вашей команде понять, в чем дело и как решить проблему.

Более того, я не думаю, что эти люди могут уверенно пользоваться уровнями логирования, поэтому используют по умолчанию logger.info везде (если не пишут print ).

Наконец, люди, похоже, не знают, как сконфигурировать логирование в Python, понятия не имеют, что такое обработчики, фильтры, методы форматирования (форматтеры) и т.д.

Цель этой статьи – разъяснить, что такое логирование и как вы должны его реализовывать. Я постараюсь привести содержательные примеры и обеспечить вас гибкими эмпирическими приемами, которые следует использовать при логировании в любом приложении, которое вы когда-либо будете создавать.

Введение

Примеры облегчают визуальное восприятие, поэтому мы будем рассматривать следующую систему:

Пользователи могут подключать несколько интеграций к ресурсам (например, GitHub, Slack, AWS и т.д.)

Ресурсы уникальны в зависимости от интеграции (например, репозитории списков с GitHub, диалоги из Slack, экземпляры списков EC2 из AWS и т.д.)

Каждая интеграция уникальна, имеет свой набор сложностей, конечных точек, шагов и т.д.

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

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

Я не буду сосредотачиваться на проблемах поддержки таких интеграций, просто пронаблюдаем за тем, как это работает.

Природа логирования: хорошее логирование имеет значение

Для начала давайте проанализируем характеристики логов.

«Наглядными» мы их называем потому, что они предоставляют вам какую-то информацию, «контекстными», потому что они дают вам общее представление о том, как обстоят дела на данный момент времени. И наконец, «реактивными» они являются потому, что они позволяют вам предпринимать действия только после того, как что-то произошло (даже если ваши логи отправляются/получаются в режиме реального времени, на самом деле вы не можете изменить то, что произошло только что).

Если вы не будете учитывать природу логов, то будете производить только шум, что снизит вашу производительность.

Дальше я приведу несколько примеров, основанных на системе, которую мы определили выше:

Если вы зададите описание, к примеру «operation connect failed», но не добавите контекст, трудно будет понять, какая из интеграций не отработала, кто пострадал, на каком этапе подключения произошел сбой, поэтому и среагировать вы не можете. В конечном итоге вы будете копаться в тонне логов без малейшего представления о том, где может быть проблема.

О, а еще не стоит недооценивать способность разработчика испортить описание. Сделать это легко, просто отправив поверхностные сообщения без какого-либо контекста, например «An error happened» или «An unexpected exception was raised». Если я прочту такое, то даже не пойму, на что повлияла ошибка, потому что не буду знать, ЧТО конкретно произошло. Так что да, можно сломать даже основной смысл логов.

Логи – это конфиденциальная информация из вашего программного обеспечения, нужная чтобы вы оставались в курсе происходящего и могли реагировать на ситуации. Любые логи, которые не дают вам такой информации – это шум.

Когда нужно логировать?

Чтобы логи оставались реактивными, вам нужно логировать «события». Сделайте их такими же понятными и удобными для чтения, как эта статья. Возможно, вы не прочитали каждую строку, которую я написал выше, но вы все равно можете продолжить дальше, пропустить ненужные разделы и сосредоточиться на том, что привлекло ваше внимание. Логи должны быть такими же.

Есть эмпирическое правило построение логов:

что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

    В начале соответствующих операций или потоков (например, при подключении к сторонним сервисам и т.д.);

    При любом достигнутом прогрессе (например, успешная аутентификация, получен валидный код ответа и т.д.);

    При завершении операции (успешном или неудачном).

    Логи должны рассказывать вам историю, у каждой истории есть начало, середина и конец.

    Будьте осторожны с релевантностью, добавлять логи проще, чем удалять их, ведь все, что нерелевантно – шум.

    Что логировать?

    Чтобы логи были наглядными и контекстными, нужно предоставлять правильный набор информации, и я не могу сказать, какая информация будет являться таковой, не зная вашего случая. Давайте вместо этого воспользуемся нашим примером.

    Рассмотрим интеграцию с AWS в качестве примера. Было бы круто иметь следующие сообщения:

    Хороший пример логов

    Сообщение

    Понимание картины

    Контекст

    Началась операция с AWS

    Атрибуты лога должны позволить мне выяснить, кто его вызвал

    Retrieved instances from all regions

    Был достигнут существенный прогресс

    Connection to AWS has been successful

    Операция с AWS завершилась

    Атрибуты лога должны позволить мне найти сущности, на которые операция произвела положительный эффект

    Пример логов об ошибках

    Допустим, что извлечь экземпляры из региона af-south-1 не удалось из-за какой-то внезапной ошибки в этом регионе.

    Сообщение

    Понимание картины

    Контекст

    Началась операция с AWS

    Атрибуты лога должны позволить мне выяснить, кто его вызвал

    Failed to retrieve instances from regions af-south-1 when connecting to AWS for user X

    Операция AWS не завершена, произошел сбой в регионе af-south-1, пострадал пользователь X

    Я должен иметь возможность увидеть трассировку стека ошибки, чтобы понять, почему извлечение не удалось

    В обоих случаях, я могу отследить, когда произошло какое-то событие (в логах есть отметки о времени), что именно произошло и кто от этого пострадал.

    Я решил не указывать пользователя при начале и успешном завершении операции, потому что это не имеет значения (ведь это шум), поскольку:

    Если я знаю, что что-то запустилось, но не знаю результата выполнения, то что я могу сделать?

    Если все хорошо, то зачем беспокоиться?

    Добавление таких данных делает логи шумными, потому что на них невозможно реагировать, делать-то с этим ничего не надо! Но я все еще должен быть в состоянии собрать детальную информацию из атрибутов (кто, когда, почему и т.д.). Если вы хотите что-то измерить, вам следует воспользоваться метриками, а не логами.

    С другой стороны, логи об ошибках кажутся более подробными, и так и должно быть! Чтение таких логов дает достаточно уверенности, чтобы немедленно перейти к действиям:

    Свяжитесь с пользователем Х и сообщите ему, что вам известно о проблеме в этом регионе.

    Ключевой момент следующий: вы можете отреагировать сразу и для этого вам не требуется более глубокого изучения ситуации. Вы знаете все, что вам нужно, и можете немедленно принять меры для уменьшения ущерба. Разработчикам, возможно, потребуется углубиться в трассировку стека, чтобы собрать больше контекста (в случае с ошибкой), но общая картина уже становится ясна.

    Любое сообщение об ошибке, в котором отсутствует эта минимальная информация, становится шумом, поскольку у вас появляется беспокойство, но вы все еще не можете действовать. Сначала нужно углубиться в ситуацию, чтобы понять, насколько проблема серьезна.

    Если вы все еще не поняли, как писать полезные сообщения, я поделюсь с вами очень простым лайфхаком:

    Всегда спрашивайте себя: Что я хочу уяснить для себя, после получения такого лога?

    Предоставление контекста с помощью Python

    В Python атрибуты логов можно добавить с помощью дополнительного поля, например:

    Контекст не отменяет необходимости в содержательных сообщениях! Поэтому я бы так не делал:

    Сообщения должны быть четкими и не оставлять места вопросам о том, что же вообще происходит. Контекст должен обогащать ваш опыт, предоставив информацию о более глубоких деталях, и давать вам понимание, по какой причине что-то произошло.

    Нечто большее, чем logger.info и logger.error

    Не так-то просто понять, что происходит, когда тысячи клиентов выдают логи «Connecting to Slack». Поскольку вы выдаете логи, а вашим приложением пользуются несколько клиентов, нужно иметь возможность фильтровать информацию по релевантности.

    Чтобы упростить ситуацию, вот вам новое эмпирическое правило (будьте гибкими):

    Уровень

    Когда используется

    Для какой-то действительно повторяющейся информации. Возможно, было бы полезно выдавать весь контекст информации, но порой этого не нужно.

    Когда происходит что-то важное, достойное того, чтобы о нем было известно большую часть времени.

    Случилось что-то странное (но не прервало поток/операцию). Если проблема возникнет на более поздних этапах, такой лог может дать вам подсказку.

    Произошла ошибка, ее следует устранить как можно быстрее.

    Произошла очень серьезная ошибка, она требует немедленного вмешательства. Если не уверены в критичности ошибки, применяйте ERROR .

    Для описанной системы/потоков, я бы использовал уровни логов, как определено:

    что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

    Что делать с logger.critical и logger.warning ?

    WARNING недостаточно веская причина для остановки потока, однако это предупреждение на будущее, если возникнет какая-то проблема.

    CRITICAL самый тревожный предупреждающий лог, который вы когда-либо получите. По сути, он должен быть той самой причиной встать в три часа ночи и пойти что-то чинить.

    Для этих случаев мы рассмотрим:

    Для AWS: если какой-то регион AWS недоступен, мы можем предположить, что у пользователя там нет никаких ресурсов, поэтому можно двигаться дальше.

    Для Slack: если OAuth завершится неудачно из-за невалидного id клиента, значит остальные пользователи столкнутся с той же проблемой, интеграция не отработает, пока мы вручную не сгенерируем новый id. Это дело кажется достаточно критичным.

    что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

    Непопулярное мнение: использование DEBUG -уровня на продакшене

    Да, я считаю, что логи DEBUG нужно использовать на продакшене.

    Другой вариант – включить дебаг после того, как странная ошибка потребует более детального разбирательства.

    Простите, но для меня такой вариант недопустим.

    В реальном мире клиентам нужна быстрая реакция, командам нужно выполнять свою работу и постоянно поддерживать системы в рабочем состоянии. У меня нет времени и пропускной способности для нового деплоя или включения флага и ожидания повторения проблемы. Я должен реагировать на неожиданные проблемы в считанные секунды, а не минуты.

    Правильно настройте логгер

    Еще я замечаю, что люди испытывают трудности при настройке логгера (или вообще его не настраивают). Конечно, документация в Python не очень дружелюбная, но это не оправдание, чтобы вообще ее не трогать.

    Использование ручных команд непросто поддерживать и понимать;

    fileConfig – негибкая история, у вас не бывает динамических значений (без дополнительных фокусов);

    dictConfig – простая история в запуске и настройке.

    Я поделюсь несколькими советами и определениями, которые вам надо знать, а затем мы создадим окончательную конфигурацию на реальных примерах из проектов, над которыми я работаю.

    Вот кусочек того, о чем мы будем говорить дальше:

    что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

    Что такое логгеры?

    что такое уровень логирования. Смотреть фото что такое уровень логирования. Смотреть картинку что такое уровень логирования. Картинка про что такое уровень логирования. Фото что такое уровень логирования

    В любом случае, придерживайтесь:

    Форматируйте логи

    Форматтеры вызываются для вывода конечного сообщения и отвечают за него преобразование в конечную строку.

    Когда я работал в Zak (бывшем Mimic), и даже сегодня в Lumos мы форматировали логи как JSON. Он является хорошим стандартом для систем, работающих на продакшене, поскольку содержит множество атрибутов. Проще визуализировать JSON, чем обычную длинную строку, и для этого вам не нужно создавать свой собственный форматтер (ознакомьтесь с python-json-logger).

    Для локальной разработки я рекомендую использовать форматирование по умолчанию для простоты.

    Ваше решение будет зависеть от вида проекта. Для Tryceratops я решил использовать обычный форматтер, поскольку он проще и работает локально, там нет нужды в JSON.

    Фильтруйте логи

    Фильтры можно использовать либо для фильтрации логов (внезапно), либо для добавления дополнительного контекста в запись лога. Рассматривайте фильтры, как хуки, вызываемые до обработки итогового лога.

    Их можно определить следующим образом:

    Или их можно добавить прямо в логгер или обработчик для упрощения фильтрации по уровням (скоро будут примеры).

    Обрабатывайте логи и то, как все связано

    Обработчики представляют из себя комбинации форматтеров, выходных данных (потоков) и фильтров.

    С ними вы можете создавать следующие комбинации:

    Выводить все логи из info (фильтр), а потом выводить JSON в консоль.

    Выводить все логи, начиная с error (фильтр) в файл, содержащий только сообщение и трассировку стека (форматтер).

    Наконец логгеры указывают обработчикам.

    Пример logging.dictConfig

    Теперь, когда вы понимаете, что делают все эти объекты, давайте писать собственные! Как всегда, я постараюсь показать вам примеры из реальной жизни. Я буду использовать конфигурацию Tryceratops. Вы можете открыть ссылку и посмотреть самостоятельно окончательную конфигурацию.

    Шаблон конфигурации логирования

    Начнем с такого каркаса, создадим константу LOGGING_CONFIG :

    Version всегда будет 1. Это плейсхолдер для возможных следующих релизов. На данный момент версия всего одна.

    Я рекомендую оставить значение disable_existing_loggers в False, чтобы ваша система не поглощала другие неожиданные проблемы, которые могут возникнуть. Если вы хотите изменить другие логгеры, я бы порекомендовал их явно переписать (хоть это и скучно).

    Корневой логгер можно определить тремя разными способами, что сбивает с толку:

    Выбирайте любой! Мне нравится оставлять его снаружи, поскольку так он выглядит очевиднее и подробнее говорит о том, чего я хочу, ведь корневой логгер влияет на все другие определенные логгеры.

    Конфигурация логирования: форматтеры

    Я дополню пример из Tryceratops примером с JSON из Lumos.

    Конфигурация логирования: обработчики

    Конфигурация логирования: логгеры и root

    Давайте разберемся, что происходит:

    Кроме того, обратите внимание, что я могу переписать правила по умолчанию. Через настройки или позже динамически. Например, каждый раз, когда triceratops получает подобный флаг от CLI, он обновляет конфигурацию logging чтобы включить дебаг.

    Логирование – это важно, но наличие хорошо структурированных исключений и блоков try/except также важно, поэтому вы можете также прочитать, как профессионально обрабатывать и структурировать исключения в Python.

    Всех желающих приглашаем на demo-занятие «Основы ООП». Цели занятия: научиться работать с классами и познакомиться с наследованием.
    Краткое содержание:
    — мутабельность экземпляров класса
    — передача аргументов в инициализатор
    — наследование
    — переопределение методов
    — обращение к методам суперкласса
    >> РЕГИСТРАЦИЯ

    Источник

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *