参考官方文档:https://docs.djangoproject.com/en/dev/topics/logging/
logging是Python 2.3起自带的标准模块,可以用来从运行状态的程序中记录日志。logging模块的功能非常强大,可以非常灵活的向各种预定或者自定的目标输出日志。而利用标准的logging模块,Django程序就可以轻松实现运行环境下的日志输出,这对于开发以及部署环境下程序运行具体情况的监控和调试都是不可或缺的,所以我在这里总结一下自己的一些经验。
Django程序使用logging输出的基本设置
输出日志到文件
import logging
logging.basicConfig(
# log level:ERROR、WARN、INFO、DEBUG
level = logging.DEBUG,
format = '%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s',
#filename = 'D:\\workspace_myeclipse\\djangopro_dwz\\log.log',
filename = os.path.join(HERE,'static/log/log.log').replace('\\','/'),
)
按日期循环保存日志文件
import logging
from logging.handlers import TimedRotatingFileHandler
root = logging.getLogger()
if len(root.handlers) == 0: #避免重复
level = logging.INFO
filename = os.path.join(HERE,'static/log/log.log').replace('\\','/')
#filename = 'D:\\workspace_myeclipse\\djangopro_dwz\\log.log'
format = '%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s'
hdlr = TimedRotatingFileHandler(filename,"M",1,10)
fmt = logging.Formatter(format)
hdlr.setFormatter(fmt)
root.addHandler(hdlr)
root.setLevel(level)
import logging
from isp.models import ISPModel
def index(request):
isps = ISPModel.objects.order_by('-id')
paginator = Paginator(isps, 10) # 每页显示数目
page = request.POST.get('pageNum', 1)
try:
isps = paginator.page(page)
logging.info("***********日志信息*************")
test = "测试指令"
logging.info("@@@@@@@@@@@@execute %s success@@@@@@@@@@@@", test)
logging.info("***********loginfo*************")
except (EmptyPage, InvalidPage):
isps = paginator.page(paginator.num_pages)
return render_to_response('isp/basepage.html', {'isps':isps,'currentPage':page, 'numPerPage':5})
使用logging模块的更多好处
用好日志功能可以对开发和调试起到很多帮助作用。使用了logging模块可以通过日志级别非常方便的控制输出,不需要增减任何程序代码,只需要在settings.py中更改logging级别一行代码就行了。所以在开发过程中,可以尽量多用logging.debug输出对调试有帮助的内容。而在生产环境下,通过日志也可以方便的分析真实运行环境下的一些问题,便于调试修改bug。
如果用在Google App Engine,不需要指定输出文件,程序输出的日志都会直接保存在App Engine运行日志中,还可以通过正则表达式来搜索以往日志。
另外,通过Django debug toolbar,可以方便的直接在调试环境下直接在每个页面上查看输出的日志,非常好用。
所以,如果你在写Django程序,就不要再用原始的print了,用好logging可以事半功倍。
下面是另外一种形式的log应用:
django如何添加logging日志模块--配置多个日志文件
我用的django的版本是1.3,听闻django可以配置日志模块,不用自己单独写,于是一阵狂搜加看官方文档解决了我的需求。
我的需求是需要配置多个日志文件,网上搜出来大部分是一个的,所以给大家一个我的例子做参考。
1.在setting.py里面配置如下:
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(levelname)s %(asctime)s %(message)s'
},
},
'filters': {
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'formatter':'standard',
},
'test1_handler': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename':'path1',
'formatter':'standard',
},
'test2_handler': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename':'path2',
'formatter':'standard',
},
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'test1':{
'handlers': ['test1_handler'],
'level': 'INFO',
'propagate': False
},
'test2':{
'handlers': ['test2_handler'],
'level': 'INFO',
'propagate': False
},
}
}
里面的level什么的可以自己调整,需要几个文件就配几个handler和logger,还是很方面的。用的时候怎么用呢,看下面吧。
2. 在要用log的view.py里面,如果想用test1这个日志,则
log=logging.getLogger('test1')
log.error(“日志内容”)
如果,想要在日志内容里面传递变量,怎么办
log.error(" %s : execute %s failed",变量1,变量2),比较像c的printf,还是很方便的。