Django 1.6 最佳实践: 如何设置和使用 Log(转)
2014-12-23 23:50
453 查看
原文: http://www.weiguda.com/blog/37/
任何参与过高要求的大型项目的编程人员都明白设置适当的log等级, 创建不同的logger, 记录重要事件的重要性. 正确的设置和使用log并不是一件容易的事, 但
对于系统的稳定性而言, logging则是必不可少的. log不仅能用来debug程序, 并能追踪影响程序表现的指标.
之前我们提到需要定期查看access和error文件, 除了记录这些外, 还需要定期查看log文件, 以保证程序安全.
本片的内容主要关于Django项目的log. 但除此之外, 还有服务器log, 数据库log等, 这些都为我们提供了检测系统运行状况的依据.
不同的log等级分别是: DEBUG, INFO, WARING, ERROR和CRITICAL.
DEBUG: 在正式服务器中不使用DEBUG等级. 当你想使用print显示默写信息时, 使用DEBUG log代替.
CRITICAL: 当任何导致项目崩溃的事件发生时使用. 这一等级在Django自身的代码中从未使用过, 但我们还是可以在极严重错误发生时使用, 例如关键性的第三方服务无法响应时
ERROR: 当代码抛出exception但未被捕捉到时, 或任何值得通知项目负责人的错误发生时使用. 例如Django项目发生500错误时, 默认便以ERROR等级记录并通知项目管理人员. 再例如view中的第三方API无法使用时
WARNING: 当任何不寻常, 可能带来潜在危险的事件发生, 但不及ERROR时. 例如Django发生403错误时, 默认使用WARNING记录. 当使用django-admin-honeypot记录到由用户登录虚假的admin界面时.
INFO: 当需要记录有用的信息时. 例如开启关闭某一模块, 状态改变, 权限更改等, 再例如用INFO等级记录与系统表现相关的信息, 帮助我们找到系统瓶颈.
使用DEBUG log代替print的例子:
Logger.exception(): 自动记录traceback, 并以ERROR等级log
对于其他log level, 使用exc_info argument
这样做的好处是, 你可以为特定模块开启或关闭logger. 例如, 当正式服务器上出现问题, 但我们无法再开发服务器重现这一问题时, 我们便可以在正式服务器上
开启相关模块的logger来帮助我们debug. 待解决问题后, 再关闭该logger, 而不需要开启整站的logger.
除此之外, 我们建议将INFO及以上的log记录到rotating文件中. 记录到磁盘的log可以在没有网路的情况下帮助我们解决问题, rotation则能保证文件不会太大贰
占据整个系统.最常见的使用rotation文件记录log的方法是使用logging.handlers.WatchedFileHandler配合UNIX的logrotate工具.
任何参与过高要求的大型项目的编程人员都明白设置适当的log等级, 创建不同的logger, 记录重要事件的重要性. 正确的设置和使用log并不是一件容易的事, 但
对于系统的稳定性而言, logging则是必不可少的. log不仅能用来debug程序, 并能追踪影响程序表现的指标.
之前我们提到需要定期查看access和error文件, 除了记录这些外, 还需要定期查看log文件, 以保证程序安全.
本片的内容主要关于Django项目的log. 但除此之外, 还有服务器log, 数据库log等, 这些都为我们提供了检测系统运行状况的依据.
不同的log等级分别是: DEBUG, INFO, WARING, ERROR和CRITICAL.
1. 如何选择log level
log等级是在Django settings中设置的, 因此我们可以根据需要进行适当的调节.DEBUG: 在正式服务器中不使用DEBUG等级. 当你想使用print显示默写信息时, 使用DEBUG log代替.
CRITICAL: 当任何导致项目崩溃的事件发生时使用. 这一等级在Django自身的代码中从未使用过, 但我们还是可以在极严重错误发生时使用, 例如关键性的第三方服务无法响应时
ERROR: 当代码抛出exception但未被捕捉到时, 或任何值得通知项目负责人的错误发生时使用. 例如Django项目发生500错误时, 默认便以ERROR等级记录并通知项目管理人员. 再例如view中的第三方API无法使用时
WARNING: 当任何不寻常, 可能带来潜在危险的事件发生, 但不及ERROR时. 例如Django发生403错误时, 默认使用WARNING记录. 当使用django-admin-honeypot记录到由用户登录虚假的admin界面时.
INFO: 当需要记录有用的信息时. 例如开启关闭某一模块, 状态改变, 权限更改等, 再例如用INFO等级记录与系统表现相关的信息, 帮助我们找到系统瓶颈.
使用DEBUG log代替print的例子:
import logging from django.views.generic import TemplateView from .helper import pint_counter logger = logging.getLogger(__name__) class PrintView(TemplateView): def get_context_data(self, *args, **kwargs): context = super(PrintView, self).get_context_data(self, *args, **kwargs) pints_remaining = pint_counter() logger.debug("Only %d pints of ice cream left" % pints_remaining) return context
2. 记录exception
当log一个exception时, 如果能统计记录下exception的traceback的话, 对于我们debug十分有用, 我们可以使用:Logger.exception(): 自动记录traceback, 并以ERROR等级log
对于其他log level, 使用exc_info argument
import logging import requests logger = logging.getLogger(__name__) def get_additional_data(): try: r = request.get("http:..example.com/something-optional/") except: request.HTTPError as e: logger.exception(e) logger.debug("Cound not get additional data", exc_info=True) return None return r
3. logger和模块一一对应
当在一个模块中使用logger时, 不要从其他模块中引用, 而应新建一个logger. 你可以在任何模块中使用以下代码, 以获取新的logger:import logging logger = logging.getLogger(__name__)
这样做的好处是, 你可以为特定模块开启或关闭logger. 例如, 当正式服务器上出现问题, 但我们无法再开发服务器重现这一问题时, 我们便可以在正式服务器上
开启相关模块的logger来帮助我们debug. 待解决问题后, 再关闭该logger, 而不需要开启整站的logger.
4. 记录到rotation文件
默认情况下, 当django出现ERROR及以上log时, 系统会通过AdminEmailHandler将log信息发送给settings的ADMINS list中的管理人员.除此之外, 我们建议将INFO及以上的log记录到rotating文件中. 记录到磁盘的log可以在没有网路的情况下帮助我们解决问题, rotation则能保证文件不会太大贰
占据整个系统.最常见的使用rotation文件记录log的方法是使用logging.handlers.WatchedFileHandler配合UNIX的logrotate工具.
相关文章推荐
- (转)Django 1.6 最佳实践: 如何正确的使用和设置Database和Model
- Django 1.6 最佳实践: 如何正确的使用和设置Database和Model
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
- Django 1.6 最佳实践: 如何正确使用 CBVs (Class-based views)
- Django 1.6 最佳实践: 如何正确使用 Signal(转)
- Django 1.6 最佳实践: 如何正确使用 User Model
- Django 1.6 最佳实践: 最佳Django开发环境设置
- Django 1.6 最佳实践: 如何正确进行 Unit Tests
- 教你如何在Django 1.6中正确使用 Signal
- .NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(基础篇)
- Django 当中使用CSS之类的东西如何设置路径
- Git 在团队中的最佳实践--如何正确使用Git Flow
- Django 1.6 最佳实践: django项目的服务器自动化部署(转)
- GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等
- .NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(基础篇)
- 本地安装jdk1.7后,由于Myeclipse使用默认的1.6,如何设置工程支持jdk1.7
- (转)iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等
- 如何在Django中正确的使用和设置Database和Model
- SAP BPC最佳实践-如何配置和使用BPC的钻取Drill through