django - 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()
,它将起作用。我不知道为什么。
解决方案
查看文档,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)
推荐阅读
- c++ - 简单的 websockets 聊天客户端不发送消息
- ios - 带有 SpriteKit 的 UIBlurEffect 的 UIVisualEffectView?
- asp.net-core - 如何在 asp.net core 中定义 AppicationUser?
- kubernetes - Treafik UI - Kubernetes - 连接被拒绝
- c++ - Visual Studio 中的编译器错误?
- ionic-framework - 当设备在 Ionic 3 中倾斜时旋转 360 度图像?
- codenameone - 测试 FileChooser 库后构建总是失败
- firebase - 在 Polymer 应用程序中使用服务工作者会干扰 Firebase 托管重写吗?
- sql - 获取同一表中给定列的最小组
- css - 如何使引导导航栏/选项卡部分可水平滚动?