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代码实现
Jan 16 Python
Django视图和URL配置详解
Jan 31 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python增加图像对比度的方法
Jul 12 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
Python常用编译器原理及特点解析
Mar 23 Python
如何在Python 游戏中模拟引力
Mar 27 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 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
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
PHP图片水印类的封装
2017/07/06 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
javascript读取RSS数据
2007/01/20 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python简单进程锁代码实例
2015/04/27 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
解决Python使用列表副本的问题
2019/12/19 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Python使用Pygame绘制时钟
2020/11/29 Python
捷克玩具商店:Bambule
2019/02/23 全球购物
项目建议书格式
2014/03/12 职场文书
工作说明书格式
2014/07/29 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
雾霾停课通知
2015/04/24 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS