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 open读写文件实现脚本
Sep 06 Python
python实现一个简单的并查集的示例代码
Mar 19 Python
win10下tensorflow和matplotlib安装教程
Sep 19 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
python将dict中的unicode打印成中文实例
May 11 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 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
基于Zookeeper的使用详解
2013/05/02 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
python实现处理mysql结果输出方式
2020/04/09 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
Intersport西班牙:在线体育商店
2019/11/06 全球购物
银行领导班子四风对照检查材料
2014/09/27 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
山楂树之恋观后感
2015/06/11 职场文书
童年读书笔记
2015/06/26 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书