20151024 Taichung.py 講一些 Python Logging

Preview:

Citation preview

Python Logging

Me?

• == Chen Chun-Chia == CCC

• MitraCloud >>> Python/Django >>> Android

2

• logger, handler

• level, filter, formatter

• config

• logging flow

Python 3.4

4

>>> import logging >>> logging.warning('haha')

WARNING:root:haha

5

>>> import logging >>> logging.warning('haha')

WARNING:root:hahaLog level

6

>>> import logging >>> logging.warning('haha')

WARNING:root:hahaLog message

7

>>> import logging >>> logging.warning('haha')

WARNING:root:haha

Log level

8

>>> import logging >>> logging.warning('haha')

WARNING:root:haha

Log message

9

>>> import logging >>> logging.warning('haha')

WARNING:root:haha

... logger

10

>>> import logging >>> logging.warning('haha')

WARNING:root:haha

IN

OUT

11

Logging

12

Logger Handler

13

Logger Handlerlevel

filter

level

filter

formatter

14

Handler

Logger Handlerlevel

filter

level

filter

formatter

config

Logger

15

level

16

>>> import logging >>> logging.warning('haha')

WARNING:root:haha

Log level

17

level

level ———————

CRITICAL ERROR

WARNING INFO

DEBUG

50 40 30 20 10

18

levellogging.basicConfig(level=logging.ERROR)

logging.critical('critical') logging.error('error') logging.warning('warning') logging.info('info') logging.debug('debug')

CRITICAL:root:critical ERROR:root:error

level ———————

CRITICAL ERROR

WARNING INFO

DEBUG19

levellogging.basicConfig(level=logging.INFO)

logging.critical('critical') logging.error('error') logging.warning('warning') logging.info('info') logging.debug('debug')

CRITICAL:root:critical ERROR:root:error WARNING:root:warning INFO:root:info

level ———————

CRITICAL ERROR

WARNING INFO

DEBUG20

level

level ———————

CRITICAL ERROR

WARNING INFO

DEBUG

level WARNING

21

Logger Handler

Logger Handlerfilter filter

formatter

config

level level

22

Logger

23

getLogger Logger

import logging logging.basicConfig()

logger = logging.getLogger('mylogger')

logger.error('haha')

ERROR:mylogger:haha

24

Logger root

app1 app2

app1.a app1.b app2.c25

Logger root

app1 app2

app1.a app1.b app2.c

import logging logging.basicConfig()

a = logging.getLogger('app1.a') a.error('haha')

ERROR:app1.a:haha

26

Logger root

app1 app2

app1.a app1.b app2.c27

Handler

Logger Handler

Logger filter filter

formatter

config

level level

28

log format

29

formatimport logging logging.basicConfig(format='*** %(message)s ***’)

logging.error('haha')

*** haha ***

30

format

1 2 3 4 5 6 7

import logginglogging.basicConfig( format='%(filename)s:%(lineno)s %(message)s’ )

logging.error('haha')

a.py:7 haha

a.py

31

formatimport logging logging.basicConfig(format='*** %(message)s ***') logging.error('haha')

*** haha ***

32

formatimport logging logging.basicConfig(format='*** %(message)s ***') logging.error('haha')

*** haha ***

33

formatimport logging logging.basicConfig(format='*** %(message)s ***') logging.error('haha')

*** haha ***https://docs.python.org/3.5/library/logging.html#logrecord-attributes

34

Handler

Logger Handler

Logger filter filter

formatter

config

level level

35

log

36

handlerimport logginga = logging.getLogger('mylogger')handler = logging.FileHandler('a.log')a.addHandler(handler)a.error('hahaha')

hahaha

a.log

37

handlerimport logginga = logging.getLogger('mylogger')h1 = logging.FileHandler('1.log') h2 = logging.FileHandler('2.log')

a.addHandler(h1)a.addHandler(h2)a.error('hahaha')

hahaha

1.log

hahaha

2.log

38

handler

StreamHandler DatagramHandlerFileHandler SysLogHandlerNullHandler NTEventLogHandler

WatchedFileHandler SMTPHandlerBaseRotatingHandler MemoryHandlerRotatingFileHandler HTTPHandler

TimedRotatingFileHandler QueueHandlerSocketHandler

https://docs.python.org/3.5/library/logging.handlers.html

39

Handler

Handler

Logger filter filter

formatter

config

level level

Logger

40

handler format

41

formata = logging.getLogger('mylogger')h1 = logging.FileHandler('1.log') h2 = logging.FileHandler('2.log')

h1.setFormatter( logging.Formatter('*** %(message)s ***'))h2.setFormatter( logging.Formatter('%(levelname)s:%(message)s'))

a.addHandler(h1)a.addHandler(h2)a.error('haha')

*** haha ***1.log

ERROR:haha2.log42

Handler

Logger Handler

Logger filter filter

formatter

config

level level

43

level handler

44

levela = logging.getLogger('mylogger')h1 = logging.FileHandler('1.log') h2 = logging.FileHandler('2.log')

h1.setLevel(logging.ERROR)h2.setLevel(logging.WARNING)a.addHandler(h1)a.addHandler(h2)a.error('error')a.warning('warning')

error1.log

error warning

2.log

45

Handler

Logger Handler

Logger filter filter

formatter

config

level level

46

Handler

Logger Handler

Logger filter filter

formatter

config

level level

Logger Handler level

log

47

Filter log

48

Filter class IpFilter(logging.Filter): def filter(self, record): record.ip = '192.168.1.2' return True

logging.basicConfig(format='[%(ip)s] %(message)s')a = logging.getLogger('mylogger')f = IpFilter()a.addFilter(f)a.error('hahaha')

49

record: LogRecord

log log LogRecord

Filter class IpFilter(logging.Filter): def filter(self, record): record.ip = '192.168.1.2' return True

logging.basicConfig(format='[%(ip)s] %(message)s')a = logging.getLogger('mylogger')f = IpFilter()a.addFilter(f)a.error('hahaha')

50

Filter class IpFilter(logging.Filter): def filter(self, record): record.ip = '192.168.1.2' return True

logging.basicConfig(format='[%(ip)s] %(message)s')a = logging.getLogger('mylogger')f = IpFilter()a.addFilter(f)a.error('hahaha')

[192.168.1.2] hahaha

51

Handler

Logger Handler

Loggerformatter

config

level level

filter filter

52

handler ...

53

handler

54

Handler emitclass MyHandler(logging.Handler): def __init__(self, widget): super(MyHandler, self).__init__() self._widget = widget def emit(self, record): msg = self.format(record) cursor = self._widget.textCursor() cursor.insertText(msg) cursor.insertText('\n')

55

QPlainTextEditclass MyHandler(logging.Handler): def __init__(self, widget): super(MyHandler, self).__init__() self._widget = widget def emit(self, record): msg = self.format(record) cursor = self._widget.textCursor() cursor.insertText(msg) cursor.insertText('\n')

PyQt

56

57

app = QApplication(sys.argv)a = logging.getLogger('a')widget = QPlainTextEdit()h = MyHandler(widget)a.addHandler(h)

widget.show()a.error('hihi')a.warning('lol')sys.exit(app.exec_())

Handler

Logger Handler

Loggerformatter

config

level level

filter filter

58

logging ...

59

dict

60

...f = logging.Formatter(‘*** %(name)s:%(message)s ***’)my_handler = logging.FileHandler('a.log')my_handler.setLevel(logging.DEBUG)my_handler.setFormatter(f)a = logging.getLogger('my_logger')a.setLevel(logging.INFO)a.addHandler(my_handler)a.error('error')a.info('info')

61

Dict Loggingf = logging.Formatter(‘*** %(name)s:%(message)s ***’)my_handler = logging.FileHandler('a.log')my_handler.setLevel(logging.DEBUG)my_handler.setFormatter(f)a = logging.getLogger('my_logger')a.setLevel(logging.INFO)a.addHandler(my_handler)a.error('error')a.info('info')

config = { 'version': 1, 'formatters': { 'my_formatter': { 'format': '*** %(name)s:%(message)s ***' }, }, 'handlers': { 'my_handler': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'a.log', 'formatter': 'my_formatter', } }, 'loggers': { 'my_logger': { 'level': 'INFO', 'handlers': ['my_handler'], } },}

62

Dict Loggingf = logging.Formatter(‘*** %(name)s:%(message)s ***’)my_handler = logging.FileHandler('a.log')my_handler.setLevel(logging.DEBUG)my_handler.setFormatter(f)a = logging.getLogger('my_logger')a.setLevel(logging.INFO)a.addHandler(my_handler)a.error('error')a.info('info')

config = { 'version': 1, 'formatters': { 'my_formatter': { 'format': '*** %(name)s:%(message)s ***' }, }, 'handlers': { 'my_handler': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'a.log', 'formatter': 'my_formatter', } }, 'loggers': { 'my_logger': { 'level': 'INFO', 'handlers': ['my_handler'], } },}

from logging.config import dictConfig

dictConfig(config)

63

...

from logging.config import dictConfig

dictConfig(config) a = logging.getLogger('my_logger')a.error('error')a.info('info')

64

65

...f = logging.Formatter(‘*** %(name)s:%(message)s ***’)my_handler = logging.FileHandler('a.log')my_handler.setLevel(logging.DEBUG)my_handler.setFormatter(f)a = logging.getLogger('my_logger')a.setLevel(logging.INFO)a.addHandler(my_handler)a.error('error')a.info('info')

66

loggingf = logging.Formatter(‘*** %(name)s:%(message)s ***’)my_handler = logging.FileHandler('a.log')my_handler.setLevel(logging.DEBUG)my_handler.setFormatter(f)a = logging.getLogger('my_logger')a.setLevel(logging.INFO)a.addHandler(my_handler)a.error('error')a.info('info')

[formatters]keys=my_formatter[handlers]keys=my_handler[loggers]keys=root,my_logger

[formatter_my_formatter]format=*** %(name)s:%(message)s ***[handler_my_handler]level=DEBUGclass=FileHandlerformatter=my_formatterargs=('a.log',)[logger_my_logger]level=INFOhandlers=my_handlerqualname=my_logger[logger_root]handlers=

my_logging.cfg

67

loggingf = logging.Formatter(‘*** %(name)s:%(message)s ***’)my_handler = logging.FileHandler('a.log')my_handler.setLevel(logging.DEBUG)my_handler.setFormatter(f)a = logging.getLogger('my_logger')a.setLevel(logging.INFO)a.addHandler(my_handler)a.error('error')a.info('info')

[formatters]keys=my_formatter[handlers]keys=my_handler[loggers]keys=root,my_logger

[formatter_my_formatter]format=*** %(name)s:%(message)s ***[handler_my_handler]level=DEBUGclass=FileHandlerformatter=my_formatterargs=('a.log',)[logger_my_logger]level=INFOhandlers=my_handlerqualname=my_logger[logger_root]handlers=

my_logging.cfg

from logging.config import fileConfig

fileConfig('my_logging.cfg')

68

...

from logging.config import fileConfig

fileConfig('my_logging.cfg') a = logging.getLogger('my_logger')a.error('error')a.info('info')

69

70

%(xxx)s defaults

71

[formatters]keys=my_formatter[handlers]keys=my_handler[loggers]keys=root,my_logger

[formatter_my_formatter]format=*** %(name)s:%(message)s ***[handler_my_handler]level=DEBUGclass=FileHandlerformatter=my_formatterargs=('a.log',)[logger_my_logger]level=INFOhandlers=my_handlerqualname=my_logger[logger_root]handlers=

72

[formatters]keys=my_formatter[handlers]keys=my_handler[loggers]keys=root,my_logger

[formatter_my_formatter]format=*** %(name)s:%(message)s ***[handler_my_handler]level=DEBUGclass=FileHandlerformatter=my_formatterargs=('%(my_log_file)s',)[logger_my_logger]level=INFOhandlers=my_handlerqualname=my_logger[logger_root]handlers=

%(xxx)s

73

[formatters]keys=my_formatter[handlers]keys=my_handler[loggers]keys=root,my_logger

[formatter_my_formatter]format=*** %(name)s:%(message)s ***[handler_my_handler]level=DEBUGclass=FileHandlerformatter=my_formatterargs=('%(my_log_file)s',)[logger_my_logger]level=INFOhandlers=my_handlerqualname=my_logger[logger_root]handlers=

fileConfig( 'my_logging.cfg', defaults={'my_log_file': 'a.log'} )

defaults

74

...

75

basicConfig

76

basicConfig

StreamHandler + default Formatter

root logger

level, format, filename, …

77

basicConfig

logging.basicConfig(level=logging.ERROR)

level

logging.basicConfig(format='*** %(message)s ***')

format

logging.basicConfig(filename='a.log')

filename

78

basicConfig

logging.basicConfig( level=logging.ERROR, format='*** %(message)s ***', filename='a.log' )

level format filename

79

Handler

Logger Handlerlevel

filter

level

filter

formatter

config

Logger

80

logging log

81

LogRecord

logger.info('xxx') logger

level

logger filter

record

YES

YES

NO

NObye

bye

handler

YESbye bye

NO

parent logger

YES

NO logger

propagate parent logger

82

YES

handler

YES logger

propagate

YES

NObye

YES

NObye

handler

level

handler filter

record

83

https://docs.python.org/3.5/howto/logging.html#logging-flow

84

Basic Tutorial & Advanced Tutorial https://docs.python.org/3.5/howto/logging.html

Logging Cookbook https://docs.python.org/3.5/howto/logging-cookbook.html

Python Library Document https://docs.python.org/3.5/library/logging.html

85

Thank You

Recommended