Django日志模块logging的配置详解


Posted in Python onFebruary 14, 2017

前言

Django对于日志输出的信息是很完善的,request的信息,setting配置,trackback的信息,一应俱全,足够我们调试了。但是在线上环境,如果让用户看到这些信息,是很不安全的(暴露代码)。所以在线上我们要关闭Debug,但是又不能扔掉这些调试信息,这就要用到logging模块。

logging模块其实是Python的模块,在Django中有很多本地化的支持。

理解Logger

首先要理解logging的工作,这里面主要有四个东西:格式器formatter,过滤器filter,处理器handler,日志实例logger。

处理流程

formatter
logger ----> handler ----------------> files, emails
    filter

处理流程是这样的。首先,在代码中。我们拿到的是logger实例,通过这个实例来记录信息。

# import the logging library
import logging
 
# Get an instance of a logger
logger = logging.getLogger('django')
 
def my_view(request, arg1, arg):
 ...
 if bad_mojo:
 # Log an error message
 logger.error('Something went wrong!')

然后,名字是django的这个logger就会把信息交给相应的handler,handler把信息用formater和filter处理一下,提交log(保存到文件,数据库,或者发送邮件)。

一般来说,handler可以是send_email,error_file等负责处理的方式,在logger中可以重复使用handler。例如我们的django处理器使用了send_email, error_file 这两个处理器,request处理器使用error_file,info_file两个处理器,logger和handler可以理解成多对多的关系,嘻嘻。

配置方式

Python中可以使用多种格式配置logging,比如.conf, .ini等。

在Django中,我们是把有关logging的配置写到settings里面。相应的配置及解释如下(仅供参考)。

#管理员邮箱
ADMINS = (
 ('laixintao','*******@163.com'),
)
 
#非空链接,却发生404错误,发送通知MANAGERS
SEND_BROKEN_LINK_EMAILS = True
MANAGERS = ADMINS
 
#Email设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST= 'smtp.163.com'#QQ邮箱SMTP服务器(邮箱需要开通SMTP服务)
EMAIL_PORT= 25 #QQ邮箱SMTP服务端口
EMAIL_HOST_USER = '**********@163.com' #我的邮箱帐号
EMAIL_HOST_PASSWORD = '**************' #授权码
EMAIL_SUBJECT_PREFIX = 'website' #为邮件标题的前缀,默认是'[django]'
EMAIL_USE_TLS = True #开启安全链接
DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER #设置发件人
 
#logging日志配置
LOGGING = {
 'version': 1,
 'disable_existing_loggers': True,
 'formatters': {#日志格式 
 'standard': {
  'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'} 
 },
 'filters': {#过滤器
 'require_debug_false': {
  '()': 'django.utils.log.RequireDebugFalse',
  }
 },
 'handlers': {#处理器
 'null': {
  'level': 'DEBUG',
  'class': 'logging.NullHandler',
 },
 'mail_admins': {#发送邮件通知管理员
  'level': 'ERROR',
  'class': 'django.utils.log.AdminEmailHandler',
  'filters': ['require_debug_false'],# 仅当 DEBUG = False 时才发送邮件
  'include_html': True,
 },
 'debug': {#记录到日志文件(需要创建对应的目录,否则会出错)
  'level':'DEBUG',
  'class':'logging.handlers.RotatingFileHandler',
  'filename': os.path.join(BASE_DIR, "log",'debug.log'),#日志输出文件
  'maxBytes':1024*1024*5,#文件大小 
  'backupCount': 5,#备份份数
  'formatter':'standard',#使用哪种formatters日志格式
 },
 'console':{#输出到控制台
  'level': 'DEBUG',
  'class': 'logging.StreamHandler',
  'formatter': 'standard',
 },
 },
 'loggers': {#logging管理器
 'django': {
  'handlers': ['console'],
  'level': 'DEBUG',
  'propagate': False 
 },
 'django.request': {
  'handlers': ['debug','mail_admins'],
  'level': 'ERROR',
  'propagate': True,
 },
 # 对于不在 ALLOWED_HOSTS 中的请求不发送报错邮件
 'django.security.DisallowedHost': {
  'handlers': ['null'],
  'propagate': False,
 },
 } 
}

以上的配置文件中,有三个日志处理器。分别是:

  1. ‘django.request':django的request发生error会自动记录,然后使用debug将信息记录到文件,还有mail_admins将信息通过邮件发送给管理员。这里邮件的功能非常棒!并不是一个纯文本信息,而是一个html文件,和我们在浏览器看到的错误页面一模一样!要正常使用邮件功能需要像我一样配置一下上面的邮件发件人信息。我是直接去网易申请了一个邮箱。要格外注意三点:1.一定要去邮件服务商开启SMTP服务;2.不同的邮件服务商可能有一些特殊的设置,比如网易,会给你一个客户端授权码,这个才是密码,而不是网页的登录密码。3 注意服务商有没有对发信频率的限制。
  2. ‘django':使用console处理器,将信息输出。在开发的时候就可以使用这个处理器(什么?print? 太low了!)
  3. 最后一个处理器见注释。

最后,不要忘了给日志的路径响应的权限。比如Apache2服务器,就需要给www-data写权限:

sudo chown -R [yourname]:www-data [log]
sudo chmod -R g+s [log]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python通过pil为png图片填充上背景颜色的方法
Mar 17 Python
仅利用30行Python代码来展示X算法
Apr 01 Python
Python映射拆分操作符用法实例
May 19 Python
python更新列表的方法
Jul 28 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
python实现事件驱动
Nov 21 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
python二进制文件的转译详解
Jul 03 Python
Python读取实时数据流示例
Dec 02 Python
如何在VSCode下使用Jupyter的教程详解
Jul 13 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
Python中的 No Module named ***问题及解决
Jul 23 Python
深入理解Python对Json的解析
Feb 14 #Python
Python 2与Python 3版本和编码的对比
Feb 14 #Python
利用Python爬虫给孩子起个好名字
Feb 14 #Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
Feb 14 #Python
让python 3支持mysqldb的解决方法
Feb 14 #Python
python用装饰器自动注册Tornado路由详解
Feb 14 #Python
利用python程序生成word和PDF文档的方法
Feb 14 #Python
You might like
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
php检测文件编码的方法示例
2014/04/25 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
php实现微信模板消息推送
2018/03/30 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
Augularjs-起步详解
2016/07/08 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
微信小程序实现蓝牙打印
2019/09/23 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
python 中文字符串的处理实现代码
2009/10/25 Python
详解Python中break语句的用法
2015/05/14 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
python从入门到精通(DAY 3)
2015/12/20 Python
python append、extend与insert的区别
2016/10/13 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
自我介绍演讲稿
2014/01/15 职场文书
文字自荐书范文
2014/02/10 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书