在 Google Cloud Logs 中看不到应用程序日志

Posted

技术标签:

【中文标题】在 Google Cloud Logs 中看不到应用程序日志【英文标题】:Can't see application log in Google Cloud Logs 【发布时间】:2016-09-12 09:06:11 【问题描述】:

如何在 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

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

我用来生成应用程序日志消息的代码类似于:

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

logger.info("entering app.py")

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

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

我看过的资源:

https://cloud.google.com/logging/docs/view/logs_viewer https://cloud.google.com/appengine/docs/python/logs/ How to change the logging level of dev_appserver How do I write to the console in Google App Engine? Google App Engine - Can not find my logging messages https://docs.python.org/3/howto/logging.html

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我尝试了您的建议,不幸的是这并没有帮助,因为我正在寻找的应用程序日志消息只是从日志查看器中丢失(以某种方式被过滤掉)。扩展我可以访问的日志条目并不能帮助我找到我正在寻找的丢失的应用程序日志消息。 我遇到了类似的问题,有时它们会被包含在内,但大多数时候它们会从有效负载中丢失【参考方案2】:

将 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

【讨论】:

以上是关于在 Google Cloud Logs 中看不到应用程序日志的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Cloud Scheduler 日志中查看响应正文

如何在 Google Cloud Logs Explorer 中查询 VM 合规性报告

我的 Laravel 应用程序在 Google Cloud 上出现问题。无法打开流或文件“/srv/storage/logs/laravel.log”

如何列出我的 Google Cloud 项目的所有 IAM 用户

在 Web.load(URLRequest(url: URL(string: "https://google.com")!)) 中看不到任何内容

Nativescript-Vue 7 - 创建新项目后,我在 google chrome devtools 中看不到网络活动