我正在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。注意确定这是否是预期的。在下面的屏幕截图中,我们看到:
- 使用 are display 打印消息
print
(稍后在日志文件中Stackdriver
) - 绳索记录消息出现 2 次。一次在堆栈驱动程序中具有正确的标签(DEBUG、INFO、WARNING 或 ERROR),另一次具有特殊格式
[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s
但始终在Stackdriver
. - 当我在本地运行代码时,我看不到重复。
知道如何正确设置此设置以查看日志消息(使用 abseil)一次并使用正确的“标签”Stackdriver
吗?
- - - 编辑 - - - -
- 我在本地看到了这个问题,而不仅仅是在
GCP
. - 当我添加此行时出现重复的日志消息:
client.setup_logging()
. 之前,我没有重复,所有日志消息都在标准输出流中 - 如果我查看 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'])
- 如果我看:
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 的最后一个解决方案,但是我所有的日志消息都消失了。