python的日志模块案例
作者:快盘下载 人气://
python的日志模块案例
//
这两天在看python核心技术与实战这个公开课,有些内容讲的挺好的,拿出来分享一下。今天主要来看看python的日志模块,在python中,使用logging模块来写日志,常见的logging等级如下:
[root@VM-0-14-centos ~]# python Python 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import logging >>> logging.debug('aaa') >>> logging.info('bbb') >>> logging.warning('ccc') WARNING:root:ccc >>> logging.error('ddd') ERROR:root:ddd >>> logging.critical('eee') CRITICAL:root:eee
默认的日志等级有:debug、info、warning、error、critical这几个等级,其中root logger的level是logging.WARNING,低于该级别的就不输出了,所以上面的例子中,我们只看到warning以上的log等级才输出了我们想要的内容。
常见的logging的模块包含如下类型:
logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件 logging.FileHandler: 日志输出到文件 日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler logging.handlers.BaseRotatingHandler logging.handlers.RotatingFileHandler logging.handlers.TimedRotatingFileHandler logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets logging.handlers.DatagramHandler: 远程输出日志到UDP sockets logging.handlers.SMTPHandler: 远程输出日志到邮件地址 logging.handlers.SysLogHandler: 日志输出到syslog logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志 logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器
今天我们介绍RotatingFileHandler模块的一个例子
它位于logging.handlers支持循环日志文件,
class logging.handlers.RotatingFileHandler( filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
其中:
参数maxBytes:
当文件大小达到或者超过maxBytes时,就会新创建一个日志文件。
参数backupCount:
backupcount是备份数目,也就是最多能有多少个备份。命名会在日志的base_name后面加上.0-.n的后缀,如example.log.0,example.log.1,以此类推
上述的这两个参数任意一个为0时,rollover都不会发生。
根据上面的日志模式,封装了一个自己的日志模块,是在上述模块的基础上做的继承,如下:
# encoding: utf-8 #引入python的日志模块 import logging from logging.handlers import RotatingFileHandler class MYLogger(object): level_relations = { 'debug':logging.DEBUG, 'info':logging.INFO, 'warning':logging.WARNING, 'error':logging.ERROR, 'crit':logging.CRITICAL } #日志级别关系映射 def __init__(self, log_filename, log_path="/var/log/", log_level="info", fmt='%(asctime)s %(name)s[%(process)d] %(levelname)s: %(message)s', max_bytes=10485760, backup_count=99, stdfile=True, stdout=F alse): self.logger = logging.getLogger(log_filename.split(".")[0]) format_str = logging.Formatter(fmt)#设置日志格式 self.logger.setLevel(self.level_relations.get(log_level.lower()))#设置日志级别 if stdout: stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler.setFormatter(format_str) self.logger.addHandler(stdout_handler) if stdfile: file_handler = RotatingFileHandler(log_path+log_filename, 'a', max_bytes, backup_count) file_handler.setFormatter(format_str) self.logger.addHandler(file_handler) if __name__ == '__main__': testlog = MYLogger(log_filename="testlog.log", stdout=True) testlog.logger.debug('debug test') testlog.logger.info('info test') testlog.logger.warning('warning test') testlog.logger.error('error test') testlog.logger.critical('critical test')
其中__init__方法是类的构造函数,默认选择stdfile的方式来写日志,将日志写入到文件中。
引用这个模块的时候,使用方法如下:
# 添加当前MYLogger类所在的路径 sys.path.append("/data/mysql_workdir/dba/scripts/") # 引入MYLogger这个类 from MYLOG import MYLogger # 传入参数,初始化一个类的对象 MYLOGGER = MYLogger(log_filename="args_error.log", log_path="/data/mysql_workdir/dba/log/") # 调用方法 MYLOGGER.logger.error(str1) MYLOGGER.logger.info(str2)
这样就可以在我们的文件中调用日志模块,来将日志写入log文件了。
加载全部内容