我有一个这样的记录器初始化函数:
def generate_logger():
import logging
LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
FORMAT = "%(asctime)s : %(message)s"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
fh = logging.FileHandler(LOG_FILENAME)
formatter = logging.Formatter(FORMAT)
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
在我的代码的某些部分,我有这样的异常捕获:
logger = generate_logger()
except AttributeError:
logger.error('Opps we got an error')
奇怪的是,我写了2次相同的错误,只有一次,只有一次,logger.error('Opps we got an error')
用print "test"
,我打印“test”一次。
可能是什么问题和解决方案。
此致
答案 0 :(得分:12)
每次调用该函数时,都会向根记录器添加一个新的FileHandler:每次调用没有name参数的logger.getLogger()
都会返回相同的logger对象。
您应该只调用generate_logger()
一次,然后通过调用logger.getLogger()
来获取相同的记录器对象:
generate_logger()
# .... some time later
log = logger.getLogger()
except AttributeError:
log.error('Opps we got an error')
(请注意,您现在不需要generate_logger()
返回值)
答案 1 :(得分:10)
我也遇到了同样的问题并遇到了这个页面。是的,我也在创建多个处理程序。在generate_logger()
中,您可以检查是否有其他处理程序并将其删除。
def generate_logger():
import logging
LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
FORMAT = "%(asctime)s : %(message)s"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Reset the logger.handlers if it already exists.
if logger.handlers:
logger.handlers = []
fh = logging.FileHandler(LOG_FILENAME)
formatter = logging.Formatter(FORMAT)
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
答案 2 :(得分:3)
我认为你可能会以某种方式将两个处理程序添加到记录器中。也许在某些时候,正在添加隐式处理程序。
答案 3 :(得分:2)
您可能有两个处理程序转到相同的结果日志。
您创建了多少处理程序?你执行generate_logger
多少次?每次执行generate_logger
时,您都会为同一个文件创建另一个处理程序,从而导致潜在的重复。
答案 4 :(得分:0)
用户可以为此使用单例设计模式:
43类单例(类型):
44“”“
45定义一个实例操作,使客户端可以访问其唯一的
46个实例。
47“”“
48
49 def init (cls,名称,基数,attrs,** kwargs):
50个super()。初始(名称,基数,属性)
51 cls._instance =无
52
53 def call (cls,* args,** kwargs):
54如果cls._instance为None:
55 cls._instance = super()。调用(* args,** kwargs)
56返回cls._instance
57
58
59
60 def _setup_logger(名称,日志文件,级别=日志记录.INFO):
61“”“功能设置所需的记录器数量”“”
62
63处理程序= logging.FileHandler(log_file)
64 handler.setFormatter(formatter)
65 logger = logging.getLogger(name)
66 logger.setLevel(level)
67 logger.addHandler(handler)
68
69返回记录器
70
71类Logger(metaclass = Singleton):
72
73 def init (自身,文件名,级别):
74否(isinstance(file_name,str)和
75 isinstance(level,int)):
76提高ValueError(“ Invalid Args”)
77
78 self.log_inf = _setup_logger('inf',file_name +'。inf',level)
79 self.log_err = _setup_logger('err',file_name +'。err',level)