美文网首页
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