2017-03-14 43 views
1

我有內部get_logger_setup 2個伐木者記錄器正在改變後初始化如果我叫logging.config.dictConfig

logger = logger_setup.get_logger_setup(env, logger_name = 'root', report_to_logging_service=report_to_logging_service) 
print len(logger.handlers) # =3 
auditor = logger_setup.get_logger_setup(env, logger_name = 'audit') 
print len(logger.handlers) # =2 

logging.config.dictConfig(my_logging_configs) 

如果我不把它叫做第二次len(logger.handlers)仍然是3.

我必須在每次啓動新的記錄器時調用它以防設置不同。

嘗試深度複製copy.deepcopy(logger)以創建一個不會耦合到logging.config.dictConfig的單獨對象,但由於它是一個複雜的對象,所以它是錯誤的。

想法?

+0

get_logger_setup是什麼?它似乎不是官方的功能,你可以在這裏粘貼def部分 – linpingta

+0

hi @linpingta,我已經解釋了引起問題的get_logger_setup裏面的部分。它是'logging.config.dictConfig' – WebQube

+0

'dictConfig'的意思是一次調用*來配置所有記錄器和處理程序,而不是多次。 –

回答

1

您應該在單個dictConfig()呼叫中配置所有記錄器,處理程序,過濾器等。 This page有許多可以用作起點的示例配置。一個這樣的(複雜得多,你可能需要,但鏈接的頁面有更簡單的例子)在下面給出:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'verbose': { 
      'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 
     }, 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
     }, 
    }, 
    'filters': { 
     'special': { 
      '()': 'project.logging.SpecialFilter', 
      'foo': 'bar', 
     }, 
     'require_debug_true': { 
      '()': 'django.utils.log.RequireDebugTrue', 
     }, 
    }, 
    'handlers': { 
     'console': { 
      'level': 'INFO', 
      'filters': ['require_debug_true'], 
      'class': 'logging.StreamHandler', 
      'formatter': 'simple' 
     }, 
     'mail_admins': { 
      'level': 'ERROR', 
      'class': 'django.utils.log.AdminEmailHandler', 
      'filters': ['special'] 
     } 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['console'], 
     }, 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': False, 
     }, 
     'myproject.custom': { 
      'handlers': ['console', 'mail_admins'], 
      'level': 'INFO', 
      'filters': ['special'] 
     } 
    } 
} 

dictConfig()呼叫會在應用程序所做的(即)的代碼 - 而不是應該在您使用的任何庫的代碼。如果它們中的任何一個正在執行的日誌記錄配置超出了Python文檔中針對庫推薦的配置,則應該向維護人員提出問題以糾正此問題。