利用logging 模块输出日志

logging 是python下常用的日志模块,总结一下它的用法。

基本用法

1
2
3
4
5
6
7
8
9
10
#获取logger
logger = logging.getLogger('root')
logger.setLevel(logging.DEBUG)
#设置handler
hd = logging.StreamHandler()
hd.setLevel(logging.DEBUG)
#设置formatter
hd.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.addHandler(hd)
logger.debug('xxxx')

这样就可以将脚本中通过debug出的文字打印在console中了。

logging level

默认系统有6级日志级别:
| level | Numeric Value |
| CRITICAL | 50 |
| ERROR | 40 |
| WARNING | 30 |
| INFO | 20 |
| DEBUG | 10 |
| NOTSET | 0 |
当然也可以自定义日志级别,但是只有高于logger level日志才能输出。一般来说这6级已经够我们用的了。

Handler Object

常用的三种Handler是 SteamHanlder、FileHandler和NullHandler。

StreamHandler

将日志输入到流中,默认的stream是 stderr。上面的示例代码中就是利用stream输出到命令行中。

FileHanlder

将日志输入出到文件中。

NullHandler

什么也不做的处理类

通过文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[loggers]
keys=root,GPServer
[handlers]
keys=stmhandler,flehandler
[formatters]
keys=stmformatter
[logger_root]
level=DEBUG
handlers=stmhandler
[logger_GPServer]
level=DEBUG
handlers=flehandler
qualname=GPServer
propagate=0
[handler_stmhandler]
class=StreamHandler
level=DEBUG
formatter=stmformatter
args=(sys.stderr,)
[handler_flehandler]
class=FileHandler
level=DEBUG
formatter=stmformatter
args=('gps.log',)
[formatter_stmformatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

将logger的参数配置到配置文件中,这里用的是logging.conf文件,你可以随意指定文件名。
然后在代码中使用:

1
2
3
4
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('GPServer')
logger.debug('xxx')
logger.debug('aaa')

需要注意的是getLogger方法默认取的是root这个handler,在我们自定义的handler中要添加qualname=GPServer和propagate=0参数。