SlideShare a Scribd company logo
Как сделать
логирование приятным
в быстроразвивающемся проекте
Иван Савин, IPONWEB
Логирование
● Скучная необходимость
● Не знаю, зачем, но пусть программа и это
залогирует
В этом докладе
● Подводные камни логирования с ростом
программы
● Как изменить подход к логированию и
сделать анализ логов приятным
Как начинают логировать
Что происходит внутри
С чем важно вазимодействовать:
– Logger – кто, что и ли будет писать
– Handler – как, куда и будет ли писать
Что происходит внутри
● Logger, фильтруя
событие, создает
LogRecord
● Передает его своим
handler'ам, которые
фильтруя выполняют
emit
● Просит то же самое
сделать своего
родителя
Иерархия и менеджер
● Логгеры наследуют правила в иерархии,
наверху - RootLogger
● Правила действуют во всей программе* -
следит logging.manager, у которого есть
loggerDict
Что делает logging.info
● Менеджер видит, что в loggerDict нет
корневого логгера и создает его
● RootLogger создается с:
– StreamHandler(sys.stderr)
– logLevel = WARNING
Чем грозит
● Это работает
● Во всей программе один логгер, меньше
опций настройки
● Если импортировать код в другую
программу, то она испортит корневой логгер
logging.getLogger
● logging.getLogger() - получить RootLogger
● logging.getLogger(__name__) - получить
логгер в иерархии
● logging.getLogger(__package__) - тоже
вариант, но меньше логгеров
Как работает getLogger
● В программе:
logger = getLogger('myproject.utils')
logger.info('Message')
● Менеджер модуля обращается к своему
loggerDict['myproject.utils'] и выполняет
функции Logger
● И для loggerDict['myproject'] ...
● И для loggerDict['root'] ...
Происходит по умолчанию
● Правила для RootLogger
● Если в словаре нет 'myproject', то он
добавляется как logging.PlaceHolder, чтобы
держать иерархию
Может быть не нужно, а может и запутать
Использование getLogger
● Практика большинства модулей
● Гибкая, но не кропотливая настройка
логгеров и хэндлеров
● Иерархия будет становиться сложнее
● Имея отдельный логгер нелегко узнать, куда
и как он пишет
Настройка логирования
Логика логирования может быть сложной:
– Логика зависящая от среды (dev, prod)
– Централизованное хранение логов
– Разные режимы работы программы (демон,
подпроцессы)
Каждый, кому нужны логи – потенциальный
источник усложнения логики
Настройка логгеров
● Чем раньше, тем лучше
– Если logger – глобальная переменная модулей
– В __init__ программы
● logging.dictConfig – указать все возможные
варианты, потом фильтровать
● Добавить свой метод, потом обновлять
логику через logger.manager
Событие в логировании
● Обычно запись – это строка, в которую
добавили значения нужных переменных
– Потом нужно grep'ать эти строчки
– По большим логам нужно grep'ать долго
Событие сейчас
● LogRecord – потенциально более удобный
объект, чем строка
● JSON – более универсальная и гибкая
структура для хранения информации
Добавление в LogRecord
● Добавить что-то важное для данного
события:
– Логин пользователя, который открыл
веб-страницу
– Версия кода
Добавление в LogRecord
● Передать через extra:
– logger.info(“Sent response”, extra={'client': 'example'})
– не подходит для систематического использования
● logging.LoggerAdapter
– Заменяет Logger в словаре loggerDict и ведет себя так же
– Не потомок Logger, поэтому настроить логику хэндлеров
напрямую нельзя
LoggerAdapter hack
def __getattr__(self, item):
try:
return super(MyLoggerAdapter, self).__getattr__(item)
except AttributeError:
return getattr(self.logger, item)
MyLoggerAdapter(LoggerAdapter)
Централизация логирования
● Скорость выявления глобальных проблем
● Удобнее для бизнес-задач
Централизация логирования
● logging → logstash
● Logstash – умеет отправлять в 20+ мест, в
том числе PostgreSQL, Twitter
● Уже есть готовые хэндлеры:
– TCP с шифрованием
– UDP
Современное логирование
logstash → ElasticSearch (индексация) →
Kibana (визуализация)
Аналитика логов
Резюме
● Не стоит логировать для галочки
● Логи должны решать свою задачу удобно и
быстро
● Настройка логирования – это несложно и
важно
Спасибо за внимание
Время вопросов
Иван Савин
isavin@iponweb.net

More Related Content

PDF
Thumbtack Expertise Days # 5 - Logstash
PDF
Логгирование. Зачем? Когда? Сколько?
PDF
Там, где Rails не справляются
PDF
Борис Каплуновский, Aviasales.ru
PDF
Xp days 2019 - Why startups need SRE practices
PDF
pgconf.ru 2015 avito postgresql
PDF
Архитектура поиска в Avito / Андрей Смирнов (Avito)
Thumbtack Expertise Days # 5 - Logstash
Логгирование. Зачем? Когда? Сколько?
Там, где Rails не справляются
Борис Каплуновский, Aviasales.ru
Xp days 2019 - Why startups need SRE practices
pgconf.ru 2015 avito postgresql
Архитектура поиска в Avito / Андрей Смирнов (Avito)

Similar to Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин, IPONWEB (20)

PDF
Devconf 2014 Трассировка событий при логировании
PPTX
Deep storm presentation
PPTX
Путь мониторинга, DevOps club в Grammarly
PDF
PPTX
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
PDF
Построение систем автоматического протоколирования Си/Си++ кода
PDF
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
PPT
Log+
PPT
JUG.LV What do you know about Logging?
PDF
MyBatis и Hibernate на одном проекте. Как подружить?
PDF
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
PPTX
История одной трансформации: как Magento 1 разработчику быстро переориентиров...
PDF
StackLight (aka LMA)
PPTX
Руководство по формату событий для разработчиков
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
PPTX
Инструменты профайлинга С++ кода
PDF
PUG #9 at OWOX: Поиск узких мест в приложении на PHP
PDF
Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор Богатырёв
PDF
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
PPT
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Devconf 2014 Трассировка событий при логировании
Deep storm presentation
Путь мониторинга, DevOps club в Grammarly
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Построение систем автоматического протоколирования Си/Си++ кода
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Log+
JUG.LV What do you know about Logging?
MyBatis и Hibernate на одном проекте. Как подружить?
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
История одной трансформации: как Magento 1 разработчику быстро переориентиров...
StackLight (aka LMA)
Руководство по формату событий для разработчиков
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Инструменты профайлинга С++ кода
PUG #9 at OWOX: Поиск узких мест в приложении на PHP
Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор Богатырёв
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Ad

More from it-people (20)

PDF
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
PDF
«Scrapy internals» Александр Сибиряков, Scrapinghub
PDF
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
PDF
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
PDF
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
PDF
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
PDF
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
PDF
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
PDF
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
PDF
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
PDF
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
PDF
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
PDF
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
PDF
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
PDF
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
PDF
«(Без)опасный Python», Иван Цыганов, Positive Technologies
PDF
«Python of Things», Кирилл Борисов, Яндекс
PDF
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
PDF
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
PDF
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«Python of Things», Кирилл Борисов, Яндекс
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
Ad

Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин, IPONWEB

  • 1. Как сделать логирование приятным в быстроразвивающемся проекте Иван Савин, IPONWEB
  • 2. Логирование ● Скучная необходимость ● Не знаю, зачем, но пусть программа и это залогирует
  • 3. В этом докладе ● Подводные камни логирования с ростом программы ● Как изменить подход к логированию и сделать анализ логов приятным
  • 5. Что происходит внутри С чем важно вазимодействовать: – Logger – кто, что и ли будет писать – Handler – как, куда и будет ли писать
  • 6. Что происходит внутри ● Logger, фильтруя событие, создает LogRecord ● Передает его своим handler'ам, которые фильтруя выполняют emit ● Просит то же самое сделать своего родителя
  • 7. Иерархия и менеджер ● Логгеры наследуют правила в иерархии, наверху - RootLogger ● Правила действуют во всей программе* - следит logging.manager, у которого есть loggerDict
  • 8. Что делает logging.info ● Менеджер видит, что в loggerDict нет корневого логгера и создает его ● RootLogger создается с: – StreamHandler(sys.stderr) – logLevel = WARNING
  • 9. Чем грозит ● Это работает ● Во всей программе один логгер, меньше опций настройки ● Если импортировать код в другую программу, то она испортит корневой логгер
  • 10. logging.getLogger ● logging.getLogger() - получить RootLogger ● logging.getLogger(__name__) - получить логгер в иерархии ● logging.getLogger(__package__) - тоже вариант, но меньше логгеров
  • 11. Как работает getLogger ● В программе: logger = getLogger('myproject.utils') logger.info('Message') ● Менеджер модуля обращается к своему loggerDict['myproject.utils'] и выполняет функции Logger ● И для loggerDict['myproject'] ... ● И для loggerDict['root'] ...
  • 12. Происходит по умолчанию ● Правила для RootLogger ● Если в словаре нет 'myproject', то он добавляется как logging.PlaceHolder, чтобы держать иерархию Может быть не нужно, а может и запутать
  • 13. Использование getLogger ● Практика большинства модулей ● Гибкая, но не кропотливая настройка логгеров и хэндлеров ● Иерархия будет становиться сложнее ● Имея отдельный логгер нелегко узнать, куда и как он пишет
  • 14. Настройка логирования Логика логирования может быть сложной: – Логика зависящая от среды (dev, prod) – Централизованное хранение логов – Разные режимы работы программы (демон, подпроцессы) Каждый, кому нужны логи – потенциальный источник усложнения логики
  • 15. Настройка логгеров ● Чем раньше, тем лучше – Если logger – глобальная переменная модулей – В __init__ программы ● logging.dictConfig – указать все возможные варианты, потом фильтровать ● Добавить свой метод, потом обновлять логику через logger.manager
  • 16. Событие в логировании ● Обычно запись – это строка, в которую добавили значения нужных переменных – Потом нужно grep'ать эти строчки – По большим логам нужно grep'ать долго
  • 17. Событие сейчас ● LogRecord – потенциально более удобный объект, чем строка ● JSON – более универсальная и гибкая структура для хранения информации
  • 18. Добавление в LogRecord ● Добавить что-то важное для данного события: – Логин пользователя, который открыл веб-страницу – Версия кода
  • 19. Добавление в LogRecord ● Передать через extra: – logger.info(“Sent response”, extra={'client': 'example'}) – не подходит для систематического использования ● logging.LoggerAdapter – Заменяет Logger в словаре loggerDict и ведет себя так же – Не потомок Logger, поэтому настроить логику хэндлеров напрямую нельзя
  • 20. LoggerAdapter hack def __getattr__(self, item): try: return super(MyLoggerAdapter, self).__getattr__(item) except AttributeError: return getattr(self.logger, item) MyLoggerAdapter(LoggerAdapter)
  • 21. Централизация логирования ● Скорость выявления глобальных проблем ● Удобнее для бизнес-задач
  • 22. Централизация логирования ● logging → logstash ● Logstash – умеет отправлять в 20+ мест, в том числе PostgreSQL, Twitter ● Уже есть готовые хэндлеры: – TCP с шифрованием – UDP
  • 23. Современное логирование logstash → ElasticSearch (индексация) → Kibana (визуализация)
  • 25. Резюме ● Не стоит логировать для галочки ● Логи должны решать свою задачу удобно и быстро ● Настройка логирования – это несложно и важно
  • 26. Спасибо за внимание Время вопросов Иван Савин isavin@iponweb.net