我已经为django项目设置了造纸图,但是用 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()
,则可以使用。我不知道为什么。
请查看django.setup()
的文档,您会发现此功能的主要角色之一是根据您的设置设置记录。它提到了使用django.setup()的情况来使用日志记录:
如果您使用的是django"独立"的组件,例如 编写一个加载一些Django模板和渲染的Python脚本 它们,或使用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)