Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python记录器多次记录相同的条目_Python_Exception_Logging - Fatal编程技术网

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