Python单例日志记录无法正常工作-文件中存在重复的日志语句
我正在尝试将日志记录放到python项目中。为此,我在common.py中编写了一个名为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 请注意,日志
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
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
。很抱歉,评论中没有多行代码部分