Logging日志模块

版本

Python 2.7
Logging 0.5.1.2

简要介绍

Logging日志模块主要有这四部分组成

部分 描述
logger 提供日志接口,在python代码中嵌入,进行配置或发送日志信息
handler 将日志记录按照代码进行存储,如存入文件或者socket中
filter 过滤日志记录后交给handler
formatter 指定日志记录的输出格式

日志输出屏幕

1
2
3
4
5
6
import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=logging.DEBUG)
logging.debug('debug msg')
logging.info('info msg')

直接嵌入在目标代码中,将日志消息发送至屏幕,无需配置handler

日志输出文件

python代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import logging
import logging.handlers
LOG_FILE = 'xxxx.log'
handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024) # 实例化handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S') # 实例化formatter
handler.setFormatter(formatter) # 为handler添加formatter
logger = logging.getLogger('example') # 名为example的logger,如果无参则获取root的logger
logger.addHandler(handler) # 为logger添加handler
logger.setLevel(logging.DEBUG) # 设置日志等级
# 使用StreamHandler输出到屏幕
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
sh.setFormatter(formatter)
logger.addHandler(sh)
logger.info('test') # 会同时输出到文件和屏幕

配置文件实现

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
### logger部分
# 如果name为loggers里面keys的值,则调用对应的配置,如果name没有则调用默认(root)的配置
# name 中用点 . 表示继承关系
# 可以有多个,以逗号隔开
[loggers]
keys=root,xxxlogger
# 实现logger对应的配置信息
# 必须是 logger_name name为loggers中key的值
# level 日志级别,级别有 DEBUG,INFO,WARNING,ERROR,CRITICAL
# handlers 日志处理器,可以有多个 以逗号隔开
# qualname logger的名称,通过logging.getLogger(name)获取,这里的name便是qualname
# 如果获取的logger 名称不存在,则调用默认(root)logger
# propagate 是否继承符类的配置信息,0:否 1:是
[logger_root]
level=debug
handlers=consoleHandler
qualname=root
[logger_xxxlogger]
level=INFO
handlers=consoleHandler,fHandler
qualname=xxxlogger
propagete=0
### handler部分
# 定义handler
[handlers]
keys=consoleHandler,fHandler
# handlers的具体配置实现
# 必须是 handler_name name为handlers中key的值
# class为logging包里面的handler处理器,如果调用其他包的记得补全名字
# formatter 日志输入格式
# args handler相关参数
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,) # 此处务必有','不然会炸
[handler_fHandler]
class=FileHandler
level=INFO
formatter=simpleFormatter
args=('xxxxError.txt','a')
### formatter部分
# 定义日志输出格式
[formatters]
keys=simpleFormatter
[formatter_simpleFormatter]
format=%(levelname)s - %(name)s - %(asctime)s - %(module)s.%(funcName)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

日志的配置通常使用配置文件实现。

1
2
3
4
5
6
7
8
import logging
import logging.config
logging.config.fileConfig('./logging.conf')
logger = logging.getLogger('xxxlogger')
logger.info('hello')

通过fileConfig读取文件配置即可,当然也可以使用 logging.config.dictConfig() ,可以以字典形式读取,十分适合json格式配置的文件.

日志级别

CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
如果设定了日志级别时,输出消息会输出大于等于该级别的日志,小于的级别会省略

常用的Handlers

名称 参数列表 描述
logging.StreamHandler StreamHandler([strm]) strm参数是一个文件对象。使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象输出信息。
logging.FileHandler FileHandler(filename[,mode]) 和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。filename是文件名,必须指定一个文件名。mode是文件的打开方式。默认是’a’,即追加。
logging.handlers.RotatingFileHandler RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]]) 这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出。maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大。backupCount用于指定保留的备份文件的个数,如果超出个数会删除旧文件。
logging.handlers.TimedRotatingFileHandler TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]) 这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。
logging.handlers.SocketHandler TCP协议发送日志
logging.handlers.DatagramHandler UDP协议发送日志
logging.handlers.HTTPHandler HTTP协议发送日志
logging.handlers.SMTPHandler 将日志通过SMTP协议发送邮件

常用的Forrmatters

参数 含义
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息