Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第十三章:django实用工具 > 13.1节:日志处理

13.1节:日志处理

薯条老师 2020-10-21 06:54:31 232252 0

编辑 收藏

系统地讲解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视频课程。

小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。


欢迎 发表评论: