SlideShare a Scribd company logo
1 of 26
Download to read offline
Как сделать
логирование приятным
в быстроразвивающемся проекте
Иван Савин, 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

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

Devconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииDevconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииAlex Popov
 
Путь мониторинга, DevOps club в Grammarly
Путь мониторинга, DevOps club в GrammarlyПуть мониторинга, DevOps club в Grammarly
Путь мониторинга, DevOps club в GrammarlyVsevolod Polyakov
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Ontico
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаTatyanazaxarova
 
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»SpbDotNet Community
 
JUG.LV What do you know about Logging?
JUG.LV What do you know about Logging?JUG.LV What do you know about Logging?
JUG.LV What do you know about Logging?denis Udod
 
MyBatis и Hibernate на одном проекте. Как подружить?
MyBatis и Hibernate на одном проекте. Как подружить?MyBatis и Hibernate на одном проекте. Как подружить?
MyBatis и Hibernate на одном проекте. Как подружить?Alexey Zinoviev
 
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!CodeFest
 
История одной трансформации: как Magento 1 разработчику быстро переориентиров...
История одной трансформации: как Magento 1 разработчику быстро переориентиров...История одной трансформации: как Magento 1 разработчику быстро переориентиров...
История одной трансформации: как Magento 1 разработчику быстро переориентиров...Magecom UK Limited
 
Руководство по формату событий для разработчиков
Руководство по формату событий для разработчиковРуководство по формату событий для разработчиков
Руководство по формату событий для разработчиковOlesya Shelestova
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) АксеновAlex Chistyakov
 
Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаcorehard_by
 
PUG #9 at OWOX: Поиск узких мест в приложении на PHP
PUG #9 at OWOX: Поиск узких мест в приложении на PHP                PUG #9 at OWOX: Поиск узких мест в приложении на PHP
PUG #9 at OWOX: Поиск узких мест в приложении на PHP Анна Магас
 
Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор Богатырёв
Обзор Drupal 8 by Andrei Khalipau, Kostya  Halipov and Егор БогатырёвОбзор Drupal 8 by Andrei Khalipau, Kostya  Halipov and Егор Богатырёв
Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор БогатырёвMinsk PHP User Group
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderSQALab
 

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

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

More from it-people

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

More from it-people (20)

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

Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин, 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