记录应用错误

来源:互联网 发布:加拿大地缘政治知乎 编辑:程序博客网 时间:2024/06/05 23:47
记录应用错误即使正确的代码也可能出现错误的情况:1.客户端在应用读取到达数据时,提前终止请求2.数据库服务器超载,并无法处理查询3.文件系统满了4.硬盘损坏5.后端服务器超载6.你所用的库出现程序错误7.服务器的网络连接或其他系统故障错误邮件正常情况下,日志文件只有在程序运行中产生错误的时候才会让人关注,所以一种处理方式是在程序产生错误的时候,发送一封邮件Flask 使用Python内置的日志系统,以下列出如果何配置Flask日志记录器想你发送报告异常的邮件ADMINS = ['yourname@example.com']if not app.debug:import loggingfrom logging.handlers import SMTPHandlermail_handler = SMTPHandler('127.0.0.1','server-error@example.com',ADMINS,'Your app failed.')mail_handler.setLevel(logging.ERROR)app.logger.addHandler(mail_handler)#首先ADMINS配置一个接受错误信息的邮件地址#在生产模式中一般不会设置debug为True#mail_handler用来监听服务器地址,一旦发现错误#通过server-error@example.com向ADMINS发送一封#主题为'Your app failed..'的邮件#同时设置一个错误等级,来确保接受ERROR以上的错误信息记录到文件即使是收到了邮件,可能还需要记录警告,在调试问题的时候,收集更多的信息是一个好主意。Flask核心系统本身不会发出警告,所以需要自己动手来解决比较常用的几个处理错误的方法1.FileHandler - 在文件系统上记录日志2.RotatingFileHandler - 在文件系统上记录日志,并且在消息达到一定数目时,会滚动记录3.NTEventLogHandler - 记录到Windows系统中的系统事件日志4.SysLogHandler - 发送日志到Linux的系统日志选择了日志处理程序以后,可以像上边的SMTP处理程序一样,不过建议使用一个低等级的Level(推荐WARNING)示例if not app.debug:import loggingfrom themodule import TheHandlerYouWant#想要用的模块名file_handler = TheHandlerYouWant(...)#想要用的模块名,括号内为其所需参数file_handler.setLevel(logging.WARNING)app.logger.addHandler(file_handler)控制日志格式默认情况下,错误处理只会把消息的字符串记录到文件,或者通过邮件发送给你。为了审查错误的原因,并了解错误发生的位置,需要更详细的记录日志以下示例,展示了如果更详细的配置邮件和日志文件邮件:from logging import Formattermail_handler.setFormatter(Formatter('''Message type:       %(levelname)sLocation:           %(pathname)s:%(lineno)dModule:             %(module)sFunction:           %(funcName)sTime:               %(asctime)sMessage:%(message)s'''))日志文件from logging import Formatterfile_handler.setFormatter(Formatter(    '%(asctime)s %(levelname)s: %(message)s '    '[in %(pathname)s:%(lineno)d]'))# setFormatter中参数的解释# 格式        描述# %(levelname)s消息文本的记录等级 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').# %(pathname)s发起日志记录调用的源文件的完整路径(如果可用)# %(filename)s路径中的文件名部分# %(module)s模块(文件名的名称部分)# %(funcName)s包含日志调用的函数名# %(lineno)d日志记录调用所在的源文件行的行号(如果可用)# %(asctime)sLogRecord #                 创建时的人类可读的时间。#                 默认情况下,格式为 "2003-07-08 16:49:45,896" (逗号后的数字时间的毫秒部分)。#                 这可以通过继承 :class:~logging.Formatter,并重载 formatTime() 改变。# %(message)s    记录的消息,视为 msg % args其他的库在logging包中有一个方法可以一次性配置所有的日志记录器,但是不推荐这么做。因为可能存在一种情况,但你想要在同一个Python解释器中并排运行多个独立的应用时,则不可能对他们的日志记录器做不同的设置作为替代,推荐找出想用的日志记录器,用getLogger()函数来获取日志记录器,并且遍历它们来附加处理程序示例from logging import getLoggerloggers = [app.logger,getLogger('sqlalchemy'),getLogger('otherlibrary')]for logger in loggers:logger.addHandler(mail_handler)logger.addHandler(file_handler)调试器操作为了深入跟踪代码执行,Flask提供了一个方框外的调试器。如果想用其他的Python调试器,请注意相互的调试器接口。使用自己想要用的调试器之前,需要设置一下的参数:debug - 是否开启调试模式并捕获异常use_debugger - 是否使用内部的Flask调试器use_reloader - 是否在异常时重新载入并创建子进程debug必须设置为True以后,才允许设置其他两个选项的值如果使用Aptana/Eclipse来调试,需要把use_debugger和use_reloader都设置为False示例(Aptana)配置模式的设置如下FLASK:    DEBUG:True    DEBUG_WITH_APTANA:True接下来在应用的入口,写入以下内容if __name__ == '__main__':app = create_app(config='config.yaml')if app.debug:use_debugger = True#use_debugger表示使用Flask内部的调试器#因为我们要使用Aptana所以要禁用Flask内部调试器try:use_debugger = not(app.config.get('DEBUG_WITH_APTANA'))#此语句判断,如果是使用Aptana,则通过not语句将#Flask内部的调试器设为Falseexcept:passapp.run(use_debugger=use_debugger,debug=app.debug,use_reloader=use_reloader,host='0.0.0.0')

原创粉丝点击