logging是Python 2.3起自带的标准模块,能够用来从运行状态的程序中记录日志。logging模块的功能很是强大,能够很是灵活的向各类预约或者自定的目标输出日志。而利用标准的logging模块,Django程序就能够轻松实现运行环境下的日志输出,这对于开发以及部署环境下程序运行具体状况的监控和调试都是不可或缺的,因此我在这里总结一下本身的一些经验。python
Django程序使用logging输出的基本设置
要让Django程序正确得利用logging模块输出日志,首先须要在settings.py中配置好logging参数:正则表达式
<!-- lang: python --> loggin.basicConfig( level = logging.DEBUG, format = '%(asctiome)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s', )
logging.basicConfig
是logging模块提供的简便配置logging参数的方法。通过以上的配置,在Django程序中只须要经过logging.debug,logging.info等方法就能够输出日志了。django
logging.DEBUG
及以上级别的日志都会直接输出到django运行时当前命令窗口,而在生产环境下,只须要相应的提升logging输出级别就能够控制日志输出的内容,避免输出过多日志内容。
(关于logging级别和logging的基本知识请参考pydoc) 在本地调试使用manage.py runserver
的时候,logging内容就会直接出如今console里。命令行
以上的基本设置只能让日志直接输出到命令行窗口。须要把日志输出到文件保存的话最简便的方法是这样debug
<!-- lang: python --> logging.basicConfig( level = logging.DEBUG, format = '%(asctiome)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s', filename = '/path/to/logfile/filelog.log', )
在logging.basicConfig方法中,只要指定了filename,那么日志就会直接输出到指定的文件了。调试
在生产环境下,不只须要把日志写到文件,一般还须要把日志文件按日期分割保存。这样的任务用logging模块也很容易作到。在生产环境的settings.py
里使用以下设置:日志
<!-- lang: python --> root = logging.getLogger() if len(root.handlers) == 0 #避免重复 level = logging.INFO filename = '/path/to/logfile/filelog.log' format = '%(asctiome)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s' hdlr = TimedRotatingFileHandler(filename,"midnight",1,5) fmt = Formatter(format) hdlr.setFormatter(fmt) root.addHandler(hdlr) root.setLevel(level)
在这里使用了logging模块预约义的TimedRotatingFileHandler
类,在天天半夜滚动日志文件,而最多保留5个以往的日志文件。因为须要指定特殊的Handler,因此这里不能使用logging.basicConfig
的简便方法。code
用好日志功能能够对开发和调试起到不少帮助做用。使用了logging模块能够经过日志级别很是方便的控制输出,不须要增减任何程序代码,只须要在settings.py
中更改logging级别一行代码就好了。orm
因此在开发过程当中,能够尽可能多用logging.debug
输出对调试有帮助的内容。而在生产环境下,经过日志也能够方便的分析真实运行环境下的一些问题,便于调试修改bug。server
若是用在Google App Engine,不须要指定输出文件,程序输出的日志都会直接保存在App Engine运行日志中,还能够经过正则表达式来搜索以往日志。
另外,经过Django debug toolbar,能够方便的直接在调试环境下直接在每一个页面上查看输出的日志,很是好用。
因此,若是你在写Django程序,就不要再用原始的print了,用好logging能够事半功倍。