原文: 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.

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 最佳实践: 如何设置和使用 Log(转)的更多相关文章

  1. Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

    Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...

  2. Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据

    Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据 1. 1. 配置条件字段@Conditional 1 1 2. 2. 配置条件字段 ...

  3. django 强制登录最佳实践

    参考: https://python-programming.courses/recipes/django-require-authentication-pages/ 即通过中间件来做AOP拦截.不用 ...

  4. Django 1.6 最佳实践: 如何正确使用 Signal(转)

    原文:http://www.weiguda.com/blog/38/ 如何正确的使用signal: 简单回答是: 在其他方法无法使用的情况下, 才最后考虑使用signal. 因为新的django开发人 ...

  5. Django 1.6 最佳实践: django项目的服务器自动化部署(转)

    原文:http://www.weiguda.com/blog/41/ 当我们设置服务器时, 不应该每次都使用ssh登录服务器, 再按照记忆一步一步的配置. 因为这样实在是太容易忘记某些步骤了. 服务器 ...

  6. Django REST Framework 最佳实践

    Django REST framework 是一个强大且灵活的工具包,用以构建Web APIs. 为什么要使用REST framework? - 在线可视的API,对于赢得你的开发者们十分有用 - 验 ...

  7. 【Python】Django 时间字段 最佳实践

    . python datetime from datetime import datetime datetime.now() datetime.utcnow() from datetime impor ...

  8. Atitit.列表页and查询条件的最佳实践(1)------设定搜索条件and提交查询and返回json数据

    Atitit.列表页and查询条件的最佳实践(1)------设置查询条件and提交查询and返回json数据 1. 1. 配置条件字段@Conditional 1 1 2. 2. 配置条件字段显示类 ...

  9. Django最佳实践(中文版)

    这是一份关于开发和部署 Django Web 框架 的动态文档 (会随时更新). 这些准则不应该被认为是 绝对正确 或 唯一 使用 Django 的方法, 应该说这些最佳实践是我们使用框架多年来积累的 ...

随机推荐

  1. Codeforces Round #209 (Div. 2)C

    刷了一页的WA  ..终于发现了 哪里错了 快速幂模板里一个变量t居然开得long  ... 虽然代码写的丑了点 但是是对的 那个该死的long 啊.. #include <iostream&g ...

  2. Codeforces Round #272 (Div. 2) D. Dreamoon and Sets (思维 数学 规律)

    题目链接 题意: 1-m中,四个数凑成一组,满足任意2个数的gcd=k,求一个最小的m使得凑成n组解.并输出 分析: 直接粘一下两个很有意思的分析.. 分析1: 那我们就弄成每组数字都互质,然后全体乘 ...

  3. 函数lock_rec_get_first_on_page

    lock结构体 详见 /*********************************************************************//** Gets the first ...

  4. UINavigationController的使用

    1.UINavigationController使用流程 UINavigationController为导航控制器,在iOS里经常用到. 我们看看它的如何使用: 下面的图显示了导航控制器的流程.最左侧 ...

  5. python 包管理

    如果导入的模块和主程序在同个目录下,直接import就行了 2.如果导入的模块是在主程序所在目录的子目录下,可以在子目录中增加一个空白的__init__.py文件,该文件使得python解释器将子目录 ...

  6. HDU Sky数 2097

    解题思路:类比求出10进制数各个位上的数字之和,求出12进制和16进制上的数. #include<cstdio> #include<cstring> #include<a ...

  7. yii2 html下拉框

    下拉框 带默认值 <?php $form=ActiveForm::begin(); echo $form->field($model,'uname', ['inputOptions'=&g ...

  8. 《Unix网络编程》卷2 读书笔记 第1章-简介

    1. 概述 2. 进程.线程与信息共享 Unix进程间的信息共享有多种方式:注意下图中内核的位置   左边的两个进程共享存留于文件系统中某个文件上的某些信息.为访问这些信息,每个进程都得穿越内核. 中 ...

  9. 用VS2010打开vs2008

    用VS2010打开vs2008,对应的9.0.0.0版本,而应该该使用版本10.0.0.0 解决方案:修改配置文件.将Microsoft.ReportViewer的版本为9.0.0.0改为10.0.0 ...

  10. js浮点数运算需要注意的问题

    最近在js运算浮点数时发现了一个问题.问题是这样的:js函数中处理两个浮点数的相加,为了防止出现0.1+0.2=0.30000000000000004的问题,两个数都先乘以10000后再相加,得到结果 ...