26
Трассировка событий при логировании Попов Александр(@alexgpg), CTI(cti.ru)

Devconf 2014 Трассировка событий при логировании

Embed Size (px)

Citation preview

Page 1: Devconf 2014 Трассировка событий при логировании

Трассировка событий при логировании

Попов Александр(@alexgpg), CTI(cti.ru)

Page 2: Devconf 2014 Трассировка событий при логировании

Зачем мы пишем логи?

• Отладка.• Пишем прошедшие события. Кроме логов ничего нет. Если что-

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

Page 3: Devconf 2014 Трассировка событий при логировании

Проблемы анализа логов

• Смешивание разных событий в одном логе.• В распределенной системе одно событие обрабатывается на

нескольких машинах и записи об одном событии попадают в разные логи.

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

Page 4: Devconf 2014 Трассировка событий при логировании

Антипаттерны логирования1. Записи-близнецы

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

2014-06-14 01:19:06 INFO: Request to API: user: [email protected] 2014-06-14 01:19:06 INFO: Request to API: user: [email protected] 2014-06-14 01:19:06 INFO: Request to API: user: [email protected]

Page 5: Devconf 2014 Трассировка событий при логировании

Антипаттерны логирования2. Анонимный лог

• Запись в логе в которой нет имени подсистемы.• Кто написал?• Доходит до ctrl+c ctrl+f по исходному коду, чтобы понять что

это за подсистема

Page 6: Devconf 2014 Трассировка событий при логировании

Антипаттерны логирования3. Отсутствие цели

• Error request to api.something.com with code 500.• А что хотели-то?

Page 7: Devconf 2014 Трассировка событий при логировании

Антипаттерны логирования4. Литературные логи

• Request from server1.api.com from user ad12 with product id 18• Текст не поискать по приложению• В отдельные нужные данные еще прицелится надо

Page 8: Devconf 2014 Трассировка событий при логировании

Антипаттерны логирования5. Забытый отладочный вывод

• puts user => logger.info user => logger.info «user: #{user}»

Page 9: Devconf 2014 Трассировка событий при логировании

Антипаттерны логирования6. Object.inspect

• Одновременно нечитаем человеком и машиной.

#<User:0x00000001240990 @created_at=2014-06-13 23:13:01 +0400, @name="Petr", @organization=#<Organization:0x00000001240a08 @name="umbrella", @billing_id="122233">, @email="[email protected]", @external_id="5757585">

Page 10: Devconf 2014 Трассировка событий при логировании

Антипаттерны логирования7. Exception без стектрейса

• Error Timeout reached.• Ээээ...а где оно возникло и где обработалось?

Page 11: Devconf 2014 Трассировка событий при логировании

Трассировка событий

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

• В начале обработки события генерируется уникальный ID и записывается в каждом сообщении в лог.

• Этот ID передается через все обработчики, все слои приложения и машины участвующие в обработке.

Page 12: Devconf 2014 Трассировка событий при логировании

Трассировка событий

Page 13: Devconf 2014 Трассировка событий при логировании

Трассировка событийВ коде(log4r)

• Используем Nested Diagnostic Context (NDC)• Используем Nested Diagnostic Context (NDC)• Используем Nested Diagnostic Context (NDC)• Используем Nested Diagnostic Context (NDC)• Используем Nested Diagnostic Context (NDC)

# Logging initlogger = Log4r::Logger.new 'common'outputer = Log4r::Outputter.stdoutoutputer.formatter = Log4r::PatternFormatter.new(pattern: '%d %l: [%x] %m ')logger.add outputer# New requestLog4r::NDC.push uuid()logger.info 'Incoming request'#...logger.info 'In progress'#...logger.error 'Bad params

Page 14: Devconf 2014 Трассировка событий при логировании

Трассировка событийВ коде(ext_logging)

ev = UserEvent.new ext_logger.info ev, 'Incoming request'ext_logger.info ev, 'In progress'ext_logger.error ev, 'Bad params'

Page 15: Devconf 2014 Трассировка событий при логировании

Трассировка событийВ логе

2014-06-13 21:43:50 INFO: [9cc6fdc1] Incoming request 2014-06-13 21:43:50 INFO: [afc8ba03] In progress 2014-06-13 21:43:50 INFO: [9cc6fdc1] In progress 2014-06-13 21:43:50 ERROR: [9cc6fdc1] Bad params

Page 16: Devconf 2014 Трассировка событий при логировании

Трассировка событийГенерация ID события

• Искусственная — просто генерируем новый уникальный ID.• Естественная — берем ID уже существующий в бизнес-логике.

Например, ID транзакции из внешней системы.

Page 17: Devconf 2014 Трассировка событий при логировании

Трассировка событийИерархическая структура событий

• Обработка события может состоять из нескольких подзадач.• Интересно наблюдать каждую из подзадач раздельно и

различать события в них друг от друга. • При этом есть главное инициирующее событие — корень дерева

событий.

Page 18: Devconf 2014 Трассировка событий при логировании

Трассировка событийЧто еще записать в лог

• Короткое имя события(reg_user, create_conf). Тогда из записи будет понятна конечная цель

• Пользователя-инициатора события. Логин, email, ip.• Подсистему или класс.

I, [2014-06-04T03:48:09.422777 #17400] INFO -- : [b9f64570] (add_resource){[email protected]} <ResourcesService> | Add limit |=> {"company":"umbrella", "limit":"12"}

Page 19: Devconf 2014 Трассировка событий при логировании

Трассировка событийПреимущества

• Разные события различимы.• Много контекста пишется сразу. • grep позволяет фильтровать по различным признакам.

I, [2014-06-04T03:48:09.422777 #17400] INFO -- : [b9f64570] (add_resource){[email protected]} <ResourcesService> | Add limit |=> {"company":"umbrella", "limit":"12"}

Page 20: Devconf 2014 Трассировка событий при логировании

Хранимые события

• Хранятся в базе.• Поиск средствами БД по множеству параметров(SQL, MongoDB

query).• Можно показывать прямо в интерфейсе приложения.• Перезапуск обработки события в случае неудачи.

Page 21: Devconf 2014 Трассировка событий при логировании

Хранимые событияСхема БД

• Уникальный ID• Короткое имя• Инициатор: ID или имя пользователя• Время создания• Статус: IN_POGRESS, DONE, FAILED• Дополнительные данные в свободном формате(json, hstore)

Page 22: Devconf 2014 Трассировка событий при логировании

Хранимые событияТрассировка событий в логах

• Используем ID сохраненного события как ID для трассировки.

Page 23: Devconf 2014 Трассировка событий при логировании

ext_logging

• Гем для поддержки трассировки событий в логах.

• Трассировка событий.

• Иерархия событий.

• Пишет класс откуда был вызван логер.

• https://bitbucket.org/alexgpg/ext_logging• Пока в разработке.

Page 24: Devconf 2014 Трассировка событий при логировании

Что почитать или посмотреть?

• Nail B. Harrison «Patterns for Logging Diagnostic Messages»• Zipkin - distributed tracing system http://twitter.github.io/zipkin/• http://www.infoq.com/presentations/Zipkin• ddima Дядя Дима - Логи

ddima.livejournal.com/64901.html - часть первая ddima.livejournal.com/65086.html - часть вторая ddima.livejournal.com/65668.html - часть третья ddima.livejournal.com/66497.html - часть четвертая

Page 25: Devconf 2014 Трассировка событий при логировании

Выводы

• Трассировка событий — простой полезный паттерн, который экономит время анализа логов.

• События можно хранить в БД. Это дает возможности для гибкого задания параметров поиска по ним.

Page 26: Devconf 2014 Трассировка событий при логировании

Спасибо

Вопросы?