Django使用Python内置的logging模块处理系统日志。
Python logging
配置由下面四部分组成:
Loggers
Handlers
过滤器
Formatters
logger是日志系统的入口,每个 logger都是命名了的 bucket,消息写入bucket以便进一步处理。
logger 可以配置日志级别,日志级别描述了由该logger处理的消息的严重性,Python 定义了下面几种日志级别:
DEBUG:排查故障时使用的低级别系统消息。
INFO:一般的系统消息。
WARNING:描述系统发生了一些小问题的信息。
ERROR:描述系统发生了大问题的信息。
CRITICAL:描述系统发生了严重问题的信息。
每一条写入logger的消息都是一条日志记录,每一条日志记录都包含日志级别,代表对应消息的严重程度,日志记录还包含有用的元数据,来描述被记录了日志的事件细节,例如堆栈跟踪或者错误码。
当logger处理一条消息时,会将自己的日志级别和这条消息的日志级别做对比,如果消息的日志级别匹配高于logger的日志级别,它就会被进一步处理,否则这条消息就会被忽略掉。
当logger确定了一条消息需要处理之后,会把它传给Handler。
Handler是决定如何处理logger中每一条消息的引擎,它描述特定的日志行为,例如把消息输出到屏幕、文件或者网络socket。
和logger一样,handler也有日志级别的概念,如果一条日志记录的级别不匹配或者低于handler的日志级别,对应的消息会被handler忽略。
一个logger可以有多个handler,每个handler可以有不同的日志级别,这样就可以根据消息的重要性不同,来提供不同格式的输出。
在日志记录从logger传到handler的过程中,使用filter来做额外的控制。
默认情况下,只要级别匹配,任何日志消息都会被处理。不过,也可以通过添加filter来给日志处理的过程增加额外条件。例如,可以添加一个filter只允许某个特定来源的ERROR消息输出。
Filter换呗用来在日志输出之前对日志记录做修改。例如,可以写一个filter,当满足一定条件时,把日志记录从ERROR降到WARNING级别。
Filter在logger和handler中都可以添加,多个Filter可以链接起来使用,来做多重过滤操作。
日志记录最终是需要以文本来呈现的,Formatter描述了文本的格式,一个Formatter通过包含 LogRecord attributes 的Python格式化字符串组成,不过你也可以为特定的格式来配置自定义的Formatter。
在代码文件中引入logging模块,即可发起对应的调用。
from django.shortcuts import render from django.http import HttpResponse import logging # logger实例创建 logger = logging.getLogger(__name__) def index(request): # 记录日志信息 logger.debug('debug日志') logger.info('info日志') logger.warning('warning日志') logger.error('error日志') return HttpResponse("Django 日志测试")
这里只是调用logging模块,并未配置相应handlers,默认在控制台输出debug级别以上的日志信息。
logger对象有以下几个内置方法:
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
logger.exception():创建一个包含当前异常堆栈的ERROR级别日志消息。
在 settings.py 文件中配置如下内容
import os LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/path/to/django/debug.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }
代码测试
在 settings.py 文件中配置如下内容
import os LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'WARNING', }, 'loggers': { 'django': { 'handlers': ['console'], 'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), 'propagate': False, }, }, }
代码测试