20151024 taichung.py 講一些 python logging

86
拻Ӟ犚 Python Logging 檔狎

Upload: chun-chia-chen

Post on 13-Apr-2017

393 views

Category:

Software


2 download

TRANSCRIPT

Page 1: 20151024 Taichung.py 講一些 Python Logging

Python Logging

Page 2: 20151024 Taichung.py 講一些 Python Logging

Me?

• == Chen Chun-Chia == CCC

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

2

Page 3: 20151024 Taichung.py 講一些 Python Logging

• logger, handler

• level, filter, formatter

• config

• logging flow

Page 4: 20151024 Taichung.py 講一些 Python Logging

Python 3.4

4

Page 5: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:haha

5

Page 6: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:hahaLog level

6

Page 7: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:hahaLog message

7

Page 8: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:haha

Log level

8

Page 9: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:haha

Log message

9

Page 10: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:haha

... logger

10

Page 11: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:haha

IN

OUT

11

Page 12: 20151024 Taichung.py 講一些 Python Logging

Logging

12

Page 13: 20151024 Taichung.py 講一些 Python Logging

Logger Handler

13

Page 14: 20151024 Taichung.py 講一些 Python Logging

Logger Handlerlevel

filter

level

filter

formatter

14

Page 15: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handlerlevel

filter

level

filter

formatter

config

Logger

15

Page 16: 20151024 Taichung.py 講一些 Python Logging

level

16

Page 17: 20151024 Taichung.py 講一些 Python Logging

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

WARNING:root:haha

Log level

17

Page 18: 20151024 Taichung.py 講一些 Python Logging

level

level ———————

CRITICAL ERROR

WARNING INFO

DEBUG

50 40 30 20 10

18

Page 19: 20151024 Taichung.py 講一些 Python Logging

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

Page 20: 20151024 Taichung.py 講一些 Python Logging

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

Page 21: 20151024 Taichung.py 講一些 Python Logging

level

level ———————

CRITICAL ERROR

WARNING INFO

DEBUG

level WARNING

21

Page 22: 20151024 Taichung.py 講一些 Python Logging

Logger Handler

Logger Handlerfilter filter

formatter

config

level level

22

Page 23: 20151024 Taichung.py 講一些 Python Logging

Logger

23

Page 24: 20151024 Taichung.py 講一些 Python Logging

getLogger Logger

import logging logging.basicConfig()

logger = logging.getLogger('mylogger')

logger.error('haha')

ERROR:mylogger:haha

24

Page 25: 20151024 Taichung.py 講一些 Python Logging

Logger root

app1 app2

app1.a app1.b app2.c25

Page 26: 20151024 Taichung.py 講一些 Python Logging

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

Page 27: 20151024 Taichung.py 講一些 Python Logging

Logger root

app1 app2

app1.a app1.b app2.c27

Page 28: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handler

Logger filter filter

formatter

config

level level

28

Page 29: 20151024 Taichung.py 講一些 Python Logging

log format

29

Page 30: 20151024 Taichung.py 講一些 Python Logging

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

logging.error('haha')

*** haha ***

30

Page 31: 20151024 Taichung.py 講一些 Python Logging

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

Page 32: 20151024 Taichung.py 講一些 Python Logging

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

*** haha ***

32

Page 33: 20151024 Taichung.py 講一些 Python Logging

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

*** haha ***

33

Page 34: 20151024 Taichung.py 講一些 Python Logging

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

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

34

Page 35: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handler

Logger filter filter

formatter

config

level level

35

Page 36: 20151024 Taichung.py 講一些 Python Logging

log

36

Page 37: 20151024 Taichung.py 講一些 Python Logging

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

hahaha

a.log

37

Page 38: 20151024 Taichung.py 講一些 Python Logging

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

Page 39: 20151024 Taichung.py 講一些 Python Logging

handler

StreamHandler DatagramHandlerFileHandler SysLogHandlerNullHandler NTEventLogHandler

WatchedFileHandler SMTPHandlerBaseRotatingHandler MemoryHandlerRotatingFileHandler HTTPHandler

TimedRotatingFileHandler QueueHandlerSocketHandler

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

39

Page 40: 20151024 Taichung.py 講一些 Python Logging

Handler

Handler

Logger filter filter

formatter

config

level level

Logger

40

Page 41: 20151024 Taichung.py 講一些 Python Logging

handler format

41

Page 42: 20151024 Taichung.py 講一些 Python Logging

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

Page 43: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handler

Logger filter filter

formatter

config

level level

43

Page 44: 20151024 Taichung.py 講一些 Python Logging

level handler

44

Page 45: 20151024 Taichung.py 講一些 Python Logging

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

Page 46: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handler

Logger filter filter

formatter

config

level level

46

Page 47: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handler

Logger filter filter

formatter

config

level level

Logger Handler level

log

47

Page 48: 20151024 Taichung.py 講一些 Python Logging

Filter log

48

Page 49: 20151024 Taichung.py 講一些 Python Logging

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

Page 50: 20151024 Taichung.py 講一些 Python Logging

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

Page 51: 20151024 Taichung.py 講一些 Python Logging

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

Page 52: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handler

Loggerformatter

config

level level

filter filter

52

Page 53: 20151024 Taichung.py 講一些 Python Logging

handler ...

53

Page 54: 20151024 Taichung.py 講一些 Python Logging

handler

54

Page 55: 20151024 Taichung.py 講一些 Python Logging

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

Page 56: 20151024 Taichung.py 講一些 Python Logging

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

Page 57: 20151024 Taichung.py 講一些 Python Logging

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_())

Page 58: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handler

Loggerformatter

config

level level

filter filter

58

Page 59: 20151024 Taichung.py 講一些 Python Logging

logging ...

59

Page 60: 20151024 Taichung.py 講一些 Python Logging

dict

60

Page 61: 20151024 Taichung.py 講一些 Python Logging

...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

Page 62: 20151024 Taichung.py 講一些 Python Logging

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

Page 63: 20151024 Taichung.py 講一些 Python Logging

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

Page 64: 20151024 Taichung.py 講一些 Python Logging

...

from logging.config import dictConfig

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

64

Page 65: 20151024 Taichung.py 講一些 Python Logging

65

Page 66: 20151024 Taichung.py 講一些 Python Logging

...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

Page 67: 20151024 Taichung.py 講一些 Python Logging

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

Page 68: 20151024 Taichung.py 講一些 Python Logging

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

Page 69: 20151024 Taichung.py 講一些 Python Logging

...

from logging.config import fileConfig

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

69

Page 70: 20151024 Taichung.py 講一些 Python Logging

70

Page 71: 20151024 Taichung.py 講一些 Python Logging

%(xxx)s defaults

71

Page 72: 20151024 Taichung.py 講一些 Python Logging

[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

Page 73: 20151024 Taichung.py 講一些 Python Logging

[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

Page 74: 20151024 Taichung.py 講一些 Python Logging

[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

Page 75: 20151024 Taichung.py 講一些 Python Logging

...

75

Page 76: 20151024 Taichung.py 講一些 Python Logging

basicConfig

76

Page 77: 20151024 Taichung.py 講一些 Python Logging

basicConfig

StreamHandler + default Formatter

root logger

level, format, filename, …

77

Page 78: 20151024 Taichung.py 講一些 Python Logging

basicConfig

logging.basicConfig(level=logging.ERROR)

level

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

format

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

filename

78

Page 79: 20151024 Taichung.py 講一些 Python Logging

basicConfig

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

level format filename

79

Page 80: 20151024 Taichung.py 講一些 Python Logging

Handler

Logger Handlerlevel

filter

level

filter

formatter

config

Logger

80

Page 81: 20151024 Taichung.py 講一些 Python Logging

logging log

81

Page 82: 20151024 Taichung.py 講一些 Python Logging

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

Page 83: 20151024 Taichung.py 講一些 Python Logging

YES

handler

YES logger

propagate

YES

NObye

YES

NObye

handler

level

handler filter

record

83

Page 84: 20151024 Taichung.py 講一些 Python Logging

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

84

Page 85: 20151024 Taichung.py 講一些 Python Logging

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

Page 86: 20151024 Taichung.py 講一些 Python Logging

Thank You