GoogleAppEngineLauncher在哪里保留本地日志文件?

时间:2010-05-16 17:06:16

标签: python google-app-engine logging

GoogleAppEngineLauncher可以显示我的应用在开发过程中在我的Mac上运行时的本地日志文件。但是,我无法更改字体大小,因此我想使用tail命令自行查看日志文件。

这很遗憾,但我找不到日志文件。它们不在/var/log/~/Library/Logs/Library/Logs下。你知道他们在哪里吗?

(也许没有物理文件,只有python开发环境的标准输出,所以日志只在启动器应用程序中可用。)

4 个答案:

答案 0 :(得分: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可以让你更好地控制它,我认为。)

我认为这种自定义方法比应该的方法要麻烦得多(毕竟,将日志写入文件是完全正常的 - 要么根据需要以不同方式显示它们,要么稍后使用辅助工具处理它们脚本),所以我还建议在app引擎的跟踪器上添加一个功能请求:dev_appserver.py应该再接受一个标志,如果指定的话,它会给出将日志写入磁盘的路径。

而且,说实话,如果我现在需要这个功能,我自己也会这样做:编辑.py文件(及其相关的_main.py)以添加标记及其用途。这应该是十几行,比我刚才概述的“规范”方式容易得多。当然,它 是脏的,因为每次有新的SDK你都必须再次应用补丁,并且再一次......这就是为什么一个人应该在GAE的跟踪器上提出补丁,作为我建议的功能请求的一部分,希望它很快被接受! - )

答案 1 :(得分:5)

其中许多答案现已过时。 :)

在今天的devappserver中,如果要登录文件(使用其本机sqlite数据库格式),请使用--logs_path=LOGS_FILE。或者如评论中所建议的那样,如果输出过于复杂,只需输出输出。

由于存在日志API,如果没有设置,它实际上现在将日志条目存储在--storage_path中的文件中。 我自己已经注意到了一些错误。(我认为它们现在不存在,因为我使用它已经有一段时间了。)

答案 2 :(得分:4)

一个简单而又脏的修复方法是将以下代码添加到dev_appserver.py文件中,顶部:

import logging
logging.basicConfig( filename='/tmp/gae.log', filemode='a' )

显然,将日志文件更改为您想要的内容。这需要最少量的更改,并且在有新版本时最容易进入repo和diff。

<强>更新 稍微好一点的可能是将它变成命令行选项:

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

答案 3 :(得分:1)

如果您只想在运行时查看日志,则会在命令行上打印这些日志以及HTTP调用。

logging.debug()logging.error()未打印,但向上调用info

有关详细信息,请参阅this answer