前一段工做的时候用到了python写后台系统,须要把一些系统的行为记录下来。本着不要去重复发明轮子的精神,就去搜索了一下python的系统库自己是否有写日志的模块。果真有。python语言做为一门接口简单,标准库强大的语言,果真没有令我失望。python
python的标准库里的日志系统从Python2.3开始支持。只要import logging这个模块便可使用。若是你想把日志写入指定的一个文件中,只要这样使用:网络
import logging logging.basicConfig(filename='example.log',level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this %s %d, too','123',1)
basicConfig是指定文件的路径和日志的级别。socket
日志一共分红5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL。这5个等级,也分别对应5种打日志的方法: debug info ,warning error critical。这5种方法都是相似C语言的printf的方法。 在basicConfig中设置的是日志的最低级别,换句话说,在程序中,只有使用了更高等级的日志信息才会打印出来。 好比你设置的日志级别是logging.INFO, 那么只有使用info, warning, error, critical这4种方法日志才会被记录下来,debug的日志将会被忽略。函数
用上面的方法,简单的日志就能够被打印出来了。不过logging模块的功能很是强大,你还能够经过更加自由的接口,自定义出更复杂的日志形式。须要用到下面3种对象:this
logger formatter handler .spa
logger对象直接提供日志接口。formatter描述日志的格式。handler把日志写到不一样的地方,你能够把日志保存成本地文件,也能够每一个小时写一个日志文件,还能够把日志经过socket传到别的机器上。debug
从最简单的formatter对象来看。formatter指定的是每一条日志记录的抬头信息,也就是你能够指定日志记录的时间格式、进程号、文件名、函数名等信息。能够用这个方法来建立一个formatter对象:日志
fmt参数指定进程号、文件名、函数名等信息是否出现以及格式, datefmt为日期时间格式,默认的日期格式精确到微秒,例如‘2003-07-08 16:49:45,896’。fmt中能够指定多个字段,每一个字段的格式为“%(<dictionary key>)s”, 例如你想打印时间、日志级别、日志信息能够用下面的format:code
'%(asctime)s - %(levelname)s - %(message)s'
全部的可使用的字段以下表:orm
经过handler对象能够把日志内容写到不一样的地方。好比简单的StreamHandler就是把日志写到相似文件的地方。python提供了十几种实用handler,比较经常使用和比较有意思的我列举一下:
StreamHandler 写入类文件的流。
BaseRotatingHandler 能够按时间写入到不一样的日志中。好比将日志按天写入不一样的日期结尾的文件文件。
SocketHandler 用TCP网络链接写LOG
DatagramHandler 用UDP网络链接写LOG
SMTPHandler 把LOG写成EMAIL邮寄出去
等等
简单的例子来讲明下 formatter handler logger 3个对象之间的交互吧。
#!/usr/bin/python #coding: utf-8 import logging import logging.handlers logger = logging.getLogger() logger.setLevel(logging.DEBUG) rh=logging.handlers.TimedRotatingFileHandler('loggertester','D') fm=logging.Formatter("%(asctime)s %(levelname)s - %(message)s","%Y-%m-%d %H:%M:%S") rh.setFormatter(fm) logger.addHandler(rh) debug=logger.debug info=logger.info warn=logger.warn error=logger.error critical=logger.critical info("testlog1") warn("warn you %s","costaxu") critical("it is critical")