【问题标题】:Where does GoogleAppEngineLauncher keep the local log files?GoogleAppEngineLauncher 将本地日志文件保存在哪里?
【发布时间】:2011-02-20 03:20:46
【问题描述】:

GoogleAppEngineLauncher 可以在开发期间在我的 Mac 上运行时显示我的应用的本地日志文件。但是,我无法更改那里的字体大小,所以我想使用tail 命令自己查看日志文件。

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

(也许没有物理文件,只是python开发环境的stdout,所以日志只能在启动器应用程序中使用。)

【问题讨论】:

    标签: python google-app-engine logging


    【解决方案1】:

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

    在今天的devappserver 中,如果要登录到文件(以其本机 sqlite 数据库格式),请使用 --logs_path=LOGS_FILE。或者按照评论中的建议,如果太复杂,只需通过管道输出。

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

    【讨论】:

    • 当我这样做时,SQLLite3 的东西被存储在 --logs_path 中指定的文件中(我不想要 SQLLite3 的东西,我不知道它是什么),但我想要的日志是写入 bash 标准输出(因此尼克约翰逊建议的管道对我有用)。还有什么是--storage_path?你还注意到了哪些错误?谢谢。
    • 管道也可以正常工作。 sqlite3 的东西 日志数据,虽然我认为它之前可能是文本。请参阅stackoverflow.com/questions/24226078/… 或使用诸如google.ca/search?q=sqlite%20osx 之类的应用程序——我编辑了我的答案以反映您的评论。谢谢! :)
    • 周到的回复,谢谢。最后的评论,甚至管道都不起作用,日志内容只是直接打印到外壳(控制台?)。对此有任何想法吗?是“TTY”问题吗?我在 Windows 上使用 Git Bash,尝试使用普通 Windows Cmd 管道时出现同样的问题。谢谢+1。
    • 因为至少编写了 SQLLite3 的东西,(而管道似乎没有将任何内容写入磁盘;请参阅前面的评论。),我可能会使用你的方法!耶。
    【解决方案2】:

    如果您只想在运行时查看日志,它们会与 HTTP 调用一起打印在命令行上。

    logging.debug()logging.error() 不打印,但向上调用 info 是。

    更多详情请参阅this answer

    【讨论】:

      【解决方案3】:

      一个简单但又脏的修复方法是将以下代码添加到您的 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' ) 
      

      【讨论】:

        【解决方案4】:

        正如您推测的那样,并且可以通过研究源文件/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 跟踪器上的补丁,作为我建议的功能请求的一部分,希望它很快被接受!-)

        【讨论】:

        • 因为这样做需要您自己运行脚本(而不是通过启动器),您可以只运行“dev_appserver.py <...> | tee logfile”
        猜你喜欢
        • 1970-01-01
        • 2014-03-19
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 1970-01-01
        • 2014-10-06
        相关资源
        最近更新 更多