这是我参与更文挑战的第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日志消息格式
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!")