Что такое логгеры и для чего они нужны

Что такое логирование?

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

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

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

Сложность реальных приложений

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

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

Логирование

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

Выше небольшой кусок лога веб-сервера Хекслета. Из него видно ip-адрес, с которого выполнялся запрос на страницу и какие ресурсы загружались, метод HTTP, ответ бекенда (кода) и размер тела ответа в HTTP. Очень важно наличие даты. Благодаря ей всегда можно найти лог за конкретный период, например на то время, когда возникла ошибка. Для этого логи грепают:

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

Многие программы логируют прямо в консоль, например Webpack показывает процесс и результаты сборки:

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

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

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

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

Во-вторых, во время запуска программы указывается уровень логирования, необходимый в конкретной ситуации. По умолчанию используется уровень info, который используется для описания каких-то ключевых и важных вещей. При таком уровне будут выводиться и warning, и error. Если поставить уровень error, то будут выводиться только ошибки. А если debug, то мы получим лог, максимально наполненный данными. Обычно debug приводит к многократному росту выводимой информации.

Уровни логирования, обычно, выставляются через переменную окружения во время запуска программы. Например, так:

Существует и другой подход, основанный не на уровнях, а на пространствах имен. Этот подход получил широкое распространение в JS-среде, и является там основным. Фактически, он построен вокруг одной единственной библиотеки debug для логирования, которой пронизаны практически все JavaScript-библиотеки как на фронтенде, так и на бекенде.

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

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

Запуск с нужным пространством:

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

Ротация логов

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

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

Здесь тоже есть несколько путей. Можно воспользоваться готовыми решениями, такими как DataDog Logging, либо устанавливать и настраивать все самостоятельно через, например, ELK Stack

Источник

Что такое логгеры и для чего они нужны

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

Распространены логгеры температуры, влажности, давления, опасных газов (CO2), освещённости и других параметров окружающей среды, а так же логгеры электрических сигналов.

Далее рассмотрим подробнее виды и области применения логгеров данных температуры и влажности.

Виды логгеров температуры

В мире существует достаточно большое количество производителей логгеров температуры и каждый из них предлагает модели со своими особенностями и преимуществами. Однако по ключевым потребительским свойствам можно выделить несколько основных типов логгеров данных температуры:

Одноразовые логгеры — это логгеры без возможности замены элемента питания и перезапуска программы измерения.

Многоразовые логгеры — отличаются возможностью перезапуска программы измерения неограниченное количество раз и, как правило, имеют заменяемые элементы питания.

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

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

Логгеры с внутренними датчиками, как правило, более миниатюрны и просты в эксплуатации.

Логгеры с различными интерфейсами чтения данных — самым распространённым интерфейсом для считывания накопленных логгером данных является USB. USB интерфейс широко распространён по всему миру и де-факто стал стандартом для многих моделей логгеров данных.

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

Где применяются логгеры?

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

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

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

Наиболее востребованы логгеры температуры и влажности в следующих областях:

Перевозка и хранение грузов.

Контроль температуры и влажности на производстве.

Контроль микроклимата в общественных местах.

Проведение термокартирования складов, рефрежираторов, холодильников.

Лабораторные испытания и научные исследования.

Устройство логгеров

Конструктивное исполнение логгеров температуры может быть разным, но чаще всего это компактные приборы с автономным питанием.

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

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

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

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

Считывание накопленных данных

Самым распространённым способом для связи с компьютером является USB-интерфейс, которым оснащены практически все современные логгеры данных. Ка правило, миниатюрные логгеры имеют разъём типа USB-A, который позволяет вставлять прибор в порт персонального компьютера на манер «флэшки», что не требует дополнительных кабелей и очень удобно для пользователя.

К USB разъёму логгеров, устанавливаемых стационарно можно подключиться с помощью стандартного USB кабеля.

В новейших моделях логгеров все чаще применяются модули беспроводной связи. Современный логгер температуры может быть оснащён NFC-передатчиком или поддерживать технологию Bluetooth, Wi-Fi или GSM.

Функциональные особенности

Самые востребованные и ставшие де-факто стандартными функциональные преимущества современных логгеров температуры и влажности:

Комплектация

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

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

Некоторые модели предусматривают и наборы для обслуживания, в которые входит инструмент для сборки, адаптеры для считывания данных, проверочные устройства и диск с ПО.

Производители устройств

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

Что нужно учитывать при выборе прибора

Нужно обращать внимание как на рабочие параметры логгера (диапазон измерений, точность, объем памяти – количество возможных измерений), так и на эргономические качества, включающие возможность автономной работы и способ подключения к компьютеру и считывания данных.

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

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

Заключение

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

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

Источник

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

Мой опыт разработки в основном строится вокруг разнообразных сетевых 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 не будет опубликован. Обязательные поля помечены *