python logging 避免日志重复打印

关键点

  • 日志配置:在应用启动时配置日志,确保只初始化一次。
  • 检查日志配置:确保日志配置只初始化一次,避免重复添加日志处理器。
  • 查看日志处理器:使用 logger.handlers 查看当前日志处理器,确保没有重复的处理器。
#!/usr/bin/env python

# -*- coding: utf-8 -*-


import logging

from logging.handlers import RotatingFileHandler

from logging import StreamHandler



class Logger(object):

    log_file = 'auditor.log'


    def __init__(self, log_name=None):

        """

        :param log_file:  日志路径+文件名称

        :param log_name:  日志名称,默认root

        """

        self.logger = logging.getLogger(log_name)

        self.logger.setLevel(logging.DEBUG)

        self.formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s %(threadName)s %(name)s %(message)s", datefmt="%Y/%m/%d %X")

        
        if not Logger.has_handler(self.logger, StreamHandler):

            ch = StreamHandler()

            ch.setFormatter(self.formatter)

            ch.setLevel(logging.DEBUG)

            self.logger.addHandler(ch)


        if not Logger.has_handler(self.logger, RotatingFileHandler):

            fh = RotatingFileHandler(filename=self.log_file,

                                    mode='a',

                                    maxBytes=1024 * 1024 * 50,

                                    backupCount=10,

                                    encoding='utf-8')

            fh.setFormatter(self.formatter)

            fh.setLevel(logging.DEBUG)

            self.logger.addHandler(fh)

    
    def debug(self, msg):

        self.logger.debug(msg)


    def info(self, msg):

        self.logger.info(msg)


    def warning(self, msg):

        self.logger.warning(msg)


    def error(self, msg):

        self.logger.error(msg, exc_info=True)


    def critical(self, msg):

        self.logger.critical(msg, exc_info=True)


    @staticmethod

    def has_handler(logger, handler_type):

        """

        判断logger是否已有指定类型的handler。


        :param logger: 日志logger实例

        :param handler_type: 要检查的handler类型(例如logging.StreamHandler, logging.FileHandler)

        :return: 如果存在指定类型的handler则返回True,否则返回False

        """

        for handler in logger.handlers:

            if isinstance(handler, handler_type):

                return True

        return False

相关推荐

  1. python logging 避免日志重复打印

    2024-07-18 11:58:03       22 阅读
  2. RabbitMQ避免重复消费

    2024-07-18 11:58:03       77 阅读
  3. react native hooks 如何避免重复请求

    2024-07-18 11:58:03       32 阅读
  4. GO日志打印添加goroutineid

    2024-07-18 11:58:03       31 阅读
  5. 微信小程序:按钮禁用,避免按钮重复提交

    2024-07-18 11:58:03       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 11:58:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 11:58:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 11:58:03       58 阅读
  4. Python语言-面向对象

    2024-07-18 11:58:03       69 阅读

热门阅读

  1. 23、nc文件快速切片与索引

    2024-07-18 11:58:03       23 阅读
  2. 【Nginx】控制允许可上传的文件大小

    2024-07-18 11:58:03       19 阅读
  3. Docker 容器中的 Docker Compose 简介

    2024-07-18 11:58:03       23 阅读
  4. Spring boot 2.0 升级到 3.3.1 的相关问题 (三)

    2024-07-18 11:58:03       23 阅读
  5. NLP篇10 NLP总结

    2024-07-18 11:58:03       19 阅读
  6. 自然语言处理NLP--文本相似度面试题

    2024-07-18 11:58:03       17 阅读
  7. vue中获取剪切板中的内容

    2024-07-18 11:58:03       23 阅读
  8. 面向过程编程和面向对象编程

    2024-07-18 11:58:03       19 阅读