SlideShare ist ein Scribd-Unternehmen logo
1 von 68
Downloaden Sie, um offline zu lesen
ОЧЕРЕДНОЙ СКУЧНЫЙ ДОКЛАД
ПРО ЛОГГИРОВАНИЕ
Стас Рудаков
Эпиграф

Невозможно объять необъятное.
Козьма Прутков

Про логгирование, Стас Рудаков
Про что будем говорить?

Про логгирование, Стас Рудаков
Про что будем говорить?
Про логгирование, там же было написано :)

Про логгирование, Стас Рудаков
Про что будем говорить?
Про логгирование, там же было написано :)

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

Про логгирование, Стас Рудаков
Что вообще значит “записать в лог”?

Про логгирование, Стас Рудаков
Что вообще значит “записать в лог”?

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

Про логгирование, Стас Рудаков
Что вообще значит “записать в лог”?

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

Про логгирование, Стас Рудаков
Что вообще значит “записать в лог”?

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

Про логгирование, Стас Рудаков
Что вообще значит “записать в лог”?

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

Про логгирование, Стас Рудаков
Что вообще значит “записать в лог”?

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

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

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

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

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

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

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

import logging

2
3
4
5
6
7

logging . basicConfig (
format = ’ [%( asctime ) s ][%( levelname ) s ][%( name ) s ] %( message ) s ’ ,
stream = sys . stdout ,
level = logging . INFO
)

8
9
10

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

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

import logging

2
3
4
5
6
7

logging . basicConfig (
format = ’ [%( asctime ) s ][%( levelname ) s ][%( name ) s ] %( message ) s ’ ,
stream = sys . stdout ,
level = logging . INFO
)

8
9
10

1

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

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

Про логгирование, Стас Рудаков
logging: архитектура на пальцах
сформировать сообщение
по некому событию

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

записать или отправить его куда-то,
куда имеют доступ
заинтересованные лица.
Про логгирование, Стас Рудаков
Про логгирование, Стас Рудаков
Про логгирование, Стас Рудаков
Про логгирование, Стас Рудаков
Про логгирование, Стас Рудаков
Про логгирование, Стас Рудаков
Конфигурация
1
2
3
4

5
6
7
8
9
10
11
12

13

CFG = {
’ formatters ’: {
’ simple ’: {
’ format ’: ’ %( asctime ) s %(
message ) s ’} ,} ,
’ filters ’: {
’ pwd ’: {
’ () ’: ’ proj . PwdFilter ’ ,
’ foo ’: ’ bar ’ ,} ,} ,
’ handlers ’: {
’ console ’ :{
’ level ’: ’ DEBUG ’ ,
’ class ’: ’ logging . ’
’ StreamHandler ’ ,
’ formatter ’: ’ simple ’} ,

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

14
15
16

17
18
19
20
21
22
23
24
25
26
27

’ mail_adm ’: {
’ level ’: ’ ERROR ’ ,
’ class ’: ’ proj . ’
’ Admi nEmailHa ndler ’ ,
’ filters ’: [ ’ pwd ’ ]} ,} ,
’ loggers ’: {
’ ’: {
’ handlers ’: [ ’ console ’] ,
’ level ’: ’ INFO ’ ,
’ filters ’: [ ’ pwd ’]} ,
’ django . request ’: {
’ handlers ’: [ ’ mail_adm ’] ,
’ level ’: ’ ERROR ’ ,
’ propagate ’: False ,} ,} ,}
logging . config . dictConfig ( CFG )
tips n tricks: уровни логгирования

Про логгирование, Стас Рудаков
tips n tricks: уровни логгирования
CRITICAL = 50
logger.critical(u’проблема, после которой приложение не может
восстановиться без постороннего вмешательства’)

Про логгирование, Стас Рудаков
tips n tricks: уровни логгирования
CRITICAL = 50
logger.critical(u’проблема, после которой приложение не может
восстановиться без постороннего вмешательства’)
ERROR = 40
logger.error(u’проблема, из-за которой приложение работает не в
штатном режиме’)

Про логгирование, Стас Рудаков
tips n tricks: уровни логгирования
CRITICAL = 50
logger.critical(u’проблема, после которой приложение не может
восстановиться без постороннего вмешательства’)
ERROR = 40
logger.error(u’проблема, из-за которой приложение работает не в
штатном режиме’)
WARNING = 30 # уровень по умолчанию
logger.warning(u’проблема, которая не мешает работе приложения, но
на которую стоит обратить внимание’)

Про логгирование, Стас Рудаков
tips n tricks: уровни логгирования
CRITICAL = 50
logger.critical(u’проблема, после которой приложение не может
восстановиться без постороннего вмешательства’)
ERROR = 40
logger.error(u’проблема, из-за которой приложение работает не в
штатном режиме’)
WARNING = 30 # уровень по умолчанию
logger.warning(u’проблема, которая не мешает работе приложения, но
на которую стоит обратить внимание’)
INFO = 20
logger.info(u’обычная запись в лог’)

Про логгирование, Стас Рудаков
tips n tricks: уровни логгирования
CRITICAL = 50
logger.critical(u’проблема, после которой приложение не может
восстановиться без постороннего вмешательства’)
ERROR = 40
logger.error(u’проблема, из-за которой приложение работает не в
штатном режиме’)
WARNING = 30 # уровень по умолчанию
logger.warning(u’проблема, которая не мешает работе приложения, но
на которую стоит обратить внимание’)
INFO = 20
logger.info(u’обычная запись в лог’)
DEBUG = 10
logger.debug(u’логи, которые помогли нам при отладке приложения и
которые вряд ли пригодятся в будущем’)
Про логгирование, Стас Рудаков
tips n tricks: traceback
1

try :

2

do_ s o me t hi n g_ u n sa f e ()
except Exception as e :
logger . exception ( ’ Unexpected exception ’)
raise

3
4
5

Про логгирование, Стас Рудаков
tips n tricks: traceback
1

try :

2

do_ s o me t hi n g_ u n sa f e ()
except Exception as e :
logger . exception ( ’ Unexpected exception ’)
raise

3
4
5

В лог отправится:
1
2
3
4
5
6
7
8
9

[2014 -01 -29 23:35:04 ,393][ examples ][ ERROR ] Unexpected exception
Traceback ( most recent call last ) :
File " stacktrace1 . py " , line 22 , in < module >
d o_ s o me t hi n g_ u n sa f e ()
File " stacktrace1 . py " , line 18 , in do _ so m e th i ng _ u ns a fe
down_rabbit_hole ()
File " stacktrace1 . py " , line 17 , in down_rabbit_hole
sender = message . sender
AttributeError : ’ NoneType ’ object has no attribute ’ sender ’

Про логгирование, Стас Рудаков
tips n tricks: traceback
1

try :

2

validate_data ( data )
except ValidationError as e :
logger . exception ( ’ Validation failed ’)

3
4

А в лог запишется
1
2
3
4
5
6
7
8
9

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

Про логгирование, Стас Рудаков
tips n tricks: traceback
1

try :

2

validate_data ( data )
except ValidationError as e :
logger . exception ( ’ Validation failed ’)

3
4

А в лог запишется
1
2
3
4
5
6
7
8
9

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

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

try :

2

validate_data ( data )
except ValidationError as e :
logger . warning ( ’ Validation failed ’ , exc_info = True )

3
4

Получаем
1
2
3
4
5
6
7
8
9

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

Про логгирование, Стас Рудаков
tips n tricks: “ленивое” форматирование
1
2
3

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

Про логгирование, Стас Рудаков
tips n tricks: “ленивое” форматирование
1
2
3

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

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

Про логгирование, Стас Рудаков
tips n tricks: “ленивое” форматирование
1
2
3

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

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

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

Про логгирование, Стас Рудаков
tips n tricks: “ленивое” форматирование
1
2
3

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

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

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

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

Про логгирование, Стас Рудаков
tips n tricks: ротация
в один прекрасный день. . .

Про логгирование, Стас Рудаков
tips n tricks: ротация
в один прекрасный день. . . no space left on device

Про логгирование, Стас Рудаков
tips n tricks: ротация
в один прекрасный день. . . no space left on device
from logging.handlers import *
1
2
3
4
5

1
2
3
4
5

Rotating Fi l eH a n dl e r (
filename , mode = ’a ’ ,
maxBytes =0 , backupCount =0 ,
encoding = None , delay = False
)
$ ls logs
meetup . log
meetup . log .1
meetup . log .2
meetup . log .3

Про логгирование, Стас Рудаков
tips n tricks: ротация
в один прекрасный день. . . no space left on device
from logging.handlers import *
1
2
3
4
5

1
2
3
4
5

Rotating Fi l eH a n dl e r (
filename , mode = ’a ’ ,
maxBytes =0 , backupCount =0 ,
encoding = None , delay = False
)

1

$ ls logs
meetup . log
meetup . log .1
meetup . log .2
meetup . log .3

1

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

2
3
4
5

2
3
4
5

T i m e d Ro t a t i n g F i l e H a n d l e r (
filename ,
when = ’h ’ , interval =1 ,
backupCount =0 , encoding = None ,
delay = False , utc = False )
$ ls logs
meetup . log
meetup . log .2014 -01 -31 _17
meetup . log .2014 -01 -31 _18
meetup . log .2014 -01 -31 _19
tips n tricks: ротация
в один прекрасный день. . . no space left on device
from logging.handlers import *
1
2
3
4
5

1
2
3
4
5

Rotating Fi l eH a n dl e r (
filename , mode = ’a ’ ,
maxBytes =0 , backupCount =0 ,
encoding = None , delay = False
)

1

$ ls logs
meetup . log
meetup . log .1
meetup . log .2
meetup . log .3

1

2
3
4
5

2
3
4
5

T i m e d Ro t a t i n g F i l e H a n d l e r (
filename ,
when = ’h ’ , interval =1 ,
backupCount =0 , encoding = None ,
delay = False , utc = False )
$ ls logs
meetup . log
meetup . log .2014 -01 -31 _17
meetup . log .2014 -01 -31 _18
meetup . log .2014 -01 -31 _19

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

Wa tc he dFi le Ha ndl er ( fname , mode = ’a ’ , encoding = None , delay = False )

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

Про логгирование, Стас Рудаков
Sentry - это. . .
open source
аггрегатор
сообщений об
ошибках,
написанный на
Python +
Django +
Celery,
с клиентами
для многих
языков и
платформ.

Про логгирование, Стас Рудаков
Про логгирование, Стас Рудаков
Sentry: как подключить
1
2
3

from raven . handlers . logging import SentryHandler
handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ ,
level = logging . WARNING )

Про логгирование, Стас Рудаков
Sentry: как подключить
1
2
3

4
5

from raven . handlers . logging import SentryHandler
handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ ,
level = logging . WARNING )

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

Про логгирование, Стас Рудаков
Sentry: как подключить
1
2
3

4
5

6
7

from raven . handlers . logging import SentryHandler
handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ ,
level = logging . WARNING )

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

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

Про логгирование, Стас Рудаков
Sentry: как подключить
1
2
3

4
5

6
7

from raven . handlers . logging import SentryHandler
handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ ,
level = logging . WARNING )

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

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

HTTP? Cерьезно?
Про логгирование, Стас Рудаков
А теперь давайте вспомним, что мы с этими логами собирались делать

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

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

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

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

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

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

Про логгирование, Стас Рудаков
elasticsearch - это. . .
распределенный
полнотекстовый
поисковый движок

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

Про логгирование, Стас Рудаков
elasticsearch - это. . .
распределенный
полнотекстовый
поисковый движок
c RESTful web-интерфейсом,
с документами без схемы
и возможностями аггрегации документов.
Написан на Java
с использованием библиотеки Apache Lucene.
Используется в Mozilla, GitHub и многих других компаниях
(если вам нужно убедить своего менеджера).

Про логгирование, Стас Рудаков
elasticsearch - это. . .
распределенный
полнотекстовый
поисковый движок
c RESTful web-интерфейсом,
с документами без схемы
и возможностями аггрегации документов.
Написан на Java
с использованием библиотеки Apache Lucene.
Используется в Mozilla, GitHub и многих других компаниях
(если вам нужно убедить своего менеджера).
Но как связать логгирование и elasticsearch?
Про логгирование, Стас Рудаков
logstash
logstash.net

Про логгирование, Стас Рудаков
Про логгирование, Стас Рудаков
logstash + elasticsearch + kibana = nice web UI

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

1
2
3
4
5
6

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

http://www.structlog.org/

Про логгирование, Стас Рудаков
Что мы не объяли?

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

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

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

1

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

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

1

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

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

1

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

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

1

По статистике, не стоит доверять 75% статистики
Про логгирование, Стас Рудаков
СПАСИБО ЗА ВНИМАНИЕ. ВОПРОСЫ?

Стас Рудаков
mailto:stas@garage22.net
https://raw.github.com/nott/talks/logging.pdf
http://docs.python.org/3/library/logging.html
http://www.structlog.org/
https://www.getsentry.com/
http://logstash.net/

Weitere ähnliche Inhalte

Was ist angesagt?

Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Haskell
HaskellHaskell
HaskellDevDay
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 

Was ist angesagt? (20)

Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Haskell
HaskellHaskell
Haskell
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 

Andere mochten auch

Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
 
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Python Meetup
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Python Meetup
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Python Meetup
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...Python Meetup
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюPython Meetup
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedPython Meetup
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingPython Meetup
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Python Meetup
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer WargamingPython Meetup
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
 

Andere mochten auch (14)

Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Pebble
PebblePebble
Pebble
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 

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

PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)Ontico
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016Anastasia Goryacheva
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Andrew Mayorov
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»Yandex
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/LinuxDefconRussia
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Devconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииDevconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииAlex Popov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?CodeFest
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Я построю свой профайлер!
Я построю свой профайлер!Я построю свой профайлер!
Я построю свой профайлер!Alexey Kovaliov
 
"Построение рекомендательной системы на Python" Василий Лексин (Avito)
"Построение рекомендательной системы на Python" Василий Лексин (Avito)"Построение рекомендательной системы на Python" Василий Лексин (Avito)
"Построение рекомендательной системы на Python" Василий Лексин (Avito)AvitoTech
 

Ähnlich wie Очередной скучный доклад про логгирование (20)

PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
MongoDB@addconf
MongoDB@addconfMongoDB@addconf
MongoDB@addconf
 
Devconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииDevconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логировании
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Я построю свой профайлер!
Я построю свой профайлер!Я построю свой профайлер!
Я построю свой профайлер!
 
"Построение рекомендательной системы на Python" Василий Лексин (Avito)
"Построение рекомендательной системы на Python" Василий Лексин (Avito)"Построение рекомендательной системы на Python" Василий Лексин (Avito)
"Построение рекомендательной системы на Python" Василий Лексин (Avito)
 
WTF Code @ jug.lv
WTF Code @ jug.lvWTF Code @ jug.lv
WTF Code @ jug.lv
 

Mehr von Python Meetup

Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данныхPython Meetup
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Python Meetup
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиPython Meetup
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GILPython Meetup
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаPython Meetup
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3Python Meetup
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory managementPython Meetup
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийPython Meetup
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtPython Meetup
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть IIPython Meetup
 

Mehr von Python Meetup (12)

Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузки
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GIL
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшена
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory management
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкций
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txt
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
 

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

  • 1. ОЧЕРЕДНОЙ СКУЧНЫЙ ДОКЛАД ПРО ЛОГГИРОВАНИЕ Стас Рудаков
  • 2. Эпиграф Невозможно объять необъятное. Козьма Прутков Про логгирование, Стас Рудаков
  • 3. Про что будем говорить? Про логгирование, Стас Рудаков
  • 4. Про что будем говорить? Про логгирование, там же было написано :) Про логгирование, Стас Рудаков
  • 5. Про что будем говорить? Про логгирование, там же было написано :) А именно: зачем; как; проблемы; очевидные пути решения; неочевидные пути решения; open source инструменты. Про логгирование, Стас Рудаков
  • 6. Что вообще значит “записать в лог”? Про логгирование, Стас Рудаков
  • 7. Что вообще значит “записать в лог”? сформировать сообщение Про логгирование, Стас Рудаков
  • 8. Что вообще значит “записать в лог”? сформировать сообщение по некому событию Про логгирование, Стас Рудаков
  • 9. Что вообще значит “записать в лог”? сформировать сообщение по некому событию и, если это сообщение нас вообще интересует, Про логгирование, Стас Рудаков
  • 10. Что вообще значит “записать в лог”? сформировать сообщение по некому событию и, если это сообщение нас вообще интересует, записать или отправить его куда-то, Про логгирование, Стас Рудаков
  • 11. Что вообще значит “записать в лог”? сформировать сообщение по некому событию и, если это сообщение нас вообще интересует, записать или отправить его куда-то, куда имеют доступ заинтересованные лица. Про логгирование, Стас Рудаков
  • 13. Зачем Debug Разбор инцидентов Сбор статистики Средне- и долгосрочный мониторинг Инструмент для службы поддержки пользователей Аналитика Про логгирование, Стас Рудаков
  • 15. Писать логи очень просто 1 import logging 2 3 4 5 6 7 logging . basicConfig ( format = ’ [%( asctime ) s ][%( levelname ) s ][%( name ) s ] %( message ) s ’ , stream = sys . stdout , level = logging . INFO ) 8 9 10 logger = logging . getLogger ( " meetup . python . minsk " ) logger . info ( " Stas has just started the talk on logging " ) Про логгирование, Стас Рудаков
  • 16. Писать логи очень просто 1 import logging 2 3 4 5 6 7 logging . basicConfig ( format = ’ [%( asctime ) s ][%( levelname ) s ][%( name ) s ] %( message ) s ’ , stream = sys . stdout , level = logging . INFO ) 8 9 10 1 logger = logging . getLogger ( " meetup . python . minsk " ) logger . info ( " Stas has just started the talk on logging " ) [2014 -01 -31 06:23:27 ,904][ INFO ][ meetup . python . minsk ] Stas has just started the talk on logging Про логгирование, Стас Рудаков
  • 17. logging: архитектура на пальцах сформировать сообщение по некому событию и, если это сообщение нас вообще интересует, записать или отправить его куда-то, куда имеют доступ заинтересованные лица. Про логгирование, Стас Рудаков
  • 23. Конфигурация 1 2 3 4 5 6 7 8 9 10 11 12 13 CFG = { ’ formatters ’: { ’ simple ’: { ’ format ’: ’ %( asctime ) s %( message ) s ’} ,} , ’ filters ’: { ’ pwd ’: { ’ () ’: ’ proj . PwdFilter ’ , ’ foo ’: ’ bar ’ ,} ,} , ’ handlers ’: { ’ console ’ :{ ’ level ’: ’ DEBUG ’ , ’ class ’: ’ logging . ’ ’ StreamHandler ’ , ’ formatter ’: ’ simple ’} , Про логгирование, Стас Рудаков 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ’ mail_adm ’: { ’ level ’: ’ ERROR ’ , ’ class ’: ’ proj . ’ ’ Admi nEmailHa ndler ’ , ’ filters ’: [ ’ pwd ’ ]} ,} , ’ loggers ’: { ’ ’: { ’ handlers ’: [ ’ console ’] , ’ level ’: ’ INFO ’ , ’ filters ’: [ ’ pwd ’]} , ’ django . request ’: { ’ handlers ’: [ ’ mail_adm ’] , ’ level ’: ’ ERROR ’ , ’ propagate ’: False ,} ,} ,} logging . config . dictConfig ( CFG )
  • 24. tips n tricks: уровни логгирования Про логгирование, Стас Рудаков
  • 25. tips n tricks: уровни логгирования CRITICAL = 50 logger.critical(u’проблема, после которой приложение не может восстановиться без постороннего вмешательства’) Про логгирование, Стас Рудаков
  • 26. tips n tricks: уровни логгирования CRITICAL = 50 logger.critical(u’проблема, после которой приложение не может восстановиться без постороннего вмешательства’) ERROR = 40 logger.error(u’проблема, из-за которой приложение работает не в штатном режиме’) Про логгирование, Стас Рудаков
  • 27. tips n tricks: уровни логгирования CRITICAL = 50 logger.critical(u’проблема, после которой приложение не может восстановиться без постороннего вмешательства’) ERROR = 40 logger.error(u’проблема, из-за которой приложение работает не в штатном режиме’) WARNING = 30 # уровень по умолчанию logger.warning(u’проблема, которая не мешает работе приложения, но на которую стоит обратить внимание’) Про логгирование, Стас Рудаков
  • 28. tips n tricks: уровни логгирования CRITICAL = 50 logger.critical(u’проблема, после которой приложение не может восстановиться без постороннего вмешательства’) ERROR = 40 logger.error(u’проблема, из-за которой приложение работает не в штатном режиме’) WARNING = 30 # уровень по умолчанию logger.warning(u’проблема, которая не мешает работе приложения, но на которую стоит обратить внимание’) INFO = 20 logger.info(u’обычная запись в лог’) Про логгирование, Стас Рудаков
  • 29. tips n tricks: уровни логгирования CRITICAL = 50 logger.critical(u’проблема, после которой приложение не может восстановиться без постороннего вмешательства’) ERROR = 40 logger.error(u’проблема, из-за которой приложение работает не в штатном режиме’) WARNING = 30 # уровень по умолчанию logger.warning(u’проблема, которая не мешает работе приложения, но на которую стоит обратить внимание’) INFO = 20 logger.info(u’обычная запись в лог’) DEBUG = 10 logger.debug(u’логи, которые помогли нам при отладке приложения и которые вряд ли пригодятся в будущем’) Про логгирование, Стас Рудаков
  • 30. tips n tricks: traceback 1 try : 2 do_ s o me t hi n g_ u n sa f e () except Exception as e : logger . exception ( ’ Unexpected exception ’) raise 3 4 5 Про логгирование, Стас Рудаков
  • 31. tips n tricks: traceback 1 try : 2 do_ s o me t hi n g_ u n sa f e () except Exception as e : logger . exception ( ’ Unexpected exception ’) raise 3 4 5 В лог отправится: 1 2 3 4 5 6 7 8 9 [2014 -01 -29 23:35:04 ,393][ examples ][ ERROR ] Unexpected exception Traceback ( most recent call last ) : File " stacktrace1 . py " , line 22 , in < module > d o_ s o me t hi n g_ u n sa f e () File " stacktrace1 . py " , line 18 , in do _ so m e th i ng _ u ns a fe down_rabbit_hole () File " stacktrace1 . py " , line 17 , in down_rabbit_hole sender = message . sender AttributeError : ’ NoneType ’ object has no attribute ’ sender ’ Про логгирование, Стас Рудаков
  • 32. tips n tricks: traceback 1 try : 2 validate_data ( data ) except ValidationError as e : logger . exception ( ’ Validation failed ’) 3 4 А в лог запишется 1 2 3 4 5 6 7 8 9 [2014 -01 -29 08:33:53 ,439][ examples ][ ERROR ] Validation failed Traceback ( most recent call last ) : File " stacktrace2 . py " , line 27 , in < module > validate_data ( data ) File " stacktrace2 . py " , line 22 , in validate_data check_values ( data ) File " stacktrace2 . py " , line 21 , in check_values raise ValidationError ( ’ security key is missing ’) ValidationError : security key is missing Про логгирование, Стас Рудаков
  • 33. tips n tricks: traceback 1 try : 2 validate_data ( data ) except ValidationError as e : logger . exception ( ’ Validation failed ’) 3 4 А в лог запишется 1 2 3 4 5 6 7 8 9 [2014 -01 -29 08:33:53 ,439][ examples ][ ERROR ] Validation failed Traceback ( most recent call last ) : File " stacktrace2 . py " , line 27 , in < module > validate_data ( data ) File " stacktrace2 . py " , line 22 , in validate_data check_values ( data ) File " stacktrace2 . py " , line 21 , in check_values raise ValidationError ( ’ security key is missing ’) ValidationError : security key is missing Но разве уровень ERROR нам подходит? Про логгирование, Стас Рудаков
  • 34. tips n tricks: traceback 1 try : 2 validate_data ( data ) except ValidationError as e : logger . warning ( ’ Validation failed ’ , exc_info = True ) 3 4 Получаем 1 2 3 4 5 6 7 8 9 [2014 -01 -29 08:33:53 ,439][ examples ][ WARNING ] Validation failed Traceback ( most recent call last ) : File " stacktrace2 . py " , line 27 , in < module > validate_data ( data ) File " stacktrace2 . py " , line 22 , in validate_data check_values ( data ) File " stacktrace2 . py " , line 21 , in check_values raise ValidationError ( ’ security key is missing ’) ValidationError : security key is missing Про логгирование, Стас Рудаков
  • 35. tips n tricks: “ленивое” форматирование 1 2 3 logger . info ( ’ Request id =% s message =% r ’ % (100500 , { ’ event ’: ’ meetup ’ }) ) Про логгирование, Стас Рудаков
  • 36. tips n tricks: “ленивое” форматирование 1 2 3 logger . info ( ’ Request id =% s message =% r ’ % (100500 , { ’ event ’: ’ meetup ’ }) ) Зачем форматировать строку, если мы не знаем, попадет ли она в лог? Про логгирование, Стас Рудаков
  • 37. tips n tricks: “ленивое” форматирование 1 2 3 logger . info ( ’ Request id =% s message =% r ’ % (100500 , { ’ event ’: ’ meetup ’ }) ) Зачем форматировать строку, если мы не знаем, попадет ли она в лог? 1 2 3 logger . info ( ’ Request id =% s message =% r ’ , 100500 , { ’ event ’: ’ meetup ’} ) Про логгирование, Стас Рудаков
  • 38. tips n tricks: “ленивое” форматирование 1 2 3 logger . info ( ’ Request id =% s message =% r ’ % (100500 , { ’ event ’: ’ meetup ’ }) ) Зачем форматировать строку, если мы не знаем, попадет ли она в лог? 1 2 3 logger . info ( ’ Request id =% s message =% r ’ , 100500 , { ’ event ’: ’ meetup ’} ) *args работают, **kwargs не работают Про логгирование, Стас Рудаков
  • 39. tips n tricks: ротация в один прекрасный день. . . Про логгирование, Стас Рудаков
  • 40. tips n tricks: ротация в один прекрасный день. . . no space left on device Про логгирование, Стас Рудаков
  • 41. tips n tricks: ротация в один прекрасный день. . . no space left on device from logging.handlers import * 1 2 3 4 5 1 2 3 4 5 Rotating Fi l eH a n dl e r ( filename , mode = ’a ’ , maxBytes =0 , backupCount =0 , encoding = None , delay = False ) $ ls logs meetup . log meetup . log .1 meetup . log .2 meetup . log .3 Про логгирование, Стас Рудаков
  • 42. tips n tricks: ротация в один прекрасный день. . . no space left on device from logging.handlers import * 1 2 3 4 5 1 2 3 4 5 Rotating Fi l eH a n dl e r ( filename , mode = ’a ’ , maxBytes =0 , backupCount =0 , encoding = None , delay = False ) 1 $ ls logs meetup . log meetup . log .1 meetup . log .2 meetup . log .3 1 Про логгирование, Стас Рудаков 2 3 4 5 2 3 4 5 T i m e d Ro t a t i n g F i l e H a n d l e r ( filename , when = ’h ’ , interval =1 , backupCount =0 , encoding = None , delay = False , utc = False ) $ ls logs meetup . log meetup . log .2014 -01 -31 _17 meetup . log .2014 -01 -31 _18 meetup . log .2014 -01 -31 _19
  • 43. tips n tricks: ротация в один прекрасный день. . . no space left on device from logging.handlers import * 1 2 3 4 5 1 2 3 4 5 Rotating Fi l eH a n dl e r ( filename , mode = ’a ’ , maxBytes =0 , backupCount =0 , encoding = None , delay = False ) 1 $ ls logs meetup . log meetup . log .1 meetup . log .2 meetup . log .3 1 2 3 4 5 2 3 4 5 T i m e d Ro t a t i n g F i l e H a n d l e r ( filename , when = ’h ’ , interval =1 , backupCount =0 , encoding = None , delay = False , utc = False ) $ ls logs meetup . log meetup . log .2014 -01 -31 _17 meetup . log .2014 -01 -31 _18 meetup . log .2014 -01 -31 _19 Если варианты выше не подходят, можно использовать утилиту logrotate и 1 Wa tc he dFi le Ha ndl er ( fname , mode = ’a ’ , encoding = None , delay = False ) Про логгирование, Стас Рудаков
  • 45. Sentry - это. . . open source аггрегатор сообщений об ошибках, написанный на Python + Django + Celery, с клиентами для многих языков и платформ. Про логгирование, Стас Рудаков
  • 47. Sentry: как подключить 1 2 3 from raven . handlers . logging import SentryHandler handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ , level = logging . WARNING ) Про логгирование, Стас Рудаков
  • 48. Sentry: как подключить 1 2 3 4 5 from raven . handlers . logging import SentryHandler handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ , level = logging . WARNING ) logger = logging . getLogger ( ’ coffeemaker ’) logger . addHandler ( handler ) Про логгирование, Стас Рудаков
  • 49. Sentry: как подключить 1 2 3 4 5 6 7 from raven . handlers . logging import SentryHandler handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ , level = logging . WARNING ) logger = logging . getLogger ( ’ coffeemaker ’) logger . addHandler ( handler ) logger . warning ( ’ We are running out of milk ’) logger . error ( ’ Not enough milk for a cappuccino ’) Про логгирование, Стас Рудаков
  • 50. Sentry: как подключить 1 2 3 4 5 6 7 from raven . handlers . logging import SentryHandler handler = SentryHandler ( ’ http :// public : secret@example . com /1 ’ , level = logging . WARNING ) logger = logging . getLogger ( ’ coffeemaker ’) logger . addHandler ( handler ) logger . warning ( ’ We are running out of milk ’) logger . error ( ’ Not enough milk for a cappuccino ’) HTTP? Cерьезно? Про логгирование, Стас Рудаков
  • 51. А теперь давайте вспомним, что мы с этими логами собирались делать Debug Разбор инцидентов Про логгирование, Стас Рудаков
  • 52. А теперь давайте вспомним, что мы с этими логами собирались делать Debug Разбор инцидентов Сбор статистики Средне- и долгосрочный мониторинг Инструмент для службы поддержки пользователей Аналитика Про логгирование, Стас Рудаков
  • 53. Назад в будущее Современные вызовы: хотим убедиться, что логи не были модифицированы злоумышленником после взлома; переходим от программ к сложным распределенным системам — хочется иметь логгирование уровня всей системы, а не отдельных приложений; быстрый поиск; метрики. Про логгирование, Стас Рудаков
  • 55. elasticsearch - это. . . распределенный полнотекстовый поисковый движок Про логгирование, Стас Рудаков
  • 56. elasticsearch - это. . . распределенный полнотекстовый поисковый движок c RESTful web-интерфейсом, с документами без схемы и возможностями аггрегации документов. Про логгирование, Стас Рудаков
  • 57. elasticsearch - это. . . распределенный полнотекстовый поисковый движок c RESTful web-интерфейсом, с документами без схемы и возможностями аггрегации документов. Написан на Java с использованием библиотеки Apache Lucene. Используется в Mozilla, GitHub и многих других компаниях (если вам нужно убедить своего менеджера). Про логгирование, Стас Рудаков
  • 58. elasticsearch - это. . . распределенный полнотекстовый поисковый движок c RESTful web-интерфейсом, с документами без схемы и возможностями аггрегации документов. Написан на Java с использованием библиотеки Apache Lucene. Используется в Mozilla, GitHub и многих других компаниях (если вам нужно убедить своего менеджера). Но как связать логгирование и elasticsearch? Про логгирование, Стас Рудаков
  • 61. logstash + elasticsearch + kibana = nice web UI Про логгирование, Стас Рудаков
  • 62. structlog — последний ингридиент 1 2 3 4 5 6 >>> from structlog import get_logger >>> log = get_logger () >>> log = log . bind ( user = ’ anonymous ’ , some_key =23) >>> log = log . bind ( user = ’ hynek ’ , another_key =42) >>> log . info ( ’ user . logged_in ’ , happy = True ) some_key =23 user = ’ hynek ’ another_key =42 happy = True event = ’ user . logged_in ’ http://www.structlog.org/ Про логгирование, Стас Рудаков
  • 63. Что мы не объяли? Syslog Protocol Логи в реляционной базе данных journald logplex, fluentd Агенты для сбора логов Что, собственно, писать в логи. Про логгирование, Стас Рудаков
  • 64. Выводы Батарейка logging вполне подходит для 95% случаев1 . 1 По статистике, не стоит доверять 75% статистики Про логгирование, Стас Рудаков
  • 65. Выводы Батарейка logging вполне подходит для 95% случаев1 . Архитектуры систем логгирования похожи как на микро, так и на макро уровне. 1 По статистике, не стоит доверять 75% статистики Про логгирование, Стас Рудаков
  • 66. Выводы Батарейка logging вполне подходит для 95% случаев1 . Архитектуры систем логгирования похожи как на микро, так и на макро уровне. Open source инструменты помогают выжать из логов очень много полезных свойств. 1 По статистике, не стоит доверять 75% статистики Про логгирование, Стас Рудаков
  • 67. Выводы Батарейка logging вполне подходит для 95% случаев1 . Архитектуры систем логгирования похожи как на микро, так и на макро уровне. Open source инструменты помогают выжать из логов очень много полезных свойств. Я вас всех порядочно утомил. 1 По статистике, не стоит доверять 75% статистики Про логгирование, Стас Рудаков
  • 68. СПАСИБО ЗА ВНИМАНИЕ. ВОПРОСЫ? Стас Рудаков mailto:stas@garage22.net https://raw.github.com/nott/talks/logging.pdf http://docs.python.org/3/library/logging.html http://www.structlog.org/ https://www.getsentry.com/ http://logstash.net/