3

我正在AI Platform training使用python 3.7.6. 我正在使用 abseil 模块来记录消息absl-py 0.9.0。我查看了有关如何将 python 日志消息定向到堆栈驱动程序配置 媒体文章的说明。我正在使用google-cloud-logging 1.15.0. 我做了一些非常基本的代码来理解我的配置问题。

from absl import logging
from absl import flags
from absl import app
import logging as logger
import google.cloud.logging

import sys
import os

FLAGS = flags.FLAGS

def main(argv):

    logging.get_absl_handler().python_handler.stream = sys.stdout

    # Instantiates a client
    client = google.cloud.logging.Client()

    # Connects the logger to the root logging handler; by default this captures
    # all logs at INFO level and higher
    client.setup_logging()

    fmt = "[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s"
    formatter = logger.Formatter(fmt)
    logging.get_absl_handler().setFormatter(formatter)

    # set level of verbosity
    logging.set_verbosity(logging.DEBUG)

    print(' 0 print --- ')
    logging.info(' 1 logging:')
    logging.info(' 2 logging:')

    print(' 3 print --- ')
    logging.debug(' 4 logging-test-debug')
    logging.info(' 5 logging-test-info')
    logging.warning(' 6 logging-test-warning')
    logging.error(' 7 logging test-error')
    print(' 8 print --- ')
    print(' 9 print --- ')

if __name__ == '__main__':
    app.run(main)

首先abseil 将所有日志发送到stderr。注意确定这是否是预期的。在下面的屏幕截图中,我们看到:

  1. 使用 are display 打印消息print(稍后在日志文件中Stackdriver
  2. 绳索记录消息出现 2 次。一次在堆栈驱动程序中具有正确的标签(DEBUG、INFO、WARNING 或 ERROR),另一次具有特殊格式[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s但始终在Stackdriver.
  3. 当我在本地运行代码时,我看不到重复。

GCP 堆栈驱动程序中的输出屏幕截图

知道如何正确设置此设置以查看日志消息(使用 abseil)一次并使用正确的“标签”Stackdriver吗?

- - - 编辑 - - - -

  1. 我在本地看到了这个问题,而不仅仅是在GCP.
  2. 当我添加此行时出现重复的日志消息:client.setup_logging(). 之前,我没有重复,所有日志消息都在标准输出流中
  3. 如果我查看 logger logger.root.manager.loggerDict.keys(),我会看到很多:
dict_keys(['absl', 'google.auth.transport._http_client', 'google.auth.transport', 'google.auth', 'google','google.auth._default', 'grpc._cython.cygrpc', 'grpc._cython', 'grpc', 'google.api_core.retry', 'google.api_core', 'google.auth.transport._mtls_helper', 'google.auth.transport.grpc', 'urllib3.util.retry', 'urllib3.util', 'urllib3', 'urllib3.connection', 'urllib3.response', 'urllib3.connectionpool', 'urllib3.poolmanager', 'urllib3.contrib.pyopenssl', 'urllib3.contrib', 'socks', 'requests', 'google.auth.transport.requests', 'grpc._common', 'grpc._channel', 'google.cloud.logging.handlers.transports.background_thread', 'google.cloud.logging.handlers.transports', 'google.cloud.logging.handlers', 'google.cloud.logging', 'google.cloud', 'google_auth_httplib2'])
  1. 如果我看:
root_logger = logger.getLogger()

for handler in root_logger.handlers:
    print("handler ", handler)

我懂了:

handler  <ABSLHandler (NOTSET)>
handler  <CloudLoggingHandler <stderr> (NOTSET)>
handler  <StreamHandler <stderr> (NOTSET)>

我们可以看到流是标准错误而不是标准输出。我没有设法改变它。

我看到了这个讨论stackoverflow 线程,我尝试了@Andy Carlson 的最后一个解决方案,但是我所有的日志消息都消失了。

4

0 回答 0