logging模块
logging模块用于日志的打印记录等,是一个健壮的Python程序所必须具有的模块。
logging模块支持的日志级别主要有五种:DEBUG,INFO,WARNING,ERROR,CRITICAL。优先级为:CRITICAL(50) > ERROR(40) > WARNING(30) > INFO(20) > DEBUG(10) 。 默认的级别为WARNING。Python只会打印比当前级别高的日志,比如我同时刷出了INFO和ERROR级别的日志,如果我的日志级别设置的为WAIRNING,那么只会打印ERROR的日志。
基本使用
引入logging模块,通过logging.级别来输出日志信息
1
2
3
4
5
6
7
|
import logging logging.debug( 'debug level message' ) logging.info( 'info level message' ) logging.warning( 'warning level message' ) logging.error( 'error level message' ) logging.critical( 'crtical level message' ) |
注意:由于默认级别为WARNING,所以上面的例子只会打印WARNING、ERROR、CRITICAL输出的信息
定义日志格式并输出到文件
logging提供了基础的日志模版,可以定义日志的输出格式,以及输出位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import logging logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s' , datefmt = '%Y-%m-%d %H:%M:%S' , filename = 'log.log' , filemode = 'w' ) logging.debug( 'debug level message' ) logging.info( 'info level message' ) logging.warning( 'warning level message' ) logging.error( 'error level message' ) logging.critical( 'crtical level message' ) |
basicConfig支持的参数含义为:
- level:为日志级别,可选参数有logging.DEBUG,logging.INFO,logging.WARNING,logging.ERROR,logging.CRITICAL,分别对应logging的五种日志级别。
- filename: 表示日志文件的名称及路径。
- filemode: 表示日志文件的打开模式,默认不指定的情况下为a,可以改为w。
- datefmt: 对时间进行格式定制,和时间的格式化字符是相同的。
- format: 对日志格式进行定义。
1 %(name)s # Logger的名字 2 %(levelno)s # 数字形式的日志级别 3 %(levelname)s # 文本形式的日志级别 4 %(pathname)s # 调用日志输出函数的模块的完整路径名,可能没有 5 %(filename)s # 调用日志输出函数的模块的文件名 6 %(module)s # 调用日志输出函数的模块名 7 %(funcName)s # 调用日志输出函数的函数名 8 %(lineno)d # 调用日志输出函数的语句所在的代码行 9 %(created)f # 当前时间,用UNIX标准的表示时间的浮 点数表示 10 %(relativeCreated)d # 输出日志信息时的,自Logger创建以 来的毫秒数 11 %(asctime)s # 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 12 %(thread)d # 线程ID。可能没有 13 %(threadName)s # 线程名。可能没有 14 %(process)d # 进程ID。可能没有 15 %(message)s # 用户输出的消息
多模块利用logging记录日志
我们可以把logging写到一个模块中,然后在需要记录的地方,导入模块,记录信息即可。
# writelog模块文件: import logging logging.basicConfig(level=logging.WARNING, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', filename='log.log', filemode='a') # 需要记录日志的py文件 import writelog writelog.logging.debug('debug level message') writelog.logging.info('info level message') writelog.logging.warning('warning level message') writelog.logging.error('error level message') writelog.logging.critical('crtical level message')
更复杂的日志配置
在进行配置之前需要先了解logging模块中高级部分的几个概念,即Logger、Handler 及 Formatter。
- Logger:日志记录器,是应用程序中能直接使用的接口
- Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久
- Formatter:格式化,用以配置日志的输出格式
在典型的使用场景中,一个日志记录器使用一个日志处理器,一个日志处理器使用一个日志格式化。
PS:对于比较复杂的项目,我们可以将日志的配置保存到一个配置文件中,然后在代码中使用fileConfig函数来读取配置文件。
# 日志配置文件logging.cnf [loggers] keys = root [handlers] keys = logfile [formatters] keys = generic [logger_root] handlers = logfile [handler_logfile] class = handlers.TimeRotatingFileHandler args = ('app.log','midnight',1,10) level = DEBUG formater = generic [formatter_generic] format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s
在这个日志配置文件中,我们首先在[loggers]中声明一个名为root的logger,在[handlers]中声明一个名为logfile的handler,并在[formatters]中声明一个名为generic的formatter。然后我们在[logger_root]中定义root这个logger所使用的handler,在[handler_logfile]中定义handler输出日志的方式、日志文件的切换时间等,最后在[formatter_generic]中定义了日志的格式,包括日志的产生时间、日志级别、产生日志的文件名以及行号的信息。
有了配置文件,那么我们只需要使用logConfig函数进行配置的加载,然后就可以记录日志了。
import logging.config logging.config.fileConfig('logging.cnf') # 加载配置文件 logging.debug('this is debg') logging.info('this is info') logging.warning('this is warn') logging.error('this is err') logging.critical('this is cri')