美文网首页
python使用logging规范的日志配置代码

python使用logging规范的日志配置代码

作者: Challis | 来源:发表于2020-06-30 23:40 被阅读0次
    #! /usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import os
    
    import logging
    
    from logging.handlers import TimedRotatingFileHandler
    
    # 日志级别
    CRITICAL = 50
    FATAL = CRITICAL
    ERROR = 40
    WARNING = 30
    WARN = WARNING
    INFO = 20
    DEBUG = 10
    NOTSET = 0
    
    CURRENT_PATH = os.path.abspath(".")
    LOG_PATH = os.path.join(CURRENT_PATH, 'log')
    if not os.path.exists(LOG_PATH):
        os.makedirs(LOG_PATH)
    
    
    class LogHandler(logging.Logger):
        """
        LogHandler
        """
    
        def __init__(self, name, level=DEBUG, stream=True, file=True):
            self.name = name
            self.level = level
            logging.Logger.__init__(self, self.name, level=level)
            if stream:
                self.__setStreamHandler__()
            if file:
                self.__setFileHandler__()
    
        def __setFileHandler__(self, level=None):
            """
            set file handler
            :param level:
            :return:
            """
            file_name = os.path.join(LOG_PATH, '{name}.log'.format(name=self.name))
            # 设置日志回滚, 保存在log目录, 一天保存一个文件, 保留15天
            file_handler = TimedRotatingFileHandler(filename=file_name, when='D', interval=1, backupCount=15)
            file_handler.suffix = '%Y-%m-%d.log'
            if not level:
                file_handler.setLevel(self.level)
            else:
                file_handler.setLevel(level)
            formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s:  %(message)s')
    
            file_handler.setFormatter(formatter)
            self.file_handler = file_handler
            self.addHandler(file_handler)
    
        def __setStreamHandler__(self, level=None):
            """
            set stream handler
            :param level:
            :return:
            """
            stream_handler = logging.StreamHandler()
            formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s:  %(message)s')
            stream_handler.setFormatter(formatter)
            if not level:
                stream_handler.setLevel(self.level)
            else:
                stream_handler.setLevel(level)
            self.addHandler(stream_handler)
    
        def resetName(self, name):
            """
            reset name
            :param name:
            :return:
            """
            self.name = name
            self.removeHandler(self.file_handler)
            self.__setFileHandler__()
    

    真正完整版按照时间午夜分割的日志系统

    #! /usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import os
    from datetime import datetime
    import time
    import logging
    from logging.handlers import BaseRotatingHandler
    
    # 选择log需要存的地址
    base_dir = "/root/log"
    
    class LogHandler(logging.Logger):
        """
        LogHandler
        """
    
        def __init__(self, name, level=logging.DEBUG, stream=True, file=True):
            self.name = name
            self.level = level
            logging.Logger.__init__(self, self.name, level=level)
            if stream:
                self.__setStreamHandler__()
            if file:
                self.__setFileHandler__()
    
        def __setFileHandler__(self, level=None):
            """
            set file handler
            :param level:
            :return:
            """
            log_dir = os.path.join(base_dir, self.name)
            if not os.path.exists(log_dir):
                os.makedirs(log_dir)
            file_handler = DailyRotatingFileHandler(log_dir)
            if not level:
                file_handler.setLevel(self.level)
            else:
                file_handler.setLevel(level)
            formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s:  %(message)s')
    
            file_handler.setFormatter(formatter)
            self.file_handler = file_handler
            self.addHandler(file_handler)
    
        def __setStreamHandler__(self, level=None):
            """
            set stream handler
            :param level:
            :return:
            """
            stream_handler = logging.StreamHandler()
            formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s:  %(message)s')
            stream_handler.setFormatter(formatter)
            if not level:
                stream_handler.setLevel(self.level)
            else:
                stream_handler.setLevel(level)
            self.addHandler(stream_handler)
    
        def resetName(self, name):
            """
            reset name
            :param name:
            :return:
            """
            self.name = name
            self.removeHandler(self.file_handler)
            self.__setFileHandler__()
    
    
    
    class DailyRotatingFileHandler(BaseRotatingHandler):
        def __init__(self, path):
            self.log_dir = path
            filename = self.current_log_file()
            super().__init__(filename, 'a', encoding="utf-8")
            # 做个缓存,提升一下日志的速率
            self.last_check = None
    
        def current_log_file(self, create_dir=False):
            date = datetime.now().strftime('%Y-%m-%d')
            import os
            log_name = date + ".log"
            log_path = os.path.join(self.log_dir, log_name)
            return log_path
    
        def shouldRollover(self, record):
            now = time.monotonic()
            # 60s 内只检查一次
            if self.last_check is None or now - self.last_check > 60:
                self.last_check = now
    
                log_file = self.current_log_file()
                if os.path.isfile(log_file):
                    return False
                else:
                    return True
    
            return False
    
        def doRollover(self):
            if self.stream:
                self.stream.close()
                self.stream = None
    
            filename = self.current_log_file(create_dir=True)
            self.baseFilename = filename
            if not self.delay:
                self.stream = self._open()
    

    相关文章

      网友评论

          本文标题:python使用logging规范的日志配置代码

          本文链接:https://www.haomeiwen.com/subject/nmkqqktx.html