【问题标题】:Logging INFO to Django Server's STDOUT将 INFO 记录到 Django 服务器的 STDOUT
【发布时间】:2014-03-26 18:05:00
【问题描述】:

我正在 Django 服务器上设置日志记录。我希望能够将任意 INFO 级别的字符串记录到服务器的标准输出中,因此它出现在标准 Django 消息旁边,如下所示:

[24/Feb/2014 20:37:03] "POST /v1/events/ HTTP/1.1" 201 0

这是我当前的日志记录配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        #'file': {
            #'level': 'DEBUG',
            #'class': 'logging.FileHandler',
            #'filename': '/tmp/djdebug.log',
        #},
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'stream': sys.stdout
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django': {
            'handlers': ['console'],
            'propogate': True,
            'level': 'INFO'
        }
        #'django': {
            #'handlers': ['file'],
            #'propagate': True,
            #'level': 'DEBUG',
        #},
    }
}

在我的 django 项目的应用程序中的 models.py 文件中,我在顶部执行以下操作:

import logging
logger = logging.getLogger(__name__)

然后,在一些代码中,我编写运行以下内容:

logger.info('triggering notifications')

代码到达调用 this 的位置,但没有任何内容写入服务器的标准输出。我错过了什么吗?我在本地运行它,并且 DEBUG = True,但我希望即使在 DEBUG = False 的生产中也能显示 INFO 消息。

【问题讨论】:

    标签: python django


    【解决方案1】:

    __name__ 是包含记录器的 python 模块的名称。因此,为了让您的记录器正常工作,您应该将 settings.py 中的记录器从 django 重命名为 您调用的模块的名称 getLogger。第二种选择 - 只需将 __name__ 更改为 django

    logger = logging.getLogger('django')
    

    您的评论更新较晚:

    是的,但我仍然希望我的所有记录器都有命名空间。我只是 想知道是否有办法为所有人设置“基线”配置 模块并让所有内容自动继承。使用 'django' 对于一切都是不可能的,完全不模块化。

    您只需将 'your_project_name' 记录器添加到记录器列表中。记录器名称的虚线路径定义了层次结构。例如,如果您需要,假设您的项目中 'some_application' 的文件日志和所有其他应用程序日志消息(INFO 级别)应该只发送到控制台,那么您的记录器列表可能如下所示:

    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'INFO'
        },
    
        #...
    
        'your_project_name': {
            'handlers': ['console'],
            'propagate': False,
            'level': 'INFO',
        },
        'your_project_name.some_application': {
            'handlers': ['file'],
            'propagate': True, # propagate here to root project level
                               # logger to also print this message to console
            'level': 'DEBUG',
        },
    
        #...
    
        'your_project_name.some_application.models': {
            'handlers': ['mail_admins'], #, 'console']
            'propagate': True, # if file and console needed,
                               # but 'console' can be added to handlers
                               # and propagate set to False
                               # to avoid this log messages in file...
            'level': 'ERROR',
        },
    
    }
    

    some_application 中调用 logger = logging.getLogger(__name__) 将获得记录器,它应该将所有消息记录到文件并传播到根项目记录器以在控制台上显示它们。所有其他应用程序模块__name__ 将仅匹配您的根项目记录器:your_project_name,它将仅在控制台上打印消息。如果需要,您可以向树再添加一层,例如 your_project_name.some_application.models 可以使用 mail_admins 处理程序向管理员报告一些数据库问题。当然,您可以更改层次结构中不同记录器的记录器级别!

    【讨论】:

    • 当然有一种方法可以为给定项目中的所有模块设置合理的默认值吗?我在项目中有多个应用程序,我不想为每个应用程序粘贴相同的大量 JSON 列表。
    • @user1427661 “为所有模块设置合理的默认值”是什么意思?
    • 即,我在原始消息代码中为“django”设置的内容。我希望它的处理程序是控制台,我希望将传播设置为 True,并且我希望将级别设置为“INFO”。我希望这成为每个使用日志记录的模块的默认级别,因此我不必在我的设置文件中输入每个模块或在每次添加新模块时更新它。
    • @user1427661 正如我所说-当您在模块中获取记录器时使用'django':logger = logging.getLogger('django'),无需其他更改。如果您想使用__name__ 作为记录器的名称,您应该在settings.py 中使记录器名称与您调用getLogger 的模块名称相同...
    • 是的,但我仍然希望我的所有记录器都具有命名空间。我只是想知道是否有办法为所有模块设置“基线”配置并让所有内容自动继承。对所有事情都使用“django”是不可能的,完全不模块化。
    猜你喜欢
    • 2018-07-29
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多