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
的日志文件中)[%(levelname)s%(asctime)s%(filename)s:%(lineno)s]%(message)s
,但始终使用堆栈驱动程序中的错误标签
Stackdriver
中使用正确的“标签”一次性查看日志消息(使用abseil)吗
-----编辑--------
GCP
上运行时李>
client.setup\u logging()
。以前,我没有重复,所有日志消息都在标准输出流中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)>