【问题标题】:How to access to Google AppEngine Managed VM logs?如何访问 Google AppEngine 托管 VM 日志?
【发布时间】:2014-11-15 14:39:24
【问题描述】:

我正在试用 Google AppEngine 的 Managed VMs Beta,虽然它使用 AppEngine 开发服务器在我的 IDE 中本地运行,但我似乎无法使用 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

所以我希望日志文件“神奇地”映射到本地机器上的本地 /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-ing 到 docker 容器中,但这始终返回一个错误。

P.S.2:我的应用程序是 Java 8 上的“基本”Spring MVC+Security+Social+DataJPA,所以我猜想在 IDE+ 中不会发生 bean 初始化故障GAE 开发服务器以某种方式

P.S.3:我按照这里的教程进行操作:https://github.com/GoogleCloudPlatform/appengine-java-vm-guestbook-extras 并使用mvn appengine:gcloud_app_run 让第 3 阶段正常运行

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

P.S.5:我查看了在端口 8000 上运行的管理控制台,那里的日志与 shell 中的日志相同(即除了 HTTP 503 消息之外没有太多其他内容)

【问题讨论】:

    标签: logging docker gcloud google-app-engine


    【解决方案1】:

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

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

    所以,下面是我运行的命令。

    1 - 必要时停止所有 docker 容器:

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

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

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

    3 - 停止 boot2docker VirtualBox 虚拟机:

    ➜  ~ boot2docker down
    

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

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

    5 - 将目录挂载到 boot2docker VirtualBox 虚拟机中:

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

    6 - 启动 boot2docker VirtualBox 虚拟机:

    ➜  ~ boot2docker up
    

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

    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
    

    并非完全简单明了...

    必须可以通过更改权限使默认的 /var/mog/app_engine 本地文件夹对 VirtualBox VM 可用,因此无需侵入 google-cloud-sdk python 文件。但是,我还没有时间测试它。我会在测试时更新答案。

    【讨论】:

    • 对我来说,它只创建这些目录~/var/log/app_engine/&lt;project name&gt;/default/1/0/,但从不把任何文件放在那里……
    • 我和@manakor 有类似的经历。我确实在 /var/log/app_engine 中看到了一个 app.log.json,它似乎确实有日志。我正在使用 python,但到目前为止,我对调试托管 vm 感到非常沮丧。
    • 感谢@Nicolas,这是最终获取日志的好方法!现在下一步是在主控制台中聚合这些日志,这样我们就可以实时获取它们
    【解决方案2】:

    作为对@Nicolas 初始答案的补充,我创建了一个小的 shell 脚本,它将

    1. 构建项目
    2. 启动泊坞窗
    3. 启动将显示最新日志的控制台
    4. 启动gcloud preview app 命令

    我现在与您共享 .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>" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2015-01-08
      • 1970-01-01
      相关资源
      最近更新 更多