Py学习  »  Django

5分钟教你学会Django系统错误监控

马哥Linux运维 • 6 年前 • 1681 次点击  

话不多说,直入正题。

先上图,看一下监控的效果。

如下是监控我们网站系统错误的邮件。包含了请求的url地址,以及详细的异常信息。

一、监控所有的request请求


如何实现系统监控,自动发送错误日志的邮件呢?

只需配置配置settings文件即可。

1.设置发送邮件配置信息

邮件会发送到ADMINS设定的邮件列表中。

SERVER_EMAIL ='sender@qq.com'

DEFAULT_FROM_EMAIL ='sender@qq.com'

ADMINS = (('receiver','receiver@qq.com'),)

EMAIL_HOST ='smtp.exmail.qq.com'

EMAIL_HOST_USER ='sender@qq.com'

EMAIL_HOST_PASSWORD ='123456'

EMAIL_BACKEND ='django.core.mail.backends.smtp.EmailBackend'

2.配置LOGGING

1)配置mail_admin的handler

level为日志级别

django.utils.log.AdminEmailHandler为django处理系统日志发送邮件的handler

在没有配置filter参数情况下,默认发送系统5XX状态的错误日志

'handlers': {

    'mail_admin': {

    'level':'ERROR',

    'class':'django.utils.log.AdminEmailHandler',

    'include_html':False,

    }

}

2)配置django.request模块的logger

将django的request模块配置如上的mail_admin handler

'loggers': {

    'django.request': {

    'handlers': ['default','mail_admin'],

    'propagate':True,

    'level':'ERROR',

    },

}

二、监控非request请求


如何监控例如系统的定时任务等非用户发起的功能模块,我们可以自定义一个decorator来解决这个问题。

utils.send_exception_email(email_list,title,exc)为发送邮件的方法,可以自己实现,非常简单

def decorator_error_monitor(title):

    def wrap(f):

        def wrapped_f(*args,**kwargs):

            try:

                result = f(*args,**kwargs)

                return result

           except:

               exc = traceback.format_exc()

               utils.send_exception_email(email_list,title,exc)

               raise Exception(exc)

            return wrapped_f

        return wrap

对需要监控的方法使用decorator

@decorator_error_monitor("清算错误")

def do_settlement(users):

    for user in users:

        process_settlement_for_one_user(user)

监控效果如下图所示:

小结


以上监控方法,简单实用,无需开发额外的日志监控系统,可以在第一时间发现系统的问题,并得知系统的错误日志,帮助快速的定位问题。


作者:MrLeo1024
来源:http://www.jianshu.com/p/42e4287ffeda



————广告时间————

马哥教育2017年Python自动化运维开发实战班,马哥联合BAT、豆瓣等一线互联网Python开发达人,根据目前企业需求的Python开发人才进行了深度定制,加入了大量一线互联网公司:大众点评、饿了么、腾讯等生产环境真是项目,课程由浅入深,从Python基础到Python高级,让你融汇贯通Python基础理论,手把手教学让你具备Python自动化开发需要的前端界面开发、Web框架、大监控系统、CMDB系统、认证堡垒机、自动化流程平台六大实战能力,让你从0开始蜕变成Hold住年薪20万的Python自动化开发人才

扫描二维码领取学习资料




感谢您抽出  · 来阅读此文

更多Python好文请点击【阅读原文】哦

↓↓↓



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/HmeAWnBTp3
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3537
 
1681 次点击  
文章 [ 1 ]  |  最新文章 6 年前
jieshaodmm
Reply   •   1 楼
jieshaodmm    6 年前

一般情况下你不需要定义这个字段,django会默认自动帮你生成一个自增的主键字段。

from django.db import models

class User(models.Model):
                # id = models.AutoField(primary_key=True)
                name = models.CharField(max_length=32, verbose_name='名字')
                # 其他内容

上面注释掉的就是django帮我们添加的

如果你想自己定义主键字段,而且你这里用UUIDField,可以这样写:

import uuid
from django.db import models

class MyUUIDModel(models.Model):
    user_id = models.UUIDField(primary_key=True, default=uuid.uuid3, editable=False)
    # 其他内容
生当为何你知吗
Reply   •   2 楼
生当为何你知吗    6 年前

你好,我是一个Django初学者,在使用Django开发的时候遇到一个问题: 我在models.py中创建一张User表,包含一个userId字段,并设置它为唯一键默认值是uuid.uuid3().

然后在admin中添加一个user的时候报错(userId字段不能重复),也就是说 admin并不是在每次创建user的时候都会给一个随机的userId,请问此处我应该怎么改才能满足需求?,请帮忙回答谢谢!!