python的日志模块案例

2020-08-26 17:57:55 浏览数 (1)

//

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文件了。

0 人点赞