Очередной скучный доклад про логгирование
DESCRIPTION
Стас Рудаков, компания СООО "Гейм Стрим"/Wargaming.net Значение логов очень часто недооценивается, а зря. Доклад с оживленным диспутом со всеми участниками митапа, чтобы разобраться: как, куда и зачем писать логи. Помимо этого затронут вопрос, как из логов выжать больше информации.TRANSCRIPT
![Page 1: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/1.jpg)
ОЧЕРЕДНОЙ СКУЧНЫЙ ДОКЛАДПРО ЛОГГИРОВАНИЕ
Стас Рудаков
![Page 2: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/2.jpg)
Эпиграф
Невозможно объять необъятное.
Козьма Прутков
Про логгирование, Стас Рудаков
![Page 3: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/3.jpg)
Про что будем говорить?
Про логгирование, там же было написано :)
А именно:I зачем;I как;I проблемы;I очевидные пути решения;I неочевидные пути решения;I open source инструменты.
Про логгирование, Стас Рудаков
![Page 4: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/4.jpg)
Про что будем говорить?
Про логгирование, там же было написано :)
А именно:I зачем;I как;I проблемы;I очевидные пути решения;I неочевидные пути решения;I open source инструменты.
Про логгирование, Стас Рудаков
![Page 5: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/5.jpg)
Про что будем говорить?
Про логгирование, там же было написано :)
А именно:I зачем;I как;I проблемы;I очевидные пути решения;I неочевидные пути решения;I open source инструменты.
Про логгирование, Стас Рудаков
![Page 6: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/6.jpg)
Что вообще значит “записать в лог”?
I сформировать сообщениеI по некому событиюI и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.
Про логгирование, Стас Рудаков
![Page 7: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/7.jpg)
Что вообще значит “записать в лог”?
I сформировать сообщение
I по некому событиюI и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.
Про логгирование, Стас Рудаков
![Page 8: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/8.jpg)
Что вообще значит “записать в лог”?
I сформировать сообщениеI по некому событию
I и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.
Про логгирование, Стас Рудаков
![Page 9: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/9.jpg)
Что вообще значит “записать в лог”?
I сформировать сообщениеI по некому событиюI и, если это сообщение нас вообще интересует,
I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.
Про логгирование, Стас Рудаков
![Page 10: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/10.jpg)
Что вообще значит “записать в лог”?
I сформировать сообщениеI по некому событиюI и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,
I куда имеют доступ заинтересованные лица.
Про логгирование, Стас Рудаков
![Page 11: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/11.jpg)
Что вообще значит “записать в лог”?
I сформировать сообщениеI по некому событиюI и, если это сообщение нас вообще интересует,I записать или отправить его куда-то,I куда имеют доступ заинтересованные лица.
Про логгирование, Стас Рудаков
![Page 12: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/12.jpg)
Зачем
I DebugI Разбор инцидентов
I Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика
Про логгирование, Стас Рудаков
![Page 13: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/13.jpg)
Зачем
I DebugI Разбор инцидентовI Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика
Про логгирование, Стас Рудаков
![Page 14: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/14.jpg)
import logging
Про логгирование, Стас Рудаков
![Page 15: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/15.jpg)
Писать логи очень просто
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/16.jpg)
Писать логи очень просто
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/17.jpg)
logging: архитектура на пальцах
I сформировать сообщениеI по некому событию
I и, если это сообщение нас вообщеинтересует,
I записать или отправить его куда-то,I куда имеют доступ
заинтересованные лица.
Про логгирование, Стас Рудаков
![Page 18: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/18.jpg)
Про логгирование, Стас Рудаков
![Page 19: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/19.jpg)
Про логгирование, Стас Рудаков
![Page 20: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/20.jpg)
Про логгирование, Стас Рудаков
![Page 21: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/21.jpg)
Про логгирование, Стас Рудаков
![Page 22: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/22.jpg)
Про логгирование, Стас Рудаков
![Page 23: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/23.jpg)
Конфигурация
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/24.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/25.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/26.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/27.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/28.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/29.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/30.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/31.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/32.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/33.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/34.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/35.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/36.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/37.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/38.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/39.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/40.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/41.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/42.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/43.jpg)
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 45: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/45.jpg)
Sentry - это. . .I open source
аггрегаторсообщений обошибках,
I написанный наPython +Django +Celery,
I с клиентамидля многихязыков иплатформ.
Про логгирование, Стас Рудаков
![Page 46: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/46.jpg)
Про логгирование, Стас Рудаков
![Page 47: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/47.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/48.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/49.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/50.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/51.jpg)
А теперь давайте вспомним, что мы с этими логами собирались делать
I DebugI Разбор инцидентов
I Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика
Про логгирование, Стас Рудаков
![Page 52: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/52.jpg)
А теперь давайте вспомним, что мы с этими логами собирались делать
I DebugI Разбор инцидентовI Сбор статистикиI Средне- и долгосрочный мониторингI Инструмент для службы поддержки пользователейI Аналитика
Про логгирование, Стас Рудаков
![Page 53: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/53.jpg)
Назад в будущее
Современные вызовы:I хотим убедиться, что логи не были модифицированы злоумышленником
после взлома;I переходим от программ к сложным распределенным системам — хочется
иметь логгирование уровня всей системы, а не отдельных приложений;I быстрый поиск;I метрики.
Про логгирование, Стас Рудаков
![Page 55: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/55.jpg)
elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движок
I c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.
I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях
(если вам нужно убедить своего менеджера).
Но как связать логгирование и elasticsearch?
Про логгирование, Стас Рудаков
![Page 56: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/56.jpg)
elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движокI c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.
I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях
(если вам нужно убедить своего менеджера).
Но как связать логгирование и elasticsearch?
Про логгирование, Стас Рудаков
![Page 57: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/57.jpg)
elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движокI c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.
I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях
(если вам нужно убедить своего менеджера).
Но как связать логгирование и elasticsearch?
Про логгирование, Стас Рудаков
![Page 58: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/58.jpg)
elasticsearch - это. . .I распределенныйI полнотекстовыйI поисковый движокI c RESTful web-интерфейсом,I с документами без схемыI и возможностями аггрегации документов.
I Написан на JavaI с использованием библиотеки Apache Lucene.I Используется в Mozilla, GitHub и многих других компаниях
(если вам нужно убедить своего менеджера).
Но как связать логгирование и elasticsearch?Про логгирование, Стас Рудаков
![Page 60: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/60.jpg)
Про логгирование, Стас Рудаков
![Page 61: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/61.jpg)
logstash + elasticsearch + kibana = nice web UI
Про логгирование, Стас Рудаков
![Page 62: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/62.jpg)
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: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/63.jpg)
Что мы не объяли?
I Syslog ProtocolI Логи в реляционной базе данныхI journaldI logplex, fluentdI Агенты для сбора логовI Что, собственно, писать в логи.
Про логгирование, Стас Рудаков
![Page 64: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/64.jpg)
Выводы
I Батарейка logging вполне подходит для 95% случаев1.
I Архитектуры систем логгирования похожи как на микро, так и на макроуровне.
I Open source инструменты помогают выжать из логов очень много полезныхсвойств.
I Я вас всех порядочно утомил.
1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков
![Page 65: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/65.jpg)
Выводы
I Батарейка logging вполне подходит для 95% случаев1.I Архитектуры систем логгирования похожи как на микро, так и на макро
уровне.
I Open source инструменты помогают выжать из логов очень много полезныхсвойств.
I Я вас всех порядочно утомил.
1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков
![Page 66: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/66.jpg)
Выводы
I Батарейка logging вполне подходит для 95% случаев1.I Архитектуры систем логгирования похожи как на микро, так и на макро
уровне.I Open source инструменты помогают выжать из логов очень много полезных
свойств.
I Я вас всех порядочно утомил.
1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков
![Page 67: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/67.jpg)
Выводы
I Батарейка logging вполне подходит для 95% случаев1.I Архитектуры систем логгирования похожи как на микро, так и на макро
уровне.I Open source инструменты помогают выжать из логов очень много полезных
свойств.I Я вас всех порядочно утомил.
1По статистике, не стоит доверять 75% статистикиПро логгирование, Стас Рудаков
![Page 68: Очередной скучный доклад про логгирование](https://reader033.vdocuments.net/reader033/viewer/2022052622/558c5eeed8b42a000c8b46c3/html5/thumbnails/68.jpg)
СПАСИБО ЗА ВНИМАНИЕ. ВОПРОСЫ?
Стас Рудаков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/