68
ОЧЕРЕДНОЙ СКУЧНЫЙ ДОКЛАД ПРО ЛОГГИРОВАНИЕ Стас Рудаков

Очередной скучный доклад про логгирование

Embed Size (px)

DESCRIPTION

Стас Рудаков, компания СООО "Гейм Стрим"/Wargaming.net Значение логов очень часто недооценивается, а зря. Доклад с оживленным диспутом со всеми участниками митапа, чтобы разобраться: как, куда и зачем писать логи. Помимо этого затронут вопрос, как из логов выжать больше информации.

Citation preview

Page 1: Очередной скучный доклад про логгирование

ОЧЕРЕДНОЙ СКУЧНЫЙ ДОКЛАДПРО ЛОГГИРОВАНИЕ

Стас Рудаков

Page 2: Очередной скучный доклад про логгирование

Эпиграф

Невозможно объять необъятное.

Козьма Прутков

Про логгирование, Стас Рудаков

Page 3: Очередной скучный доклад про логгирование

Про что будем говорить?

Про логгирование, там же было написано :)

А именно:I зачем;I как;I проблемы;I очевидные пути решения;I неочевидные пути решения;I open source инструменты.

Про логгирование, Стас Рудаков

Page 4: Очередной скучный доклад про логгирование

Про что будем говорить?

Про логгирование, там же было написано :)

А именно:I зачем;I как;I проблемы;I очевидные пути решения;I неочевидные пути решения;I open source инструменты.

Про логгирование, Стас Рудаков

Page 5: Очередной скучный доклад про логгирование

Про что будем говорить?

Про логгирование, там же было написано :)

А именно:I зачем;I как;I проблемы;I очевидные пути решения;I неочевидные пути решения;I open source инструменты.

Про логгирование, Стас Рудаков

Page 6: Очередной скучный доклад про логгирование

Что вообще значит “записать в лог”?

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

Про логгирование, Стас Рудаков

Page 7: Очередной скучный доклад про логгирование

Что вообще значит “записать в лог”?

I сформировать сообщение

I по некому событиюI и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.

Про логгирование, Стас Рудаков

Page 8: Очередной скучный доклад про логгирование

Что вообще значит “записать в лог”?

I сформировать сообщениеI по некому событию

I и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.

Про логгирование, Стас Рудаков

Page 9: Очередной скучный доклад про логгирование

Что вообще значит “записать в лог”?

I сформировать сообщениеI по некому событиюI и, если это сообщение нас вообще интересует,

I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.

Про логгирование, Стас Рудаков

Page 10: Очередной скучный доклад про логгирование

Что вообще значит “записать в лог”?

I сформировать сообщениеI по некому событиюI и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,

I куда имеют доступ заинтересованные лица.

Про логгирование, Стас Рудаков

Page 11: Очередной скучный доклад про логгирование

Что вообще значит “записать в лог”?

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

Про логгирование, Стас Рудаков

Page 12: Очередной скучный доклад про логгирование

Зачем

I DebugI Разбор инцидентов

I Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика

Про логгирование, Стас Рудаков

Page 13: Очередной скучный доклад про логгирование

Зачем

I DebugI Разбор инцидентовI Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика

Про логгирование, Стас Рудаков

Page 14: Очередной скучный доклад про логгирование

import logging

Про логгирование, Стас Рудаков

Page 15: Очередной скучный доклад про логгирование

Писать логи очень просто

1 import logging2

3 logging.basicConfig(4 format=’[%( asctime)s][%( levelname)s][%( name)s] %( message)s’,5 stream=sys.stdout ,6 level=logging.INFO7 )8

9 logger = logging.getLogger("meetup.python.minsk")10 logger.info("Stas has just started the talk on logging")

1 [2014 -01 -31 06:23:27 ,904][ INFO][ meetup.python.minsk] Stas hasjust started the talk on logging

Про логгирование, Стас Рудаков

Page 16: Очередной скучный доклад про логгирование

Писать логи очень просто

1 import logging2

3 logging.basicConfig(4 format=’[%( asctime)s][%( levelname)s][%( name)s] %( message)s’,5 stream=sys.stdout ,6 level=logging.INFO7 )8

9 logger = logging.getLogger("meetup.python.minsk")10 logger.info("Stas has just started the talk on logging")

1 [2014 -01 -31 06:23:27 ,904][ INFO][ meetup.python.minsk] Stas hasjust started the talk on logging

Про логгирование, Стас Рудаков

Page 17: Очередной скучный доклад про логгирование

logging: архитектура на пальцах

I сформировать сообщениеI по некому событию

I и, если это сообщение нас вообщеинтересует,

I записать или отправить его куда-то,I куда имеют доступ

заинтересованные лица.

Про логгирование, Стас Рудаков

Page 18: Очередной скучный доклад про логгирование

Про логгирование, Стас Рудаков

Page 19: Очередной скучный доклад про логгирование

Про логгирование, Стас Рудаков

Page 20: Очередной скучный доклад про логгирование

Про логгирование, Стас Рудаков

Page 21: Очередной скучный доклад про логгирование

Про логгирование, Стас Рудаков

Page 22: Очередной скучный доклад про логгирование

Про логгирование, Стас Рудаков

Page 23: Очередной скучный доклад про логгирование

Конфигурация

1 CFG = {2 ’formatters ’: {3 ’simple ’: {4 ’format ’: ’%( asctime)s %(

message)s’},},5 ’filters ’: {6 ’pwd’: {7 ’()’: ’proj.PwdFilter ’,8 ’foo’: ’bar’,},},9 ’handlers ’: {

10 ’console ’:{11 ’level ’:’DEBUG’,12 ’class ’:’logging.’

’StreamHandler ’,13 ’formatter ’: ’simple ’},

14 ’mail_adm ’: {15 ’level ’: ’ERROR’,16 ’class ’: ’proj.’

’AdminEmailHandler ’,17 ’filters ’: [’pwd’]},},18 ’loggers ’: {19 ’’: {20 ’handlers ’: [’console ’],21 ’level ’: ’INFO’,22 ’filters ’: [’pwd’]},23 ’django.request ’: {24 ’handlers ’: [’mail_adm ’],25 ’level ’: ’ERROR’,26 ’propagate ’: False ,},},}27 logging.config.dictConfig(CFG)

Про логгирование, Стас Рудаков

Page 24: Очередной скучный доклад про логгирование

tips n tricks: уровни логгирования

I CRITICAL = 50logger.critical(u’проблема, после которой приложение не можетвосстановиться без постороннего вмешательства’)

I ERROR = 40logger.error(u’проблема, из-за которой приложение работает не вштатном режиме’)

I WARNING = 30 # уровень по умолчаниюlogger.warning(u’проблема, которая не мешает работе приложения, нона которую стоит обратить внимание’)

I INFO = 20logger.info(u’обычная запись в лог’)

I DEBUG = 10logger.debug(u’логи, которые помогли нам при отладке приложения икоторые вряд ли пригодятся в будущем’)

Про логгирование, Стас Рудаков

Page 25: Очередной скучный доклад про логгирование

tips n tricks: уровни логгированияI CRITICAL = 50

logger.critical(u’проблема, после которой приложение не можетвосстановиться без постороннего вмешательства’)

I ERROR = 40logger.error(u’проблема, из-за которой приложение работает не вштатном режиме’)

I WARNING = 30 # уровень по умолчаниюlogger.warning(u’проблема, которая не мешает работе приложения, нона которую стоит обратить внимание’)

I INFO = 20logger.info(u’обычная запись в лог’)

I DEBUG = 10logger.debug(u’логи, которые помогли нам при отладке приложения икоторые вряд ли пригодятся в будущем’)

Про логгирование, Стас Рудаков

Page 26: Очередной скучный доклад про логгирование

tips n tricks: уровни логгированияI CRITICAL = 50

logger.critical(u’проблема, после которой приложение не можетвосстановиться без постороннего вмешательства’)

I ERROR = 40logger.error(u’проблема, из-за которой приложение работает не вштатном режиме’)

I WARNING = 30 # уровень по умолчаниюlogger.warning(u’проблема, которая не мешает работе приложения, нона которую стоит обратить внимание’)

I INFO = 20logger.info(u’обычная запись в лог’)

I DEBUG = 10logger.debug(u’логи, которые помогли нам при отладке приложения икоторые вряд ли пригодятся в будущем’)

Про логгирование, Стас Рудаков

Page 27: Очередной скучный доклад про логгирование

tips n tricks: уровни логгированияI CRITICAL = 50

logger.critical(u’проблема, после которой приложение не можетвосстановиться без постороннего вмешательства’)

I ERROR = 40logger.error(u’проблема, из-за которой приложение работает не вштатном режиме’)

I WARNING = 30 # уровень по умолчаниюlogger.warning(u’проблема, которая не мешает работе приложения, нона которую стоит обратить внимание’)

I INFO = 20logger.info(u’обычная запись в лог’)

I DEBUG = 10logger.debug(u’логи, которые помогли нам при отладке приложения икоторые вряд ли пригодятся в будущем’)

Про логгирование, Стас Рудаков

Page 28: Очередной скучный доклад про логгирование

tips n tricks: уровни логгированияI CRITICAL = 50

logger.critical(u’проблема, после которой приложение не можетвосстановиться без постороннего вмешательства’)

I ERROR = 40logger.error(u’проблема, из-за которой приложение работает не вштатном режиме’)

I WARNING = 30 # уровень по умолчаниюlogger.warning(u’проблема, которая не мешает работе приложения, нона которую стоит обратить внимание’)

I INFO = 20logger.info(u’обычная запись в лог’)

I DEBUG = 10logger.debug(u’логи, которые помогли нам при отладке приложения икоторые вряд ли пригодятся в будущем’)

Про логгирование, Стас Рудаков

Page 29: Очередной скучный доклад про логгирование

tips n tricks: уровни логгированияI CRITICAL = 50

logger.critical(u’проблема, после которой приложение не можетвосстановиться без постороннего вмешательства’)

I ERROR = 40logger.error(u’проблема, из-за которой приложение работает не вштатном режиме’)

I WARNING = 30 # уровень по умолчаниюlogger.warning(u’проблема, которая не мешает работе приложения, нона которую стоит обратить внимание’)

I INFO = 20logger.info(u’обычная запись в лог’)

I DEBUG = 10logger.debug(u’логи, которые помогли нам при отладке приложения икоторые вряд ли пригодятся в будущем’)

Про логгирование, Стас Рудаков

Page 30: Очередной скучный доклад про логгирование

tips n tricks: traceback1 try:2 do_something_unsafe ()3 except Exception as e:4 logger.exception(’Unexpected exception ’)5 raise

В лог отправится:

1 [2014 -01 -29 23:35:04 ,393][ examples ][ERROR] Unexpected exception2 Traceback (most recent call last):3 File "stacktrace1.py", line 22, in <module >4 do_something_unsafe ()5 File "stacktrace1.py", line 18, in do_something_unsafe6 down_rabbit_hole ()7 File "stacktrace1.py", line 17, in down_rabbit_hole8 sender = message.sender9 AttributeError: ’NoneType ’ object has no attribute ’sender ’

Про логгирование, Стас Рудаков

Page 31: Очередной скучный доклад про логгирование

tips n tricks: traceback1 try:2 do_something_unsafe ()3 except Exception as e:4 logger.exception(’Unexpected exception ’)5 raise

В лог отправится:

1 [2014 -01 -29 23:35:04 ,393][ examples ][ERROR] Unexpected exception2 Traceback (most recent call last):3 File "stacktrace1.py", line 22, in <module >4 do_something_unsafe ()5 File "stacktrace1.py", line 18, in do_something_unsafe6 down_rabbit_hole ()7 File "stacktrace1.py", line 17, in down_rabbit_hole8 sender = message.sender9 AttributeError: ’NoneType ’ object has no attribute ’sender ’

Про логгирование, Стас Рудаков

Page 32: Очередной скучный доклад про логгирование

tips n tricks: traceback1 try:2 validate_data(data)3 except ValidationError as e:4 logger.exception(’Validation failed ’)

А в лог запишется

1 [2014 -01 -29 08:33:53 ,439][ examples ][ERROR] Validation failed2 Traceback (most recent call last):3 File "stacktrace2.py", line 27, in <module >4 validate_data(data)5 File "stacktrace2.py", line 22, in validate_data6 check_values(data)7 File "stacktrace2.py", line 21, in check_values8 raise ValidationError(’security key is missing ’)9 ValidationError: security key is missing

Но разве уровень ERROR нам подходит?

Про логгирование, Стас Рудаков

Page 33: Очередной скучный доклад про логгирование

tips n tricks: traceback1 try:2 validate_data(data)3 except ValidationError as e:4 logger.exception(’Validation failed ’)

А в лог запишется

1 [2014 -01 -29 08:33:53 ,439][ examples ][ERROR] Validation failed2 Traceback (most recent call last):3 File "stacktrace2.py", line 27, in <module >4 validate_data(data)5 File "stacktrace2.py", line 22, in validate_data6 check_values(data)7 File "stacktrace2.py", line 21, in check_values8 raise ValidationError(’security key is missing ’)9 ValidationError: security key is missing

Но разве уровень ERROR нам подходит?Про логгирование, Стас Рудаков

Page 34: Очередной скучный доклад про логгирование

tips n tricks: traceback

1 try:2 validate_data(data)3 except ValidationError as e:4 logger.warning(’Validation failed ’, exc_info=True)

Получаем

1 [2014 -01 -29 08:33:53 ,439][ examples ][ WARNING] Validation failed2 Traceback (most recent call last):3 File "stacktrace2.py", line 27, in <module >4 validate_data(data)5 File "stacktrace2.py", line 22, in validate_data6 check_values(data)7 File "stacktrace2.py", line 21, in check_values8 raise ValidationError(’security key is missing ’)9 ValidationError: security key is missing

Про логгирование, Стас Рудаков

Page 35: Очередной скучный доклад про логгирование

tips n tricks: “ленивое” форматирование

1 logger.info(2 ’Request id=%s message =%r’ % (100500 , {’event’: ’meetup ’})3 )

Зачем форматировать строку, если мы не знаем, попадет ли она в лог?

1 logger.info(2 ’Request id=%s message =%r’, 100500 , {’event ’: ’meetup ’}3 )

*args работают, **kwargs не работают

Про логгирование, Стас Рудаков

Page 36: Очередной скучный доклад про логгирование

tips n tricks: “ленивое” форматирование

1 logger.info(2 ’Request id=%s message =%r’ % (100500 , {’event’: ’meetup ’})3 )

Зачем форматировать строку, если мы не знаем, попадет ли она в лог?

1 logger.info(2 ’Request id=%s message =%r’, 100500 , {’event ’: ’meetup ’}3 )

*args работают, **kwargs не работают

Про логгирование, Стас Рудаков

Page 37: Очередной скучный доклад про логгирование

tips n tricks: “ленивое” форматирование

1 logger.info(2 ’Request id=%s message =%r’ % (100500 , {’event’: ’meetup ’})3 )

Зачем форматировать строку, если мы не знаем, попадет ли она в лог?

1 logger.info(2 ’Request id=%s message =%r’, 100500 , {’event ’: ’meetup ’}3 )

*args работают, **kwargs не работают

Про логгирование, Стас Рудаков

Page 38: Очередной скучный доклад про логгирование

tips n tricks: “ленивое” форматирование

1 logger.info(2 ’Request id=%s message =%r’ % (100500 , {’event’: ’meetup ’})3 )

Зачем форматировать строку, если мы не знаем, попадет ли она в лог?

1 logger.info(2 ’Request id=%s message =%r’, 100500 , {’event ’: ’meetup ’}3 )

*args работают, **kwargs не работают

Про логгирование, Стас Рудаков

Page 39: Очередной скучный доклад про логгирование

tips n tricks: ротацияв один прекрасный день. . .

no space left on devicefrom logging.handlers import *

1 RotatingFileHandler(2 filename , mode=’a’,3 maxBytes=0, backupCount =0,4 encoding=None , delay=False5 )

1 $ ls logs2 meetup.log3 meetup.log.14 meetup.log.25 meetup.log.3

1 TimedRotatingFileHandler(2 filename ,3 when=’h’, interval=1,4 backupCount =0, encoding=None ,5 delay=False , utc=False)

1 $ ls logs2 meetup.log3 meetup.log .2014 -01 -31 _174 meetup.log .2014 -01 -31 _185 meetup.log .2014 -01 -31 _19

Если варианты выше не подходят, можно использовать утилиту logrotate и

1 WatchedFileHandler(fname , mode=’a’, encoding=None , delay=False)

Про логгирование, Стас Рудаков

Page 40: Очередной скучный доклад про логгирование

tips n tricks: ротацияв один прекрасный день. . . no space left on device

from logging.handlers import *

1 RotatingFileHandler(2 filename , mode=’a’,3 maxBytes=0, backupCount =0,4 encoding=None , delay=False5 )

1 $ ls logs2 meetup.log3 meetup.log.14 meetup.log.25 meetup.log.3

1 TimedRotatingFileHandler(2 filename ,3 when=’h’, interval=1,4 backupCount =0, encoding=None ,5 delay=False , utc=False)

1 $ ls logs2 meetup.log3 meetup.log .2014 -01 -31 _174 meetup.log .2014 -01 -31 _185 meetup.log .2014 -01 -31 _19

Если варианты выше не подходят, можно использовать утилиту logrotate и

1 WatchedFileHandler(fname , mode=’a’, encoding=None , delay=False)

Про логгирование, Стас Рудаков

Page 41: Очередной скучный доклад про логгирование

tips n tricks: ротацияв один прекрасный день. . . no space left on devicefrom logging.handlers import *

1 RotatingFileHandler(2 filename , mode=’a’,3 maxBytes=0, backupCount =0,4 encoding=None , delay=False5 )

1 $ ls logs2 meetup.log3 meetup.log.14 meetup.log.25 meetup.log.3

1 TimedRotatingFileHandler(2 filename ,3 when=’h’, interval=1,4 backupCount =0, encoding=None ,5 delay=False , utc=False)

1 $ ls logs2 meetup.log3 meetup.log .2014 -01 -31 _174 meetup.log .2014 -01 -31 _185 meetup.log .2014 -01 -31 _19

Если варианты выше не подходят, можно использовать утилиту logrotate и

1 WatchedFileHandler(fname , mode=’a’, encoding=None , delay=False)

Про логгирование, Стас Рудаков

Page 42: Очередной скучный доклад про логгирование

tips n tricks: ротацияв один прекрасный день. . . no space left on devicefrom logging.handlers import *

1 RotatingFileHandler(2 filename , mode=’a’,3 maxBytes=0, backupCount =0,4 encoding=None , delay=False5 )

1 $ ls logs2 meetup.log3 meetup.log.14 meetup.log.25 meetup.log.3

1 TimedRotatingFileHandler(2 filename ,3 when=’h’, interval=1,4 backupCount =0, encoding=None ,5 delay=False , utc=False)

1 $ ls logs2 meetup.log3 meetup.log .2014 -01 -31 _174 meetup.log .2014 -01 -31 _185 meetup.log .2014 -01 -31 _19

Если варианты выше не подходят, можно использовать утилиту logrotate и

1 WatchedFileHandler(fname , mode=’a’, encoding=None , delay=False)

Про логгирование, Стас Рудаков

Page 43: Очередной скучный доклад про логгирование

tips n tricks: ротацияв один прекрасный день. . . no space left on devicefrom logging.handlers import *

1 RotatingFileHandler(2 filename , mode=’a’,3 maxBytes=0, backupCount =0,4 encoding=None , delay=False5 )

1 $ ls logs2 meetup.log3 meetup.log.14 meetup.log.25 meetup.log.3

1 TimedRotatingFileHandler(2 filename ,3 when=’h’, interval=1,4 backupCount =0, encoding=None ,5 delay=False , utc=False)

1 $ ls logs2 meetup.log3 meetup.log .2014 -01 -31 _174 meetup.log .2014 -01 -31 _185 meetup.log .2014 -01 -31 _19

Если варианты выше не подходят, можно использовать утилиту logrotate и

1 WatchedFileHandler(fname , mode=’a’, encoding=None , delay=False)

Про логгирование, Стас Рудаков

Page 44: Очередной скучный доклад про логгирование

Sentrygetsentry.com

Про логгирование, Стас Рудаков

Page 45: Очередной скучный доклад про логгирование

Sentry - это. . .I open source

аггрегаторсообщений обошибках,

I написанный наPython +Django +Celery,

I с клиентамидля многихязыков иплатформ.

Про логгирование, Стас Рудаков

Page 46: Очередной скучный доклад про логгирование

Про логгирование, Стас Рудаков

Page 47: Очередной скучный доклад про логгирование

Sentry: как подключить1 from raven.handlers.logging import SentryHandler2 handler = SentryHandler(’http :// public:[email protected]/1’,3 level=logging.WARNING)

4 logger = logging.getLogger(’coffeemaker ’)5 logger.addHandler(handler)

6 logger.warning(’We are running out of milk’)7 logger.error(’Not enough milk for a cappuccino ’)

HTTP? Cерьезно?

Про логгирование, Стас Рудаков

Page 48: Очередной скучный доклад про логгирование

Sentry: как подключить1 from raven.handlers.logging import SentryHandler2 handler = SentryHandler(’http :// public:[email protected]/1’,3 level=logging.WARNING)

4 logger = logging.getLogger(’coffeemaker ’)5 logger.addHandler(handler)

6 logger.warning(’We are running out of milk’)7 logger.error(’Not enough milk for a cappuccino ’)

HTTP? Cерьезно?

Про логгирование, Стас Рудаков

Page 49: Очередной скучный доклад про логгирование

Sentry: как подключить1 from raven.handlers.logging import SentryHandler2 handler = SentryHandler(’http :// public:[email protected]/1’,3 level=logging.WARNING)

4 logger = logging.getLogger(’coffeemaker ’)5 logger.addHandler(handler)

6 logger.warning(’We are running out of milk’)7 logger.error(’Not enough milk for a cappuccino ’)

HTTP? Cерьезно?

Про логгирование, Стас Рудаков

Page 50: Очередной скучный доклад про логгирование

Sentry: как подключить1 from raven.handlers.logging import SentryHandler2 handler = SentryHandler(’http :// public:[email protected]/1’,3 level=logging.WARNING)

4 logger = logging.getLogger(’coffeemaker ’)5 logger.addHandler(handler)

6 logger.warning(’We are running out of milk’)7 logger.error(’Not enough milk for a cappuccino ’)

HTTP? Cерьезно?

Про логгирование, Стас Рудаков

Page 51: Очередной скучный доклад про логгирование

А теперь давайте вспомним, что мы с этими логами собирались делать

I DebugI Разбор инцидентов

I Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика

Про логгирование, Стас Рудаков

Page 52: Очередной скучный доклад про логгирование

А теперь давайте вспомним, что мы с этими логами собирались делать

I DebugI Разбор инцидентовI Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика

Про логгирование, Стас Рудаков

Page 53: Очередной скучный доклад про логгирование

Назад в будущее

Современные вызовы:I хотим убедиться, что логи не были модифицированы злоумышленником

после взлома;I переходим от программ к сложным распределенным системам — хочется

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

Про логгирование, Стас Рудаков

Page 54: Очередной скучный доклад про логгирование

elasticsearchelasticsearch.org

Про логгирование, Стас Рудаков

Page 55: Очередной скучный доклад про логгирование

elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движок

I c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.

I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях

(если вам нужно убедить своего менеджера).

Но как связать логгирование и elasticsearch?

Про логгирование, Стас Рудаков

Page 56: Очередной скучный доклад про логгирование

elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движокI c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.

I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях

(если вам нужно убедить своего менеджера).

Но как связать логгирование и elasticsearch?

Про логгирование, Стас Рудаков

Page 57: Очередной скучный доклад про логгирование

elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движокI c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.

I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях

(если вам нужно убедить своего менеджера).

Но как связать логгирование и elasticsearch?

Про логгирование, Стас Рудаков

Page 58: Очередной скучный доклад про логгирование

elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движокI c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.

I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях

(если вам нужно убедить своего менеджера).

Но как связать логгирование и elasticsearch?Про логгирование, Стас Рудаков

Page 59: Очередной скучный доклад про логгирование

logstashlogstash.net

Про логгирование, Стас Рудаков

Page 60: Очередной скучный доклад про логгирование

Про логгирование, Стас Рудаков

Page 61: Очередной скучный доклад про логгирование

logstash + elasticsearch + kibana = nice web UI

Про логгирование, Стас Рудаков

Page 62: Очередной скучный доклад про логгирование

structlog — последний ингридиент

1 >>> from structlog import get_logger2 >>> log = get_logger ()3 >>> log = log.bind(user=’anonymous ’, some_key =23)4 >>> log = log.bind(user=’hynek’, another_key =42)5 >>> log.info(’user.logged_in ’, happy=True)6 some_key =23 user=’hynek ’ another_key =42 happy=True event=’user.

logged_in ’

http://www.structlog.org/

Про логгирование, Стас Рудаков

Page 63: Очередной скучный доклад про логгирование

Что мы не объяли?

I Syslog ProtocolI Логи в реляционной базе данныхI journaldI logplex, fluentdI Агенты для сбора логовI Что, собственно, писать в логи.

Про логгирование, Стас Рудаков

Page 64: Очередной скучный доклад про логгирование

Выводы

I Батарейка logging вполне подходит для 95% случаев1.

I Архитектуры систем логгирования похожи как на микро, так и на макроуровне.

I Open source инструменты помогают выжать из логов очень много полезныхсвойств.

I Я вас всех порядочно утомил.

1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков

Page 65: Очередной скучный доклад про логгирование

Выводы

I Батарейка logging вполне подходит для 95% случаев1.I Архитектуры систем логгирования похожи как на микро, так и на макро

уровне.

I Open source инструменты помогают выжать из логов очень много полезныхсвойств.

I Я вас всех порядочно утомил.

1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков

Page 66: Очередной скучный доклад про логгирование

Выводы

I Батарейка logging вполне подходит для 95% случаев1.I Архитектуры систем логгирования похожи как на микро, так и на макро

уровне.I Open source инструменты помогают выжать из логов очень много полезных

свойств.

I Я вас всех порядочно утомил.

1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков

Page 67: Очередной скучный доклад про логгирование

Выводы

I Батарейка logging вполне подходит для 95% случаев1.I Архитектуры систем логгирования похожи как на микро, так и на макро

уровне.I Open source инструменты помогают выжать из логов очень много полезных

свойств.I Я вас всех порядочно утомил.

1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков

Page 68: Очередной скучный доклад про логгирование

СПАСИБО ЗА ВНИМАНИЕ. ВОПРОСЫ?

Стас Рудаковmailto:[email protected]://raw.github.com/nott/talks/logging.pdf

http://docs.python.org/3/library/logging.htmlhttp://www.structlog.org/https://www.getsentry.com/http://logstash.net/