Django 日志模块


Django 日志源于 python 内置 logging 模块且封装的好了基本自动化配置了

所以本文全部是理解上的内容

由四个部分组成

日志记录器(Loggers)

事件处理者(Handlers)

过滤者

格式化处理者

Loggers

日志记录器是进入日志系统的入口点。每个日志记录器都是一个命名桶,可以将消息写入其中进行处理。日志记录器被配置为具有日志级别。此日志级别描述日志记录器将处理的消息的严重性。Python定义了以下日志级别:

  • DEBUG: 调试模式才会出现的
  • INFO: 正常信息错误
  • WARNING: 可以忽略的警告
  • ERROR: 必须要处理的问题
  • CRITICAL: 严重的问题

写入日志记录器的每条消息都是一个日志记录。每个日志记录还有一个日志级别,指示特定消息的严重程度。日志记录还可以包含有用的元数据,用于描述正在记录的事件。这可以包括堆栈跟踪或错误代码等细节

当向日志记录器提供消息时,将将消息的日志级别与日志记录器的日志级别进行比较。如果消息的日志级别满足或超过日志记录器本身的日志级别,则消息将进行进一步处理。如果没有,该消息将被忽略。一旦日志记录器确定需要处理消息,就将其传递给处理程序。

Handlers

处理程序是引擎,它决定日志记录器中的每条消息都发生了什么。它描述了一种特定的日志行为,例如将消息写入屏幕、文件或网络套接字。与日志记录器一样,处理程序也有一个日志级别。如果日志记录的日志级别没有满足或超过处理程序的级别,处理程序将忽略该消息。一个日志记录器可以有多个处理程序,每个处理程序可以有不同的日志级别。通过这种方式,可以根据消息的重要性提供不同形式的通知。例如,您可以安装一个将错误和关键消息转发到分页服务的处理程序,而另一个处理程序将所有消息(包括错误和关键消息)记录到一个文件中,以便稍后分析。

这也意味着可以有多个handlers 处理日志信息

Filters

过滤器用于提供额外的控制,控制将哪些日志记录从日志记录器传递到处理程序。默认情况下,满足日志级别要求的任何日志消息都将被处理。但是,通过安装过滤器,您可以在日志记录过程中放置其他条件。例如,您可以安装只允许发出来自特定源的错误消息的筛选器。过滤器还可以用于在发出日志记录之前修改日志记录。例如,您可以编写一个过滤器,如果满足一组特定的条件,就将错误日志记录降级为警告记录。

过滤器可以安装在日志记录器或处理程序上;可以在链中使用多个筛选器来执行多个筛选操作。

配置过滤信息可以直接写在 Loggers 里面Handlers 很灵活

Formatters

最终,日志记录需要呈现为文本。格式化程序描述文本的确切格式。格式化程序通常由一个包含LogRecord属性的Python格式化字符串组成;但是,您也可以编写自定义格式化程序来实现特定的格式化行为

h如何使用呢

# 所有的代码文件加入这两行创建日志记录器
import logging
logger = logging.getLogger(__name__)


# 在settings 中配置
import os

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
    # 这个配置让日志输出到控制台
        'console': {
            'class': 'logging.StreamHandler',
        },
        # 这个让日志输出到一个文件 也可以定义多个 file1,2345678
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django/debug.log',
        },
    },
    # 这将配置父根日志记录器向控制台处理程序发送警告级别或更高级别的消息。通过将级别调整为INFO或DEBUG,您可以显示更多消息。这在开发过程中可能很有用。
    'root': {
        'handlers': ['console'],
        'level': 'WARNING',
    },
    # 现在可以通过定义loggers控制日志处理的颗粒度
    'loggers': {
        # django是系统级的 也可以对应应用
        'django': {
            # 选择对应的哪个处理者也可以都要
            'handlers': ['console''file'],
            'level': 'WARNING',
        },
    }
}

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        # 输出日志级别名称、日志消息以及生成日志消息的时间、进程、线程和模块。
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
           'django.request': {
            'handlers': ['console'],
            'level': 'ERROR',
            'propagate': False,
        },
        'django.server': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'myapp': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    }
}