无法在Google Cloud Logs

时间:2016-05-16 14:22:39

标签: python google-app-engine logging google-cloud-logging

如何在Google Cloud上查看日志消息?https://console.cloud.google.com/logs

这是我在运行dev_appserver.py(本地运行)时在终端中看到的:

INFO     2016-05-16 14:00:45,118 module.py:787] default: "GET /static/images/contact.png HTTP/1.1" 304 -
INFO     2016-05-16 14:00:45,128 module.py:787] default: "GET /static/images/email.png HTTP/1.1" 304 -
INFO     2016-05-16 14:00:45,136 module.py:787] default: "GET /static/images/phone.png HTTP/1.1" 304 -
INFO     2016-05-16 14:00:45,487 basehandler.py:19] entering basehandler.py
INFO     2016-05-16 14:00:45,516 module.py:787] default: "GET /static/images/logo-349x209.png HTTP/1.1" 304 -
INFO     2016-05-16 14:00:45,562 requesthandlers.py:26] entering requesthandlers.py
INFO     2016-05-16 14:00:45,563 app.py:28] entering app.py
INFO     2016-05-16 14:00:45,563 app.py:198] Using development database

显示应用程序日志消息和请求记录 但是,当我查看部署的相同代码的日志时,我只能看到记录的请求:

gcloud-log

我用来生成应用程序日志消息的代码如下:

import logging
logger = logging.getLogger("someLogger")

logger.info("entering app.py")

但我也尝试使用logging.info(...)直接使用相同的结果。

我已尝试在各种资源中找到答案但我空手而归,大多数都是指在本地开发时如何设置日志级别。
我猜我需要启用一些设置才能在Google Cloud Logs上查看应用程序日志。

我看过的资源:

2 个答案:

答案 0 :(得分:2)

App引擎按请求对日志进行分组。您需要使用“新”GAE日志查看器中请求左侧的三角形/指针来扩展日志。

我个人更喜欢使用旧的GAE日志查看器,但我不确定它会持续多久:

https://appengine.google.com/logs?app_id=s~xxx

(此查看器显示请求+日志并允许日志扩展)

答案 1 :(得分:1)

将Google Cloud Platform登录集成到Python代码中的一种简单方法是从logging.StreamHandler创建一个子类。这样,日志记录级别也将与Google Cloud Logging的日志记录级别匹配,从而使您能够根据严重性进行过滤。此解决方案还可以在Cloud Run容器中使用。

您还可以将此处理程序添加到任何现有的记录器配置中,而无需更改当前的记录代码。

import json
import logging
import os
import sys
from logging import StreamHandler

from flask import request


class GoogleCloudHandler(StreamHandler):
    def __init__(self):
        StreamHandler.__init__(self)

    def emit(self, record):
        msg = self.format(record)
        # Get project_id from Cloud Run environment
        project = os.environ.get('GOOGLE_CLOUD_PROJECT')

        # Build structured log messages as an object.
        global_log_fields = {}
        trace_header = request.headers.get('X-Cloud-Trace-Context')

        if trace_header and project:
            trace = trace_header.split('/')
            global_log_fields['logging.googleapis.com/trace'] = (
                f"projects/{project}/traces/{trace[0]}")

        # Complete a structured log entry.
        entry = dict(severity=record.levelname, message=msg)
        print(json.dumps(entry))
        sys.stdout.flush()

一种配置和使用处理程序的方式可能是:

def get_logger():
    logger = logging.getLogger(__name__)

    if not logger.handlers:
        gcp_handler = GoogleCloudHandler()
        gcp_handler.setLevel(logging.DEBUG)

        gcp_formatter = logging.Formatter(
            '%(levelname)s %(asctime)s [%(filename)s:%(funcName)s:%(lineno)d] %(message)s')
        gcp_handler.setFormatter(gcp_formatter)
        logger.addHandler(gcp_handler)
    return logger