在部署工程化的项目时,我们常需要记录日志。logging模块提供了强大的日志记录功能,可用于记录程序报错的信息、自定义的运行记录,还可以在出现指定错误时发邮件报警。
经过简单试用,现总结一下基础用法,后续深入使用后,会继续完善此博客。
1、logging句柄
logging模块中,提供了多种句柄,如:
- StreamHandler
- FileHandler
- BaseRotatingHandler
- RotatingFileHandler
- TimedRotatingFileHandler
- WatchedFileHandler
- SocketHandler
- DatagramHandler
- SysLogHandler
- SMTPHandler
- NTEventLogHandler
- HTTPHandler
- BufferingHandler
- MemoryHandler
- QueueHandler
其中前两个:StreamHandler、FileHandler,属于logging模块下的两个常用句柄,后面的是在logging.handlers里面定义的对应不同需求的句柄。
现在对StreamHandler、FileHandler以及logging.handler里面的SMTPHandler分别进行介绍。
- StreamHandler:将日志信息打印在控制台;
- FileHandler:将日志信息写入文件;
- SMTPHandler:将所需日志信息通过邮件的形式发送到指定邮箱。
各个handler的定义如下所示:
# 控制台handler
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 文件handler
filename = 'logger.log'
fh = logging.FileHandler(filename)
fh.setLevel(logging.DEBUG)
# 邮件handler,使用该handler可以将需要的信息发送到指定邮箱
# 需指定:邮箱服务器、发送人、接收人(多个的话用[]括住)、邮件主题、凭证(tuple格式)
sh = logging.handlers.SMTPHandler("smtp.qq.com", 'XXXXXX@qq.com', 'XXXXXX@163.com',
"logging from my app",
credentials=('邮箱用户名,即@之前的部分', 'SMTP密码'),
secure=())
sh.setLevel(logging.DEBUG)
其中,邮件handler需要指定几个指标,可根据自身需求进行设置,其需要的邮件协议为SMTP,可在相应邮箱设置中开通,并得到自己的密码,通过与邮箱用户名(@之前的部分)进行组合,形成credentials参数。
2、logging日志输出级别
共分为五种,其名称及设定的值如下;
- CRITICAL = 50
- ERROR = 40
- WARNING = 30
- INFO = 20
- DEBUG = 10
- NOTSET = 0
其中,最后一种为默认情况,因为DEBUG为最低级别,所以如果不主动设置,则默认为DEBUG及其以上,也即所有级别。
3、logging模块使用一般步骤
首先,初始化一个logging实例;
其次,构造handler并设置其相应输出级别以及各种配置参数;
然后,将配置好的handler加载到logging实例中;
最后,将需要记录的日志信息输出到相应handler所对应的出口。
现给出一个完整的使用示例:
import logging
logger = logging.getLogger()
try:
logger.handlers.clear()
except:
print('something wrong~')
# 控制台handler
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 文件handler
filename = 'logger.log'
fh = logging.FileHandler(filename)
fh.setLevel(logging.DEBUG)
# 邮件handler,使用该handler可以将需要的信息发送到指定邮箱
# 需指定:邮箱服务器、发送人、接收人(多个的话用[]括住)、邮件主题、凭证(tuple格式)
sh = logging.handlers.SMTPHandler("smtp.qq.com", 'XXXXXX@qq.com', 'XXXXXX@163.com',
"logging from my app",
credentials=('邮箱用户名,即@之前的部分', 'SMTP密码'),
secure=())
sh.setLevel(logging.DEBUG)
# 在这里选择所需handler
handler_dict = {'ch':ch,'fh':fh,'sh':sh}
handler = handler_dict['ch']
# 设置信息格式
formatter = logging.Formatter('\n%(asctime)s %(name)s- %(levelname)s - %(message)s') #定义日志输出格式
handler.setFormatter(formatter)
# 载入handler
logger.addHandler(handler)
# 五种日志记录方式,文件写入只记录warning、error、critical
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
使用上面的测试脚本,可先选定三者之一的handler,然后测试其输出结果。