GoogleAppEngineLauncher的本地日志文件存放在哪里?

9 投票
4 回答
7441 浏览
提问于 2025-04-15 22:46

GoogleAppEngineLauncher可以在我开发的时候,显示我在Mac上运行的应用的本地日志文件。不过,我无法在里面调整字体大小,所以我想用tail这个命令自己查看日志文件。

可惜的是,我找不到日志文件。它们不在/var/log/~/Library/Logs或者/Library/Logs这些地方。你知道它们在哪里吗?

(也许根本就没有实际的文件,只是Python开发环境的标准输出,所以日志只能在启动器应用里查看。)

4 个回答

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' ) 
5

很多之前的回答现在已经过时了。 :)

在现在的 devappserver 中,如果你想把日志记录到一个文件里(用它自己的sqlite数据库格式),可以使用 --logs_path=LOGS_FILE。或者像评论里提到的,如果觉得这个太复杂了,可以直接把输出内容导出。

因为现在有了日志API,所以如果没有设置的话,它实际上会把日志条目存储在 --storage_path 指定的文件里。不过我自己注意到了一些小问题。(我假设这些问题现在不存在了,毕竟我有一段时间没用过这个了。)

8

正如你所猜测的,通过查看源文件 /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的跟踪器上提出这个补丁,作为我建议的功能请求的一部分,希望它能尽快被接受!-)

撰写回答