Django Papertrail日志神秘地失败

时间:2019-03-04 22:13:23

标签: django logging papertrail-app

我已经为Django项目设置了papertrail,但是登录失败并显示OSError: [Errno 9] Bad file descriptor。奇怪的是,如果我在日志记录调用之前调用django.setup(),就可以了...

settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'json': {
            '()': 'pythonjsonlogger.jsonlogger.JsonFormatter',
             'fmt': '%(levelname)s %(asctime)s %(message)s',
         },
    },
    'handlers': {
        'papertrail': {
            'level': 'DEBUG',
            'class': 'logging.handlers.SysLogHandler',
            'formatter': 'json',
            'address': ('logsN.papertrailapp.com', 12345)
         },
    ...
    },
    'loggers': {
        'papertrail': {
            'handlers': ['papertrail'],
            'level': 'ERROR',
            'propagate': True,
         },
    ...

/management/commands/logging_test.py

from django.core.management import BaseCommand
import django
import logging

#  uncomment this line to make it work
#django.setup()


def test_logging():
    logger = logging.getLogger('papertrail')
    logger.error(
        'TEST LOGGING'
    )


class Command(BaseCommand):
    def handle(self, *args, **options):
        test_logging()

我可以通过以下方式调用test_logging函数:

./manage.py test_logging

如果我取消注释行django.setup(),它将起作用。我不知道为什么。

1 个答案:

答案 0 :(得分:0)

看看django.setup()的{​​{3}},您会发现此功能的主要作用之一是根据您的设置来设置日志记录。在文档的docs部分中提到了使用django.setup()来利用日志记录的情况:

  

例如,如果您使用的是Django“独立”组件,例如,   编写Python脚本来加载一些Django模板并进行渲染   它们,或使用ORM来获取一些数据–还有一个步骤   除了配置设置之外,您还需要。

我无法确定您的项目做什么,但是您正在运行的测试似乎属于“独立”类别。

部分地查看源django.setup()会调用以下

configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)

该函数的This执行以下操作:

def configure_logging(logging_config, logging_settings):
    if logging_config:
        # First find the logging configuration function ...
        logging_config_func = import_string(logging_config)

        logging.config.dictConfig(DEFAULT_LOGGING)

        # ... then invoke it with the logging settings
        if logging_settings:
            logging_config_func(logging_settings)