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 查找文件夹下所有文件 实现代码
Jul 01 Python
举例讲解Python的Tornado框架实现数据可视化的教程
May 02 Python
python实现外卖信息管理系统
Jan 11 Python
Python3.6安装及引入Requests库的实现方法
Jan 24 Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
python scrapy爬虫代码及填坑
Aug 12 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 11 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
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php使用GeoIP库实例
2014/06/27 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
js 上传图片预览问题
2010/12/06 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
python执行get提交的方法
2015/04/29 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
深入了解Python中pop和remove的使用方法
2018/01/09 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
Python socket模块方法实现详解
2019/11/05 Python
pycharm修改file type方式
2019/11/19 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
事业单位接收函
2014/01/10 职场文书
揭牌仪式主持词
2014/03/19 职场文书
网络营销计划书
2015/01/17 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
手写实现JS中的new
2021/11/07 Javascript
英镑符号 £
2022/02/17 杂记
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫