python记录器多次记录相同的条目
我有这样一个函数:python记录器多次记录相同的条目,python,exception,logging,Python,Exception,Logging,我有这样一个函数: 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
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')
奇怪的是,我写了两次同样的错误,而且只能写一次,一旦我更改了logger.error('Opps we got error')
使用打印“test”
,我就打印了一次“test”
问题和解决方案是什么
关于您可能有两个处理程序指向同一个结果日志
您正在创建多少个处理程序?您执行了多少次
generate\u logger
?每次执行generate\u logger
时,您都会为同一文件创建另一个处理程序,从而导致潜在的重复。我认为您可能会以某种方式在记录器中添加两个处理程序。可能在某个时候添加了一个隐式处理程序。每次调用该函数时,您都在向根记录器添加一个新的FileHandler:调用logger.getLogger()
而不使用name参数时,每次都返回相同的记录器对象
您应该只调用一次generate_logger()
,然后通过调用logger.getLogger()
,简单地获取相同的记录器对象:
(请注意,现在不需要
generate_logger()
来返回值)我也遇到了同样的问题,并且遇到了这个页面。是的,我还创建了多个处理程序。在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
use可以为此使用单例设计模式: 43类单体(类型):
44“
45定义一个实例操作,允许客户端访问其唯一的
46例。
47“”
48
49 definit(cls、名称、基数、属性、**kwargs):
50 super().init(名称、基数、属性)
51 cls.\u实例=无
52
53 def呼叫(cls、*ARG、**kwargs):
54如果cls.\u实例为无:
55 cls._instance=super()。调用(*args,**kwargs)
56返回cls.\u实例
57
58
59
60 def设置记录器(名称、日志文件、级别=logging.INFO):
61“函数设置您想要的任意多个记录器”
62
63 handler=logging.FileHandler(日志文件)
64处理程序。设置格式化程序(格式化程序)
65 logger=logging.getLogger(名称)
66.设置级别(级别)
67.addHandler(handler)
68
69返回记录器
70
71类记录器(元类=单例):
72
73 definit(自身、文件名、级别):
74如果不是(isinstance(文件名,str)和
75 isinstance(级别,int)):
76提升值错误(“无效参数”)
77
78 self.log\u inf=\u setup\u logger('inf',文件名+'.inf',级别)
79 self.log_err=_setup_logger('err',文件名+'.err',级别)
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