py的logging模块
谨记提醒自己:不止要知道用法,还要理解清楚为什么。
logging可以使用配置的选项logger、handler、formater。
一.logger:是logging的主体。 1.为程序提供记录日志的接口。 2.判断日志所处级别,并判断是否要过滤。 3.根据日志级别将日志分发给不同的handler。 常用函数: logger.setlevel() 设置日志级别。 logger.addhandler()和logger.removehandler() 添加和删除一个handler。 logger.addfilter() 添加一个filter。
二.handler:基于日志级别对日志进行分发,如设置warning级别的handler只会处理warning及以上级别的日志。 例如:可以将一个应用所有的日志打印到文件中,error及以上的打印到屏幕,critical级别的日志发邮件。 常用函数: setlevel() 设置级别。 setformatter() 设置格式。
三.formatter:配置日志格式,参数是日志格式fmt和时间格式datefmt。
关于常用handlers 1.StreamHandler:流handler,能将日志输出到sys.stdout,sys.stderr或者文件对象。 2.Filehadnler:继承自StreamHandler,将日志信息输出到磁盘文件。 3.NullHandler:空操作handler。 4.WatchedFileHandler:位于logging.handlers模块中。用于监视文件的状态,如果文件被改变了,那么就关闭当前流,重新打开文件,创建一个新的流。由于newsyslog或者logrotate的使用会导致文件改变。这个handler是专门为linux/unix系统设计的,因为在windows系统下,正在被打开的文件是不会被改变的。 5.RotatingFileHandler:位于logging.handlers支持循环日志文件。 6.TimedRotatingFileHandler:定时循环日志handler,位于logging.handlers,支持生成新日志文件。
注:经常使用的handlers,StreamHandler、Filehadnler。
为了让日志能够保证捕获到正常的信息,需要定义好哪些日志往哪输出。在Linux里,有三种方式:标准输入、标准输出、标准错误。logging模块需要定义好对应的输出方式,才能更好的捕获到对应的输出。 例如:
logger 的定义
[loggers] keys=root,basicsLogger
[logger_root] level=INFO handlers=infoHandler,errorHandler,fileHandler
[logger_basicsLogger] level=INFO handlers=infoHandler,errorHandler,fileHandler qualname=basicsLogger propagate=0
handler 的定义
[handlers] keys=infoHandler,errorHandler,fileHandler
[handler_infoHandler] class=StreamHandler level=INFO formatter=basicsFormatter args=(sys.stdout,)
[handler_errorHandler] class=StreamHandler level=ERROR formatter=basicsFormatter args=(sys.stderr,)
[handler_fileHandler] class=FileHandler level=INFO formatter=basicsFormatter args=('/data/home/user00/Initialization.log','a')
formatter 的定义
[formatters] keys=basicsFormatter
[formatter_basicsFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=
其中两个handler:handler_infoHandler、handler_errorHandler,一个定义了INFO级别以上的都输出到标准输出,一个定义ERROR级别以上的都输出到标准错误。这样就可以正确的捕获错误异常。