如果我调用logging.config.dictConfig,则在init之后logger正在改变

时间:2017-03-14 10:03:01

标签: python logging

我有2个记录器

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

get_logger_setup

logging.config.dictConfig(my_logging_configs)

如果我第二次不调用它len(logger.handlers)仍然是3.

如果设置不同,我每次启动新记录器时都必须调用它。

尝试深度复制copy.deepcopy(logger)以创建一个单独的对象,该对象不会耦合到logging.config.dictConfig,但它会出错,因为它是一个复杂的对象。

想法?

1 个答案:

答案 0 :(得分:2)

您应该在 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文档中对库的建议,那么应该与他们的维护者一起提出问题来纠正这个问题。