我想将django(1.10.4)应用的所有输出重定向到文件
首先,我试过了:
python manage.py runserver 0.0.0.0:8000 >test.log 2>&1
但它并没有重定向打印命令的输出。
例如,在我的代码中有一个声明:
print ('query_content:')
使用命令:
python manage.py runserver 0.0.0.0:8000
我可以看到' query_content:'在屏幕上打印出来。
但是:
python manage.py runserver 0.0.0.0:8000 >test.log 2>&1
在test.log中,只有这样的东西:
[05/Nov/2017 20:38:20] "GET ... HTTP/1.1" 200 22404
[05/Nov/2017 20:38:26] "POST ... HTTP/1.1" 200 13
[05/Nov/2017 20:38:26] "GET .... HTTP/1.1" 200 16800
[05/Nov/2017 20:38:30] "GET ... 200 22430
...
一个解决方案是:
import sys
sys.stdout = open('file', 'w')
print 'test'
但有时候改变python代码是不可能的,有什么解决方案吗?
更新
我发现如果日志文件已经存在,那么一切都很好。 但是,如果我指定一个新的文件名,那么python的输出" print ..."语句无法保存日志文件。
答案 0 :(得分:0)
我认为这个shell命令可能会输出结果。
python manage.py runserver 0.0.0.0:8000 2>&1 | tee file.txt
答案 1 :(得分:0)
我相信>
会向文件test.log
写入从Django登录到控制台的内容。
print('query_content:')
未被记录,因此不是Django输出的一部分。
您需要为您的应用程序创建一个记录器:
在settings.py
添加:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt' : "%d/%b/%Y %H:%M:%S"
},
},
'handlers': {
# This logs to the console
'console':{
'level':'INFO',
'class':'logging.StreamHandler',
'formatter': 'standard'
},
},
'loggers': {
'django': {
'handlers':['console'],
'propagate': True,
'level':'INFO',
},
},
如果要记录某些内容,请添加以下内容:
import logging
mylogger = logging.getLogger(__name__)
...
logger.info('query content: {}'.format(your_query_content))
...
虽然以上解决了您的直接问题,但您可以更进一步:
在LOGGER
配置中添加文件处理程序:
在处理程序上添加:
'file': {
'class': 'logging.FileHandler',
'filename': 'a/file/location/logs.log',
'formatter': 'standard'
},
在loggers.django
更新处理程序:
'handlers':['console', 'file'],
您可以进一步自定义上述内容,但这是另一个主题:
有关python和django日志记录的更多信息:
答案 2 :(得分:0)
TL; DR:如果你在manage.py shell
的文件末尾有一个循环,最后会添加两个换行符。
在我的情况下,stdout中没有print
s的原因是因为它们从未真正执行过。它们位于文件末尾的for
循环中,没有两个换行符或换行符以及其后的任何其他行(带注释)。这样shell就等待for
循环代码完成,它永远不会。