GoogleAppEngineLauncher的本地日志文件存放在哪里?
GoogleAppEngineLauncher可以在我开发的时候,显示我在Mac上运行的应用的本地日志文件。不过,我无法在里面调整字体大小,所以我想用tail
这个命令自己查看日志文件。
可惜的是,我找不到日志文件。它们不在/var/log/
、~/Library/Logs
或者/Library/Logs
这些地方。你知道它们在哪里吗?
(也许根本就没有实际的文件,只是Python开发环境的标准输出,所以日志只能在启动器应用里查看。)
4 个回答
一个简单但有点不太干净的解决办法是把以下代码加到你的 dev_appserver.py 文件的顶部:
import logging
logging.basicConfig( filename='/tmp/gae.log', filemode='a' )
显然,你需要把日志文件名改成你想要的。这种方法改动最小,最容易提交到你的代码库里,而且在有新版本发布时也方便对比。
更新:稍微好一点的做法是把它做成一个命令行选项:
def start_logging():
import logging
logfile=''
for item in sys.argv[1:]:
if re.match('--log_file=', item):
logfile=item.split('=')[1]
# Remove this item from sys.argv
sys.argv.remove(item)
break
if logfile:
print "Please monitor the log file (with tail -f %s)" % logfile
logging.basicConfig( filename=logfile, filemode='a' )
很多之前的回答现在已经过时了。 :)
在现在的 devappserver
中,如果你想把日志记录到一个文件里(用它自己的sqlite数据库格式),可以使用 --logs_path=LOGS_FILE
。或者像评论里提到的,如果觉得这个太复杂了,可以直接把输出内容导出。
因为现在有了日志API,所以如果没有设置的话,它实际上会把日志条目存储在 --storage_path
指定的文件里。不过我自己注意到了一些小问题。(我假设这些问题现在不存在了,毕竟我有一段时间没用过这个了。)
正如你所猜测的,通过查看源文件 /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的跟踪器上提出这个补丁,作为我建议的功能请求的一部分,希望它能尽快被接受!-)