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快速查找算法应用实例
Sep 26 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
Django 使用logging打印日志的实例
Apr 28 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
python绘制热力图heatmap
Mar 23 Python
Flask框架工厂函数用法实例分析
May 25 Python
Python 列表去重去除空字符的例子
Jul 20 Python
python对常见数据类型的遍历解析
Aug 27 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
Pandas自定义选项option设置
Jul 25 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
Discuz! Passport 通行证整合
2008/03/27 PHP
建站常用13种PHP开源CMS比较
2009/08/23 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
简单实用的全选反选按钮例子
2013/10/18 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
进一步探究Python的装饰器的运用
2015/05/05 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
骨干教师培训感言
2014/01/16 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
结婚纪念日感言
2015/08/01 职场文书
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL