如何访问Google AppEngine托管虚拟机日志?

时间:2014-11-15 14:39:24

标签: logging docker gcloud google-app-engine

我正在试用Google AppEngine的托管虚拟机测试版,当它在我的IDE中使用AppEngine开发服务器在本地运行时,我似乎无法使其与mvn appengine:gcloud_app_run一起运行。

我始终如一地永远得到:

"[INFO] INFO: default: "GET /_ah/health?IsLastSuccessful=no HTTP/1.1" 503 298"

因此需要访问docker容器中输出的日志来诊断503。

我已使用appengine-maven-plugin配置部分中的以下行激活了日志记录(在IDE中运行良好)。

<gcloud_app_enable_mvm_logs>true</gcloud_app_enable_mvm_logs>

然后我尝试使用以下命令从docker容器访问日志:

➜  ~  docker ps                                                                       
CONTAINER ID        IMAGE                                                       COMMAND                CREATED             STATUS              PORTS                     NAMES
76369bc9b773        heimdall-dev.default.1:latest                               "/home/vmagent/jetty   5 seconds ago       Up 4 seconds        0.0.0.0:49174->8080/tcp   google.appengine.heimdall-dev.default.1.0.2014-11-13T210256.776274Z 

➜  ~  docker logs 76369bc9b773
Info: Limiting Java heap size to: 1456M
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=64M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=166M; support was removed in 8.0
2014-11-13 21:02:59.384:INFO::main: Logging initialized @372ms
2014-11-13 21:02:59.487:INFO::main: Redirecting stderr/stdout to /var/log/app_engine/STDERR.2014_11_13.log//var/log/app_engine/STDOUT.2014_11_13.log

所以我希望日志文件可以&#34;神奇地&#34;映射到本地计算机上的本地/var文件夹(即docker容器外部)。 但似乎不是这样:

➜  ~  tail -f /var/log/app_engine/STDERR.2014_11_13.log
tail: /var/log/app_engine/STDERR.2014_11_13.log: No such file or directory
➜  ~  tail -f /var/log/app_engine/STDOUT.2014_11_13.log
tail: /var/log/app_engine/STDOUT.2014_11_13.log: No such file or directory

这是正确的方法吗?如果是的话,我错过了什么?那么访问日志的正确方法是什么?

P.S。:我还尝试使用docker attach 76369bc9b773 ssh进入docker容器,但这始终给我一个错误。

P.S.2:我的应用是&#34;基本&#34; Spring MVC + Security + Social + DataJPA over Java 8,所以我猜在IDE + GAE Dev Server中不会发生bean初始化的故障

P.S.3:我按照教程https://github.com/GoogleCloudPlatform/appengine-java-vm-guestbook-extras进行了操作,并使用mvn appengine:gcloud_app_run

让第3阶段正常运行

PS4:让我的应用在IDE中运行,因为我使用的是Spring MVC,我必须实现自己的/_ah/start端点(灵感来自Google App Engine Localhost Backend ErrorNo mapping found using Spring3 MVC + Maven2 on GAE)但我不确定这是否是正确的做法

PS5:我查看了在端口8000上运行的管理控制台,其中的日志与shell中的日志相同(即除了HTTP 503消息之外的其他内容) )

2 个答案:

答案 0 :(得分:4)

我终于使用docker的volumes设法访问了appengine VM的日志。并在浏览python代码后黑客攻击google-cloud-sdk的文件。

但是,由于我在Mac OS X上工作,因为OS和docker之间的VirtualBox层需要一些额外的东西,如下所述:http://viget.com/extend/how-to-use-docker-on-os-x-the-missing-guide

所以,下面是我跑的命令。

1 - 如有必要,停止所有泊坞容器:

➜  ~ docker stop $(docker ps -a -q)

2 - 如有必要,删除所有泊坞容器:

➜  ~ docker rm $(docker ps -a -q)

3 - 停止boot2docker VirtualBox VM:

➜  ~ boot2docker down

4 - 创建您希望在本地计算机上映射的目录(确保它是您具有读/写权限而无需sudo)的目录:

➜  ~ mkdir -p ~/var/log/app_engine

5 - 将目录挂载到boot2docker VirtualBox VM:

➜  ~ VBoxManage sharedfolder add boot2docker-vm -name var -hostpath ~/var/log/app_engine

6 - 启动boot2docker VirtualBox VM:

➜  ~ boot2docker up

7 - 编辑文件的第266行google-cloud-sdk / platform / google_appengine / google / appengine / tools / devappserver2 / vm_runtime_proxy.py

265    external_logs_path = os.path.join(
266        '/var/log/app_engine',
267        self._escape_domain(

使用共享文件夹的路径,在我的情况下:

265    external_logs_path = os.path.join(
266        '/Users/nicolas/var/log/app_engine',
267        self._escape_domain(

8 - 运行应用程序:

➜  ~ mvn appengine:gcloud_app_run

9 - 检查日志是否存在:

➜  ~  ls ~/var/log/app_engine/heimdall-dev/default/1/0/
STDERR.2014_11_16.log   STDOUT.2014_11_16.log   app.0.log.json          app.0.log.json.1        app.0.log.json.1.lck    app.0.log.json.2        app.0.log.json.2.lck    app.0.log.json.lck      request.2014_11_16.log

不是那么简单直接......

必须可以通过更改权限使VirtualBox VM可以使用默认的/var/mog/app_engine本地文件夹,因此不需要入侵google-cloud-sdk python文件。但是,我还没来得及测试。当我开始测试时,我会更新答案。

答案 1 :(得分:1)

就像完成初步回答@Nicolas一样,我已经创建了一个小的shell脚本

  1. 构建项目
  2. 启动docker
  3. 启动将显示最新日志的控制台
  4. 启动gcloud preview app命令
  5. 我现在和你分享.sh文件:

    #!/bin/sh
    mvn clean install   #build via MAVEN
    boot2dockerstatus=$( boot2docker status )
    echo $boot2dockerstatus
    if [ $boot2dockerstatus != 'running' ]
        then
            boot2docker start
            boot2docker status
    fi
    open http://localhost:8080
    
    
    #ADD logs debugging on a separate window (MacOSx only) !! 
    osascript -e 'tell app "Terminal"
        do script "cd /var/log/app_engine/; tail -F *.log"
    end tell'
    
    gcloud --verbosity debug preview app run --enable-mvm-logs "./target/<your-project-build-name-here>"