首页 > 解决方案 > Django papertrail 日志记录神秘地失败了

问题描述

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

设置.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(),它将起作用。我不知道为什么。

标签: djangologgingpapertrail-app

解决方案


查看文档django.setup()您会发现此功能的主要作用之一是根据您的设置设置日志记录。部分文档提到了需要使用 django.setup() 才能利用日志记录的场景:

如果你正在使用 Django “独立”的组件——例如,编写一个 Python 脚本来加载一些 Django 模板并呈现它们,或者使用 ORM 来获取一些数据——除了配置设置之外,你还需要一个步骤.

我不知道你的项目做了什么,但你正在运行的测试似乎属于“独立”的类别。

部分查看源代码django.setup()如下

configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)

该函数的源代码执行以下操作

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)

推荐阅读