2015-11-04 60 views
2

我想把日志记录在python python项目中。为此,我在我的common.py中写了一个名为get_logger的方法,它返回记录器。Python的单身日志记录不能正常工作 - 文件中的重复日志语句

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_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_apis.py

类从sf_apis.py从base.py扩展了一个类。我在base.py中调用了get_logger。

base.py

from common import get_logger 
log = get_logger() 

class Base: 

    // .. some code .. 

然后就叫从logginggetLogger来获取记录在sf_apis.py

sf_apis.py

import logging 

log = logging.getLogger('app') 

class SfBulk(Base): 

    // .. some code .. 

但是,当我的另一r称为sync_data.py模块通过调用sf_apis.py一些方法UNS,我看到重复的日志报表在我的日志

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 

我读它here

记录模块已经实现了单件模式

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

我做了什么小姐?请帮忙。

回答

2

Python记录器具有层次结构。你已经创建了两个:'app'''。按照惯例,层次结构被定义为模块的点分离路径。在特定情况下,空字符串记录器成为所有其他第一级记录器的父项。具体而言,'''app'的母公司。

现在您为'app'设置了propagate = True记录器。这意味着发送给该记录器的消息也将传播到其父母,即''。这就是你有重复的消息。

您可以设置propagate = False'app'记录器或设置其他文件处理程序''记录使得消息将被复制依旧,但在不同的文件。

+0

是的。这是问题。 Upvoted并接受你的答案。还有一件事,不是调用'logging.getLogger',而是在'sf_api.py'中调用我的'get_logger'。因为我希望我的每个模块都是独立的。 – Hussain

+0

当然,你可以。我还建议你重构'get_logger',这样''第一次调用get_logger'时,'dictConfig'只被调用一次 –

+0

那好多了。有关如何仅调用一次“dictConfig”的提示? – Hussain