20151024 taichung.py 講一些 python logging
TRANSCRIPT
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