//
python的日志模块案例
//
这两天在看python核心技术与实战这个公开课,有些内容讲的挺好的,拿出来分享一下。今天主要来看看python的日志模块,在python中,使用logging模块来写日志,常见的logging等级如下:
代码语言:javascript复制[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的模块包含如下类型:
代码语言:javascript复制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支持循环日志文件,
代码语言:javascript复制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都不会发生。
根据上面的日志模式,封装了一个自己的日志模块,是在上述模块的基础上做的继承,如下:
代码语言:javascript复制# 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的方式来写日志,将日志写入到文件中。
引用这个模块的时候,使用方法如下:
代码语言:javascript复制# 添加当前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文件了。