如何配置和使用日志记录

参见

Django提供了一个有效的 default logging configuration 这是很容易扩展的。

进行基本的日志记录呼叫

要从您的代码中发送日志消息,您需要对其进行日志记录调用。

不要试图使用日志记录调用 settings.py

将Django日志配置为 setup() 函数意味着记录在 settings.py 可能不会像预期的那样工作,因为 logging will not be set up at that point 。要了解日志记录,请使用下面示例中建议的view函数。

首先,导入Python记录库,然后使用以下命令获取记录器实例 logging.getLogger() 。提供 getLogger() 方法,并使用名称来标识它及其发出的记录。一个不错的选择是使用 __name__ (见 使用记录器命名空间 以下是有关这方面的更多信息),它将以虚线路径形式提供当前Python模块的名称::

import logging

logger = logging.getLogger(__name__)

在模块级别执行此声明是一个很好的约定。

然后在函数中,例如在视图中,向记录器发送一条记录::

def some_view(request):
    ...
    if some_risky_state:
        logger.warning("Platform is running at risk")

执行此代码时,会引发 LogRecord 包含该消息的消息将被发送到记录器。如果您使用的是Django的默认日志配置,则该消息将出现在控制台中。

这个 WARNING 上例中使用的级别是以下几个级别之一 logging severity levelsDEBUGINFOWARNINGERRORCRITICAL 。因此,另一个示例可能是::

logger.critical("Payment system is not responding")

重要

级别低于的记录 WARNING 默认情况下不会出现在控制台中。要更改此行为,需要进行其他配置。

自定义日志记录配置

虽然Django的日志配置是开箱即用的,但您可以通过一些额外的配置准确地控制如何将日志发送到各种目的地-日志文件、外部服务、电子邮件等等。

您可以配置:

  • 记录器映射,以确定将哪些记录发送到哪些处理程序

  • 处理程序,以确定它们如何处理收到的记录

  • 过滤器,以提供对记录传输的额外控制,甚至就地修改记录

  • 格式化程序,要转换 LogRecord 对象转换为字符串或其他形式供人类或其他系统使用

配置日志记录的方法有多种。在姜戈, LOGGING 设置是最常用的。该设置使用 dictConfig format ,并扩展了 default logging configuration

看见 配置日志记录 了解如何将您的自定义设置与Django的默认设置合并。

请参阅 Python logging documentation 有关配置日志记录的其他方法的详细信息。为简单起见,本文档将仅考虑通过 LOGGING 布景。

基本日志记录配置

在配置日志记录时,有必要

创建 LOGGING 辞典

在您的 settings.py **

LOGGING = {
    "version": 1,  # the dictConfig format version
    "disable_existing_loggers": False,  # retain the default loggers
}

通过设置来保留和扩展默认日志记录配置几乎总是有意义的 disable_existing_loggersFalse

配置处理程序

此示例配置名为的单个处理程序 file ,它使用的是Python的 FileHandler 保存级别的日志 DEBUG 和更高的文件 general.log (在项目根目录下):

LOGGING = {
    # ...
    "handlers": {
        "file": {
            "class": "logging.FileHandler",
            "filename": "general.log",
        },
    },
}

不同的处理程序类采用不同的配置选项。有关可用处理程序类的更多信息,请参见 AdminEmailHandler 由Django和各种 handler classes 由Python提供。

还可以在处理程序上设置日志记录级别(默认情况下,它们接受所有级别的日志消息)。使用上面的示例,添加:

{
    "class": "logging.FileHandler",
    "filename": "general.log",
    "level": "DEBUG",
}

将定义一个只接受级别记录的处理程序配置 DEBUG 而且更高。

配置记录器映射

要将记录发送到此处理程序,请配置记录器映射以使用它,例如:

LOGGING = {
    # ...
    "loggers": {
        "": {
            "level": "DEBUG",
            "handlers": ["file"],
        },
    },
}

映射的名称决定它将处理哪些日志记录。此配置 ('' )是 unnamed 。这意味着它将处理来自 all 记录器(请参见 使用记录器命名空间 关于如何使用映射名称来确定它将为其处理记录的记录器)。

它会转发不同级别的消息 DEBUG 更高级别的是名为 file

请注意,记录器可以将消息转发到多个处理程序,因此记录器和处理程序之间的关系是多对多的。

如果执行::

logger.debug("Attempting to connect to API")

在您代码中,您将在文件中找到该消息 general.log 在项目的根目录中。

配置格式化程序

默认情况下,最终日志输出包含每个 log record 。如果要包含其他数据,请使用格式化程序。命名并定义您的格式化程序--此示例定义名为 verbosesimple

LOGGING = {
    # ...
    "formatters": {
        "verbose": {
            "format": "{name} {levelname} {asctime} {module} {process:d} {thread:d} {message}",
            "style": "{",
        },
        "simple": {
            "format": "{levelname} {message}",
            "style": "{",
        },
    },
}

这个 style 关键字允许您指定 {str.format()$string.Template 格式化;默认为 $

看见 LogRecord attributes 对于 LogRecord 您可以包括的属性。

若要将格式化程序应用于处理程序,请将 formatter 按名称引用格式化程序的处理程序词典条目,例如:

"handlers": {
    "file": {
        "class": "logging.FileHandler",
        "filename": "general.log",
        "formatter": "verbose",
    },
}

使用记录器命名空间

未命名的日志记录配置 '' 从任何Python应用程序捕获日志。命名日志记录配置将仅从具有匹配名称的记录器捕获日志。

记录器实例的命名空间是使用 getLogger() 。例如,在 views.pymy_app **

logger = logging.getLogger(__name__)

中创建一个记录器。 my_app.views 命名空间。 __name__ 允许您在项目的应用程序中根据日志消息的来源自动组织日志消息。它还可以确保您不会遇到名称冲突。

名为的记录器映射 my_app.views 将从此记录器捕获记录:

LOGGING = {
    # ...
    "loggers": {
        "my_app.views": {...},
    },
}

名为的记录器映射 my_app 将更加宽松,可以从 my_app 命名空间(包括 my_app.viewsmy_app.utils 以此类推):

LOGGING = {
    # ...
    "loggers": {
        "my_app": {...},
    },
}

您还可以显式定义记录器命名空间::

logger = logging.getLogger("project.payment")

并相应地设置记录器映射。

使用记录器层次结构和传播

记录器命名为 hierarchicalmy_app 是的父项 my_app.views ,它是的父项 my_app.views.private 。除非另有指定,否则记录器映射将把它们处理的记录传播给它们的父级-来自 my_app.views.private 命名空间将由两者的映射来处理 my_appmy_app.views

要管理此行为,请在您定义的映射上设置传播密钥:

LOGGING = {
    # ...
    "loggers": {
        "my_app": {
            # ...
        },
        "my_app.views": {
            # ...
        },
        "my_app.views.private": {
            # ...
            "propagate": False,
        },
    },
}

propagate 默认为 True 。在本例中,来自 my_app.views.private 将不会由父级处理,而是来自 my_app.views 将要。

配置响应日志记录

当日志包含尽可能多的信息,而不是您不需要的信息时,日志记录是最有用的,并且您需要多少取决于您正在做什么。当您调试时,您需要一定级别的信息,如果您必须在生产中处理这些信息,那么这些信息将是多余和无用的。

您可以配置日志记录,以便在需要时为您提供所需的详细程度。更好的方法是根据环境自动应用配置,而不是手动更改配置来实现这一点。

例如,您可以设置一个环境变量 DJANGO_LOG_LEVEL 在您的开发和试运行环境中适当使用,并在记录器映射中使用它,如下所示:

"level": os.getenv("DJANGO_LOG_LEVEL", "WARNING")

-因此,除非环境指定较低的日志级别,否则此配置将仅转发严重程度的记录 WARNING 上面是它的操控者。

配置中的其他选项(例如 levelformatter 处理程序的选项)可以被类似地管理。