Python笔记:logging模块使用


import os
import logging
import datetime
from logging.handlers import BaseRotatingHandler

log_base_dir = "./logs"
log_to_file = True

class LogHandler(BaseRotatingHandler):

    def __init__(self, filename, maxbytes=30*1024*1024, mode='a', encoding=None, delay=0):
        if maxbytes > 0:
            mode = 'a'
        self.index = 0
        self.maxBytes = maxbytes
        self.createdate = datetime.datetime.now().strftime("%Y%m%d")
        BaseRotatingHandler.__init__(self, filename, mode, encoding, delay)

    def shouldRollover(self, record):
        if self.stream is None:
            self.stream = self._open()
        if datetime.datetime.now().strftime("%Y%m%d") != self.createdate:
            return 1
        if self.maxBytes > 0:
            msg = "%s\n" % self.format(record)
            self.stream.seek(0, 2)
            if self.stream.tell() + len(msg) >= self.maxBytes:
                return 1
        return 0

    def doRollover(self):
        if self.stream:
            self.stream.close()
            self.stream = None
            dfn = self.baseFilename + '_' + self.createdate + '_' + str(self.index)
            if os.path.exists(self.baseFilename):
                os.rename(self.baseFilename, dfn)
        if not self.delay:
            self.stream = self._open()
        curdate = datetime.datetime.now().strftime("%Y%m%d")
        if curdate == self.createdate:
            self.index += 1
        else:
            self.createdate = curdate
            self.index = 0


class Logger(logging.Logger):

    def findCaller(self):
        f = logging.currentframe()
        if f is not None:
            f = f.f_back
        rv = "(unknown file)", 0, "(unknown function)"
        while hasattr(f, "f_code"):
            co = f.f_code
            filename = os.path.normcase(co.co_filename)
            if 'log_mixin.py' in filename or filename == logging._srcfile :
                f = f.f_back
                continue
            rv = (co.co_filename, f.f_lineno, co.co_name)
            break
        return rv


class LogMixin(object):

    def init_logger(self):
        if hasattr(self.__class__, 'logger_inited'):
            return
        logging.setLoggerClass(Logger)
        if hasattr(self.__class__, "logBaseDir"):
            log_base_name = getattr(self.__class__, "logBaseDir")
        else:
            log_base_name = "default"
        setattr(self.__class__, 'log_base_name', log_base_name)
        log_dir = os.path.abspath(os.path.join(log_base_dir, log_base_name))
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
            os.chmod(log_dir, 0775)

        fmt = "[%(asctime)s-%(levelname)s-%(filename)s-%(lineno)d]-%(message)s"
        fmt = logging.Formatter(fmt)
        level_names = dict(debug=logging.DEBUG,info=logging.INFO,warning=logging.WARNING,error=logging.ERROR)
        for n, l in level_names.items():
            log_name = '%s_%s' % (log_base_name, n)
            logger = logging.getLogger(log_name)
            logger.setLevel(l)
            if log_to_file:
                path = os.path.join(log_dir,"%s.log" % (n))
                handler = LogHandler(path)
            else:
                handler = logging.StreamHandler()
            handler.setFormatter(fmt)
            logger.addHandler(handler)
            setattr(self.__class__, log_name, logger)
        setattr(self.__class__, 'logger_inited',True)

    def get_logger(self, level_name):
        self.init_logger()
        log_base_name = getattr(self.__class__, 'log_base_name')
        logger_name = '%s_%s' % (self.log_base_name, level_name)
        logger = getattr(self.__class__, logger_name)
        return logger

    def log_debug(self, msg, *args, **kwargs):
        self.get_logger('debug').debug(msg, *args, **kwargs)

    def log_info(self,msg,*args,**kwargs):
        self.get_logger('info').info(msg, *args, **kwargs)

    def log_warning(self, msg, *args, **kwargs):
        self.get_logger('warning').warning(msg, *args, **kwargs)

    def log_error(self, msg, *args, **kwargs):
        self.get_logger('error').error(msg, *args, **kwargs)

    def log_exception(self,msg,*args,**kwargs):
        self.get_logger('error').exception(msg, *args, **kwargs)








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值