Django日志初探

164 阅读4分钟

这是我参与更文挑战的第9天,活动详情查看: 更文挑战

Django使用python内建的logging模块打印日志,python的logging配置由四个部分组成:
  • 记录器:Logger
  • 处理程序:Handler
  • 过滤器:Filter
  • 格式化:Formatter
记录器-Logger
  • logger为日志系统的入口,每个logger命名都是bucket,可以向这个bucket写入需要处理的消息。
  • 每个logger都有一个日志级别,日志级别表示该logger将要处理的消息的严重性,如下几种日志级别:
DEBUG:用于调试目的底层系统信息
INFO:普通的系统信息
WARNING:表示出现一个较小的问题
ERROR:表示出现一个较大的问题
CRITICAL:表示出现一个致命的问题
  • 写入logger的每条消息都是一条日志,每条日志也具有一个日志级别,它表示对应的消息的严重性。每个日志记录包含描述正在打印的事件的元信息。
  • 当一条消息传递给logger,消息的日志级别将与logger的日志级别进行比较。如果消息的日志级别大于等于logger的日志级别,该消息将会往下继续处理。如果小于,该消息将被忽略。
  • Logger一旦决定消息需要处理,它将传递该消息给一个Handler。
Logger配置

logger 对应的值是个字典,其每一个键都是logger的名字,每一个值又是个字典,描述了如何 配置对应的Logger实例。

  • level(可选的),logger的级别。
  • propagate(可选的),logger的传播设置。
  • flters(可选的),logger的flter的标识符的列表。
  • handlers(可选的),logger的handler的标识符的列表。
LOGGING = {
    'loggers': {
        'hahaha': {
            'handlers': ['file_handler', 'console_handler'], 'level': 'DEBUG',
        },
    },
}
处理程序-Handler
  • Handler 决定如何处理logger中的每条消息。它表示一个特定的日志行为,例如将消息写到屏幕上、写到文件中或者写到网络socket。
  • 与logger一样,handler也有一个日志级别。如果消息的日志级别小于handler的级别,handler将忽略该消息。
  • Logger可以有多个handler,而每个handler可以有不同的日志级别。利用这种方式,可以根据消息的重要性提供不同形式的处理。
LOGGING = {
    'handlers': {
        'hahaha': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        }
    }
}

过滤器-Filters

  • Filter用于对从logger传递给handler的日志记录进行额外的控制。
  • 默认情况下,满足日志级别的任何消息都将被处理。通过安装一个flter,你可以对日志处理添加额外的条件。例如,你可以安装一个flter,只允许处理来自特定源的ERROR消息。
  • Filters还可以用于修改将要处理的日志记录的优先级。例如,如果日志记录满足特定的条件,你可以编写一个flter将日志记录从ERROR降为WARNING。
  • Filters可以安装在logger上或者handler上;多个flter可以串联起来实现多层flter行为。
格式化-Formatters

最后,日志记录需要转换成文本。Formatter表示文本的格式。Fomatter通常由包含日志记录属性的Python格式字符串组成;你也可以编写自定义的fomatter来实现自己的格式。

LOGGING = {
    'formatters': {
        'hahaha':{
            'format': '%(asctime)s - %(pathname)s:%(lineno)d[%(levelname)s] - %(message)s'
        },
        'simple': {
        'format': '%(asctime)s %(levelname)s %(message)s'
        },
    },
}
Format日志消息格式

mark

Django内置logger
  • django 获取所有日志
  • django.request处理与请求相关的日志,5xx响应报出error日志,4xx报出WARNING日志
  • django.db.backends 处理与数据库之间交互的日志
  • django.security.* 处理与安全相关的日志
  • django.db.backends.schemea 处理数据库迁移时的日志

相关配置

  • setting.py
# 除了filename和formatters需要根据实际情况来修改外都可以保持不变

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,#此选项开启表示禁用部分日志,不建议设置为True
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(message)s'#日志格式
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',#过滤器,只有当setting的DEBUG = True时生效
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'file': {#重点配置部分
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/data/logs/debug.log',#日志保存文件
            'formatter': 'verbose'#日志格式,与上边的设置对应选择
                }
    },
    'loggers': {
        'django': {#日志记录器
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        }
    },
}
  • 项目urls.py
from django.urls import path, include

urlpatterns = [
    path('ops/', include("ops.urls")),
]
  • app urls.py
from django.urls import path,include
from . import views

urlpatterns = [
    path('index/', views.index, name='index'),
]
  • app views.py
from django.http import HttpResponse
import logging

logger = logging.getLogger('django')

def index(request):
    logger.info('haha')
    return HttpResponse("Haha,this is index test!")