系统地讲解Django开发的基础知识, 高级知识。关注公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-Django从入门到项目实战》。
13.1.1 什么是日志?
这里的日志,指的是狭义的日志文件。在计算机中,通过将程序运行过程中的操作事件记录到日志文件中,来进行历史数据的处理,故障的追踪及排查。
使用django进行web开发时,将程序在运行过程中的操作事件记录到日志文件中,非常有利于程序的调试。
在程序中进行日志处理时,通过设定日志级别,可以进行日志的分层输出,这样设计的优点是:方便对日志内容进行筛选以及问题的快速定位。日志文件存在五个标准级别,级别按由低到高进行排序,分别为:debug, info, warning, error, critical。在程序中通常会设定一个基准日志级别,若日志级别小于该级别,就不会进行日志的输出。比如在程序中设定的级别为warning,那么warning级别以下(debug, info)的日志内容都不会输出。
13.1.2 logging模块
django使用的是Python的内置模块logging进行日志处理。在django中使用logging模块时需要先执行import进行模块的导入。
logging模块实现了日志的5种级别,对应的方法分别为:debug, info, warning, error, critical。
在使用logging模块进行日志记录时,可以先执行logging模块的getLogger方法创建一个logging实例,getLogger方法需传递一个唯一的标识名,以标识一个唯一的logging实例。现在进入Python交互模式中,学习logging模块的基本用法。
>>> import logging
>>> logger = logging.getLogger("chipscoco")
>>> logger.debug("debug")
>>> logger.info("info")
由于logging实例的默认日志级别为warning,所以在交互模式中执行debug和info方法时,日志都不会输出,因为debug和info的级别均小于warning。
继续在交互模式中进行测试:
>>> logger.warning("warning")
WARNING:chipscoco:warning
>>> logger.error("error")
ERROR:chipscoco:error
logging的默认输出格式为:日志级别名称:用户:日志消息。通常,我们需要对logging模块进行配置,对logging模块的配置可以通过logging.basicConfig方法,也可以在django项目的settings.py中来配置。现在来讲解如何对logging模块进行配置。
13.1.3 logging.basicConfig方法
(1) basicConfig方法常用参数:
参数名
| 描述 |
filename | 用来指定日志文件的路径 |
filemode | 日志文件的打开方式,默认为追加模式:"a" |
format | 指定内容的输出格式 |
datefmt | 指定日期的输出格式 |
level | 指定日志的基本级别, level可传递的参数分别为: (1) logging.DEBUG debug级别 (2) logging.INFO info级别 (3) logging.WARNING warning级别 (4) logging.ERROR error级别 (5) logging.CRITICAL critical级别 |
stream | 指定一个输出流对象,输出流对象可以为标准输出,标准错误输出,也可以为文件输出,stream参数与filename不能同时指定,否则会抛出ValueError的错误异常 |
(2) baiscConfig方法的format参数
通过basicConfig参数可以对日志输出的格式进行配置。format常用的格式符号:
format格式符号
| 描述 |
%(levelname)s | 输出日志级别名称 |
%(pathname)s | 输出当前执行程序的路径 |
%(filename)s | 输出当前的脚本文件名称 |
%(funcName)s | 输出当前的函数名称 |
%(lineno)d | 输出当前的文件行号 |
%(asctime)s | 输出当前的时间 |
%(thread)d | 输出线程的ID号 |
%(threadName)s | 输出线程的名称 |
%(process)d | 输出进程的ID号 |
%(message)s | 输出日志的具体信息 |
使用format对输出格式进行配置,传递的参数为字符串类型,例如"%(filename)s %(funcname)s %(lineno)d %(message)s"。
(3) baiscConfig的datefmt参数
datefmt参数对应于format参数中的%(asctime)s符号。datefmt常用的格式符号:
datefmt格式符号
| 描述 |
%y | 两位数的年份(00-99) |
%Y | 四位数的年份(000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(0-31) |
%H | 24小时制的小时数(0-23) |
%l | 12小时制的小时数(01-12) |
%M | 分钟数(00-59) |
%S | 秒数(00-59) |
使用datefmt对输出的时间格式进行配置,读者要注意的是,在format参数中指定了%(asctime)s格式符时,此参数才有效。datefmt传递的参数为字符串类型:例如"%Y-%m-%d %H:%M:%S",则对应的输出格式为x年-x月-x日 x时:x分:x秒。
logging的代码实例:
from django.views import View from django.http import HttpResponse import logging # 配置logging logging.basicConfig( filename="access.log", filemode = "w", format ="%(asctime)s-[%(funcName)s:%(lineno)d]-%(levelname)s-%(message)s", datefmt = "%Y-%m-%d %H:%M:%S", level=logging.DEBUG, ) def arithmetic(request): remote_addr = request.META.get('HTTP_X_FORWARDED_FOR', '127.0.0.1') logging.info('remote_addr:{}'.format(remote_addr)) return HttpResponse(str(1+1))
日志文件access.log中的输出为:
2020-10-21 07:56:51-[arithmetic:112]-INFO-remote_addr:127.0.0.1
13.1.4 在settings.py中进行日志配置
在settings.py中进行配置时,需要对全局的LOGGING字典进行配置。LOGGING字典的常用配置属性:
LOGGING的常用属性
| 描述 |
version | 指定一个版本号 |
disable_existing_loggers | 是否禁用所有logging实例,通常设置为False |
loggers | 配置日志的logging实例 |
handlers | 配置日志的输出方式:输出到控制台或者文件中,以及输出的日志格式,被loggers属性引用 |
formatters | 配置日志的输出格式,被handlers属性引用 |
现在我们打开django项目下的settings.py,来对全局的LOGGING进行配置:
# 导入logging模块 import logging # 导入logging下的handlers模块 import logging.handlers import django.utils.log # 得先确保项目根目录下有一个logs目录,logs目录用来存储日志文件 log_path = os.path.join(BASE_DIR, "logs") LOGGING = { # 配置一个版本号 'version': 2020, # 配置为False,表示不禁用所有logging实例 'disable_existing_loggers': False, # 通过formatter属性来配置日志的输出格式 # formatter中的每一个键对应一个特定的输出格式 'formatters': { # 配置一个名为verbose的日志输出格式 'verbose': { 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}' }, # 配置一个名为simple的日志输出格式 'simple': { 'format': '{levelname} {message}', }, }, 'handlers': { # 配置console,用来将日志输出到控制台 'console': { # 配置日志级别为DEBUG 'level': 'DEBUG', # require_debug_true表示在django debug为True时才在屏幕打印日志 'filters': ['require_debug_true'], # 使用logging模块的StreamHandler来进行日志处理 'class': 'logging.StreamHandler', # 引用的是formatter中的simple 'formatter': 'simple' }, # 配置default,表示默认的日志处理方法 'default': { # 配置日志级别为INFO 'level': 'INFO', #使用RotatingFileHandler来进行日志的滚动处理 'class': 'logging.handlers.RotatingFileHandler', # 配置日志的输出文件 'filename': os.path.join(BASE_DIR+'/logs/', "chipscoco.log"), # 配置日志文件的最大大小,超出阈值即开始切日志 'maxBytes': 1024 * 1024 * 50, # 配置日志文件的备份数目 'backupCount': 3, # 引用的是formatter中的verbose 'formatter': 'verbose', # 配置日志文件的字符编码为utf-8 'encoding': 'utf-8', } }, # loggers的每一个键表示一个logging实例 'loggers': { 'django': { # 引用handlers中配置的日志处理方式 'handlers': ['default', 'console', ], # 日志级别 'level': 'DEBUG', # propagate表示是否向更高级别的logger传递 'propagate': True, }, # 名为 'collect'的logger负责将日志输出到控制台 'collect': { 'handlers': ['console', ], 'level': 'INFO', }, } }
关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。