Django项目如何正确配置日志(logging)


Posted in Python onApril 29, 2021

当Django项目正式部署上线后,我们需要设置DEBUG = False。这时开发者应怎样检查Django程序在生产环境运行时有什么异常或错误呢?答案就是日志(logging)。在生产环境中,Django默认是不会在服务器上自动生成log文件的,即使程序出现error级别的故障也不会通知管理员。本文将教你如何在Django项目中正确配置日志(logging),让Django生成log日志文件,并在程序运行发生error级别故障时通知管理员。

日志基础知识

日志与我们的软件程序密不可分。它记录了程序的运行情况,可以给我们调试程序和故障排查提供非常有用的信息。每一条日志信息记录了一个事件的发生。具体而言,它包括了:

  • 事件发生时间
  • 事件发生位置
  • 事件的严重程度--日志级别
  • 事件内容

日志的级别又分为:

  • DEBUG:用于调试目的的低级系统信息
  • INFO:一般系统信息
  • WARNING:描述已发生的小问题的信息。
  • ERROR:描述已发生的主要问题的信息。
  • CRITICAL:描述已发生的严重问题的信息。

在Django项目中,我们可以针对日志的不同级别设置不同的处理方式。比如INFO级别及以上的日志我们写入到log文件里保存,Error级别及以上的日志我们直接通过邮件发送给系统管理员。

Django的日志模块

Django的日志模块其实就是python的logging模块。它由4部分组成:

  • Logger 记录仪:生成和记录每条日志信息及级别
  • Handler处理程序: 根据日志信息级别交由相应处理程序处理(比如生成文件或发送邮件)
  • Filters 过滤器:日志交由处理程序处理前需要满足的过滤条件(比如Debug=True或False)
  • Formaters 格式化程序:决定每条日志的打印输出格式,可以有完整版的,也有简单版的

一个logger记录仪的例子如下所示。当程序运行出现错误时,它生成了一条级别为error的日志信息。这条记录产生后就会交由Handler处理。

# import the logging library
import logging
# 获得logger实例
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
    ...
    if error_happens:
        # Log an error message
        logger.error('Something went wrong!')

当Debug=True时,日志信息默认在console输出。现在我们还需要在django配置文件里配置日志(logging)相关内容,使得当Debug=False时,日志信息会输出到日志文件里或发送给系统管理员。

settings.py推荐日志配置信息

以下基本配置信息在django cookiecutter推荐使用的logging配置信息上做了修改,可适合大部分项目使用。如果真的希望发送和接收到邮件还需在settings.py正确配置电子邮箱Email。

# 给ADMINS发送邮件需要配置
ADMINS = (
 ('admin_name','your@gmail.com'),
)
MANAGERS = ADMINS
# 创建log文件的文件夹
LOG_DIR = os.path.join(BASE_DIR, "logs")

# 基本配置,可以复用的
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}},
    "formatters": { # 定义了两种日志格式
        "verbose": { # 标准
            "format": "%(levelname)s %(asctime)s %(module)s "
            "%(process)d %(thread)d %(message)s"
        },
        'simple': { # 简单
            'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
        },
    },
    "handlers": { # 定义了三种日志处理方式
        "mail_admins": { # 只有debug=False且Error级别以上发邮件给admin
            "level": "ERROR",
            "filters": ["require_debug_false"],
            "class": "django.utils.log.AdminEmailHandler",
        },
        'file': { # Info级别以上保存到日志文件
            'level': 'INFO', 
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,根据文件大小自动切
            'filename': os.path.join(LOG_DIR,"info.log"),  # 日志文件
            'maxBytes': 1024 * 1024 * 10,  # 日志大小 10M
            'backupCount': 2,  # 备份数为 2
            'formatter': 'simple', # 简单格式
            'encoding': 'utf-8',
        },
        "console": { # 打印到终端console
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "verbose",
        },
    },
    "root": {"level": "INFO", "handlers": ["console"]},
    "loggers": {
        "django.request": { # Django的request发生error会自动记录
            "handlers": ["mail_admins"],
            "level": "ERROR",
            "propagate": True,  # 向不向更高级别的logger传递
        },
        "django.security.DisallowedHost": { # 对于不在 ALLOWED_HOSTS 中的请求不发送报错邮件
            "level": "ERROR",
            "handlers": ["console", "mail_admins"],
            "propagate": True,
        },
    },
}

以上就是Django项目如何正确配置日志(logging)的详细内容,更多关于Django 正确配置日志的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 实现链表实例代码
Apr 07 Python
python使用KNN算法手写体识别
Feb 01 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
Python实现的银行系统模拟程序完整案例
Apr 12 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
python实现移动木板小游戏
Oct 09 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
django上传文件的三种方式
Apr 29 #Python
详解Django的MVT设计模式
Django如何与Ajax交互
Apr 29 #Python
Python爬虫进阶之Beautiful Soup库详解
Apr 29 #Python
win10+anaconda安装yolov5的方法及问题解决方案
Python图像处理之图像拼接
4种非常实用的python内置数据结构
Apr 28 #Python
You might like
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
PHP扩展开发入门教程
2015/02/26 PHP
php curl常用的5个经典例子
2017/01/20 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
python并发和异步编程实例
2018/11/15 Python
kafka-python批量发送数据的实例
2018/12/27 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
python全栈开发语法总结
2020/11/22 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
numpy实现RNN原理实现
2021/03/02 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
美国性感女装网站:bebe
2017/03/04 全球购物
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
高一自我鉴定
2013/12/17 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
带你了解Java中的ForkJoin
2022/04/28 Java/Android