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之变量和参数
Oct 10 Python
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python利用多进程将大量数据放入有限内存的教程
Apr 01 Python
Python中正则表达式的详细教程
Apr 30 Python
浅析Python基础-流程控制
Mar 18 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
python3 shelve模块的详解
Jul 08 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
python元组的概念知识点
Nov 19 Python
python绘制随机网络图形示例
Nov 21 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python requests库的使用
Jan 06 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版本号
2006/10/09 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Python元字符的用法实例解析
2018/01/17 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
django框架ModelForm组件用法详解
2019/12/11 Python
python实现按关键字筛选日志文件
2019/12/24 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
物流专业毕业生推荐信范文
2013/11/18 职场文书
酒店司机岗位职责
2013/12/14 职场文书
服务之星获奖感言
2014/01/21 职场文书
设计师求职信
2014/07/01 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
MySQL注入基础练习
2021/05/30 MySQL
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
Python采集壁纸并实现炫轮播
2022/04/30 Python