我已经为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()
,它将起作用。我不知道为什么。
答案 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)