Django应用中‘打印’的内容存在哪儿?
我在一个Linux服务器上有一个Django应用。在某个视图中,有一个print
命令被执行,然后打印出了一些字符串。我该怎么找到这个打印出来的字符串呢?有没有什么日志可以查看这些信息?
5 个回答
使用"./manage.py runserver"或者其他类似的命令时,打印的信息显示得很好,就像Joschua提到的那样,它会出现在你启动服务器的终端里。如果你是通过cron等方式运行FCGI,那些信息就会消失,完全看不到了。
在我想要打印一些警告或通知的时候,我会使用Python的日志记录器,它可以把输出发送到系统日志中,这样就能把信息保存到某个地方。我在加载的模块中创建了一个日志记录的实例——我选择了models.py,因为这样方便,而且我知道它会在请求到来之前就被加载。
import logging, logging.handlers
logger = logging.getLogger("djangosyslog")
hdlr = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON)
formatter = logging.Formatter('%(filename)s: %(levelname)s: %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
然后当你想在视图或其他地方记录信息时,可以这样调用日志记录器:
logger = logging.getLogger("djangosyslog")
logging.warning("Protocol problem: %s", "connection reset", extra=d)
有.error()、.critical()等方法——想了解更多细节,可以查看http://docs.python.org/library/logging.html。
如果你想要调试信息,Rob Hudson的调试工具条非常好用——我在开发时经常使用。它会给你当前请求和响应的数据,包括生成某个页面所用的SQL语句。你可以像打印一样,把你感兴趣的字符串放到上下文/响应中,但我发现这样处理起来有点麻烦。
不要使用 print,因为一旦你把程序上线,它会把信息输出到标准输出(stdout),这样会导致WGSI出问题。
应该使用 logging。对于开发来说,这个设置起来非常简单。在你的项目的 __init__.py 文件中:
import logging
from django.conf import settings
fmt = getattr(settings, 'LOG_FORMAT', None)
lvl = getattr(settings, 'LOG_LEVEL', logging.DEBUG)
logging.basicConfig(format=fmt, level=lvl)
logging.debug("Logging started on %s for %s" % (logging.root.name, logging.getLevelName(lvl)))
现在你记录的所有信息都会输出到错误输出(stderr),在这种情况下,就是你的终端。
logging.debug("Oh hai!")
而且你可以通过在 settings.py 中设置 LOG_LEVEL 来控制输出的详细程度。
输出内容应该在你启动django的终端里显示。如果你不是直接在那个地方启动的,我觉得没有办法读取到这些信息。
正如linkedlinked提到的,最好不要使用print
,因为这可能会导致错误!但这并不是唯一的原因:有一些专门的模块(比如logging)是为了这个目的而设计的,它们提供了更多的选项。
这个网站(尽管是2008年的内容)也证实了我的说法:
如果你想知道视图内部发生了什么,最快的方法就是插入一个打印语句。开发服务器会直接把任何打印语句的输出显示在终端上;这就像JavaScript的alert()在服务器端的替代品。
如果你想更高级一点来记录日志,可以考虑使用Python的日志模块(这是标准库的一部分)。你可以在你的settings.py里进行配置:这里他描述了该怎么做(可以去看看那个网站)
为了调试,你也可以启用调试模式,或者使用django-debug-toolbar。
希望这些对你有帮助!:)