Python 3.x 如何使用google.cloud.logging将abseil日志消息重定向到stackdriver,而不使用带有错误的“重复”;“标签”是什么;?

Python 3.x 如何使用google.cloud.logging将abseil日志消息重定向到stackdriver,而不使用带有错误的“重复”;“标签”是什么;?,python-3.x,google-cloud-platform,google-cloud-stackdriver,google-cloud-logging,abseil,Python 3.x,Google Cloud Platform,Google Cloud Stackdriver,Google Cloud Logging,Abseil,我正在使用AI平台培训运行ML培训作业,使用python3.7.6。我正在使用abseil模块记录带有absl py0.9.0的消息。我看一下关于如何将python日志消息定向到stackdriver的说明。我正在使用googlecloudlogging1.15.0。我编写了一些非常基本的代码来理解我的配置问题 from absl import logging from absl import flags from absl import app import logging as logger

我正在使用
AI平台培训
运行ML培训作业,使用
python
3.7.6
。我正在使用abseil模块记录带有
absl py
0.9.0
的消息。我看一下关于如何将python日志消息定向到stackdriver的说明。我正在使用
googlecloudlogging
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)
首先,将所有日志发送到stderr。请注意,这是否是预期的。在下面的屏幕截图中,我们看到:

  • 显示使用
    print
    打印的消息(稍后在
    Stackdriver
    的日志文件中)
  • Abseil日志记录消息出现2次。一次使用堆栈驱动程序中的正确标签(调试、信息、警告或错误),另一次使用特殊格式
    [%(levelname)s%(asctime)s%(filename)s:%(lineno)s]%(message)s
    ,但始终使用
    堆栈驱动程序中的错误标签
  • 当我在本地运行代码时,我没有看到重复的代码
  • 您知道如何正确地进行此设置,以便在
    Stackdriver
    中使用正确的“标签”一次性查看日志消息(使用abseil)吗

    -----编辑--------

  • 我在本地看到了这个问题,而不仅仅是在
    GCP
    上运行时
  • 添加以下行时会出现重复的日志消息:
    client.setup\u logging()
    。以前,我没有重复,所有日志消息都在标准输出流中
  • 如果我查看logger
    logger.root.manager.loggerDict.keys()
    ,我会看到很多:
  • 如果我看看:
  • 我明白了:

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

    handler和我尝试了@Andy Carlson的最后一个解决方案,但我所有的日志信息都消失了。

    1-重复日志的内容是什么?2-你能在AI平台培训和localy中测试以隔离问题吗?@KhalidK似乎所有进入记录器的内容都被复制了。如果我运行相同的代码“client.setup_logging()”,那么每次都可以正常工作。或日志输出仅在标准输出流中显示。因此,“client.setup_logging()”会复制日志消息,然后这些消息将同时出现在stdout和stderr中。您的意思是,当您在没有“client.setup_logging()”的情况下运行代码时,日志不会重复。我建议开一家刚做过的。在导入Tensorflow和Transformers libs时,情况变得更加混乱。我猜这是m logging、absl.logging和google.cloud.logging之间的冲突。我想我的问题是我真的不明白他们是如何工作的,也不知道他们之间是如何互动的。
    root_logger = logger.getLogger()
    
    for handler in root_logger.handlers:
        print("handler ", handler)
    
    handler  <ABSLHandler (NOTSET)>
    handler  <CloudLoggingHandler <stderr> (NOTSET)>
    handler  <StreamHandler <stderr> (NOTSET)>