如何重定向" print"命令输出到文件而不更改python代码?

时间:2017-11-06 01:50:34

标签: python django

我想将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 ..."语句无法保存日志文件。

3 个答案:

答案 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输出的一部分。

您需要为您的应用程序创建一个记录器:

  1. 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',
         },
    },
    
  2. 如果要记录某些内容,请添加以下内容:

    import logging
    mylogger = logging.getLogger(__name__)
    
    
    ...
    logger.info('query content: {}'.format(your_query_content))
    ...
    
  3. 虽然以上解决了您的直接问题,但您可以更进一步:

    LOGGER配置中添加文件处理程序:

    1. 在处理程序上添加:

      'file': {  
          'class': 'logging.FileHandler',
          'filename': 'a/file/location/logs.log',  
          'formatter': 'standard'
      },
      
    2. loggers.django更新处理程序:

      'handlers':['console', 'file'], 
      
    3. 您可以进一步自定义上述内容,但这是另一个主题:

      有关python和django日志记录的更多信息:

      1. https://docs.python.org/3/library/logging.html
      2. https://docs.djangoproject.com/en/2.0/topics/logging/

答案 2 :(得分:0)

TL; DR:如果你在manage.py shell的文件末尾有一个循环,最后会添加两个换行符。

在我的情况下,stdout中没有print s的原因是因为它们从未真正执行过。它们位于文件末尾的for循环中,没有两个换行符或换行符以及其后的任何其他行(带注释)。这样shell就等待for循环代码完成,它永远不会。