正如您推测的那样,并且可以通过研究源文件/usr/local/google_appengine/google/appengine/tools/dev_appserver.py 来确认,日志没有被写入磁盘(cStringIO.StringIO 实例用于将它们保存在内存中,就像代码的其余部分一样 面向将它们写入“类似文件的对象”)。
我建议您编写自己的应用服务器脚本,该脚本导入dev_appserver,子类dev_appserver.ApplicationLoggingHandler,并仅覆盖一个方法:
from google.appengine.tools import dev_appserver
class MyHandler(dev_appserver.ApplicationLoggingHandler):
def __init__(self, *a, **k):
dev_appserver.ApplicationLoggingHandler.__init__(self, *a, **k)
self.thefile = open('/tmp/mylog.txt', 'w')
def emit(self, record):
dev_appserver.ApplicationLoggingHandler(self, record)
self.thefile.write(str(record) + '\n')
self.thefile.flush()
您还需要确保使用此类而不是标准类,例如通过子类化调度程序或确保您使用其依赖注入功能。 (我认为dev_appserver_main.py 可以让你更好地控制它)。
我认为这种定制方法比它应该的要麻烦得多(毕竟,希望将日志写入文件是完全正常的——要么按照你的意愿以不同的方式显示它们,要么稍后使用一些辅助工具来处理它们脚本),因此我还建议在应用引擎的跟踪器上放置一个功能请求:dev_appserver.py 应该再接受一个标志,如果指定,它会给出将日志写入磁盘的路径。
而且,老实说,如果我现在需要这个功能,我自己,我会用肮脏的方式来做:编辑.py 文件(及其相关的_main.py)以添加所述标志及其用途。总共应该有十几行,比我刚刚概述的“规范”方式要容易得多。当然,它是脏的,因为每次有新的 SDK 时,你都必须一次又一次地应用补丁......这就是为什么一个人应该也 > 建议 GAE 跟踪器上的补丁,作为我建议的功能请求的一部分,希望它很快被接受!-)