关键点
- 日志配置:在应用启动时配置日志,确保只初始化一次。
- 检查日志配置:确保日志配置只初始化一次,避免重复添加日志处理器。
- 查看日志处理器:使用 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