前言
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, }, } }
以上的配置文件中,有三个日志处理器。分别是:
‘django.request':django的request发生error会自动记录,然后使用debug将信息记录到文件,还有mail_admins将信息通过邮件发送给管理员。这里邮件的功能非常棒!并不是一个纯文本信息,而是一个html文件,和我们在浏览器看到的错误页面一模一样!要正常使用邮件功能需要像我一样配置一下上面的邮件发件人信息。我是直接去网易申请了一个邮箱。要格外注意三点:1.一定要去邮件服务商开启smtp服务;2.不同的邮件服务商可能有一些特殊的设置,比如网易,会给你一个客户端授权码,这个才是密码,而不是网页的登录密码。3 注意服务商有没有对发信频率的限制。
‘django':使用console处理器,将信息输出。在开发的时候就可以使用这个处理器(什么?print? 太low了!)
最后一个处理器见注释。
最后,不要忘了给日志的路径响应的权限。比如apache2服务器,就需要给www-data写权限:
sudo chown -r [yourname]:www-data [log] sudo chmod -r g+s [log]
总结
【相关推荐】
1. python免费视频教程
2. python遇见数据采集视频教程
3. python学习手册
以上就是django日志模块的配置详解的详细内容。
