Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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_Logging_Singleton - Fatal编程技术网

Python单例日志记录无法正常工作-文件中存在重复的日志语句

Python单例日志记录无法正常工作-文件中存在重复的日志语句,python,logging,singleton,Python,Logging,Singleton,我正在尝试将日志记录放到python项目中。为此,我在common.py中编写了一个名为get\u logger的方法,用于返回记录器 import logging def get_logger(name='app'): log_config = config.LOG_CONFIG logging.config.dictConfig(log_config) logger = logging.getLogger(name) return logger 请注意,日志

我正在尝试将日志记录放到python项目中。为此,我在common.py中编写了一个名为
get\u logger
的方法,用于返回记录器

import logging
def get_logger(name='app'):
    log_config = config.LOG_CONFIG
    logging.config.dictConfig(log_config)
    logger = logging.getLogger(name)
    return logger
请注意,日志配置放在
config.log\u config

LOG_CONFIG = {
    'version': 1,
    'disable_existing_loggers': False,  # this fixes the problem

    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)8s] %(name)s: %(message)s'
        },
        # more formatters
    },
    'handlers': {
        'file': {
            'filename': '%s/%s' % (_cwd, '../logs/app/logging.log'),
            'formatter': 'standard',
            'when': 'midnight',
            'class': 'logging.handlers.TimedRotatingFileHandler'
        },
    },
    'loggers': {
        # Works for
        # 1. application logs (flask) and
        # 2. all other logs where below logger name is passed to getLogger
        'app': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True
        },
        # For all the remaining logs
        # Important: Don't include for production??
        '': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True
        }
    }
}
我有两个模块

  • base.py
  • sf_api.py
sf_api.py中的类扩展了base.py中的类。我已经在base.py中调用了get_logger

base.py

from common import get_logger
log = get_logger()

class Base:

    // .. some code ..
import logging

log = logging.getLogger('app')

class SfBulk(Base):

    // .. some code ..
然后从
logging
调用
getLogger
,以获取sf_api.py中的记录器

sf_api.py

from common import get_logger
log = get_logger()

class Base:

    // .. some code ..
import logging

log = logging.getLogger('app')

class SfBulk(Base):

    // .. some code ..
但是,当我的另一个名为
sync_data.py
的模块通过调用
sf_api.py
中的一些方法运行时,我在日志中看到重复的日志语句

2015-11-04 13:05:58,605 [    INFO] app: close_the_job :: job id = 75090000003sf4YAAQ
2015-11-04 13:05:58,605 [    INFO] app: close_the_job :: job id = 75090000003sf4YAAQ
我读到了

日志模块已经实现了单例模式

所以我没有去创建一个单例记录器类(互联网上有很多例子)


我错过了什么?请提供帮助。

Python记录器具有层次结构。您已经创建了两个:
'app'
'
。按照惯例,层次结构定义为指向模块的点分隔路径。在特定情况下,空字符串记录器成为所有其他第一级记录器的父级。具体来说,
'
'app'
的父级

现在为
'app'
记录器设置
propagate=True
。这意味着发送到此记录器的消息也将传播到其父级,即
'
。这就是您复制邮件的方式


您可以将
propagate=False
设置为
'app'
记录器,或者为
'
记录器设置另一个文件处理程序,以便消息仍会重复,但会在不同的文件中。

是。这就是问题所在。投票并接受了你的答案。还有一件事,与其调用
logging.getLogger
,不如在
sf\u api.py
中调用我的
get\u logger
。因为我希望我的每个模块都是独立的。当然,你可以。我还建议您重构
get\u logger
,以便在第一次调用
get\u logger
时只调用一次
dictConfig
,这样会更好。关于如何只调用一次
dictConfig
的任何提示?您可以这样做:
\uuuu logging\u configured=False
def get\u logger(name='app'):
global\uu logging\u configured
如果未配置日志记录:
logging.config.dictConfig(log\u config)
\uu logging\u configured=True
logger=logging.getLogger(名称)
返回logger
。很抱歉,评论中没有多行代码部分