Python logging.getLogger 在 AWS Glue python shell 作业中不起作用

Ste*_*eve 6 python logging amazon-web-services aws-glue

我正在尝试使用 Python 的logging模块为我的 AWS Glue 作业设置记录器。我有一个使用 Python 版本 3 的类型为“Python Shell”的 Glue 作业。

如果我不带任何实例化记录器name,日志记录工作正常,但是如果我给我的记录器一个name,它不再工作,并且我收到一个错误消息:Log stream not found.

我在示例 Glue 作业中有以下代码:

import sys
import logging

# Version 1 - this works fine
logger = logging.getLogger()
log_format = "[%(asctime)s %(levelname)-8s %(message)s"

# Version 2 - this fails
logger = logging.getLogger(name = "foobar")
log_format = "[%(name)s] %(asctime)s %(levelname)-8s %(message)s"

date_format = "%a, %d %b %Y %H:%M:%S %Z"
log_stream = sys.stdout
if logger.handlers:
  for handler in logger.handlers:
    logger.removeHandler(handler)
logging.basicConfig(level = logging.INFO, format = log_format, stream =
    log_stream, datefmt = date_format)
logger.info("This is a test.")
Run Code Online (Sandbox Code Playgroud)

请注意,我正在根据这篇文章删除处理程序。

如果我使用代码的版本 1 实例化记录器,它会成功运行并且我能够查看日志,以及在CloudWatch.

如果我运行版本 2,给记录器一个名字,胶水作业仍然成功。但是,如果我尝试查看日志,则会收到以下错误消息:

Log stream not found
The log stream jr_f137743545d3d242618ac95d859b9146fd15d15a0aadce64d8f3ba991ffed012 could not be found. Check if it was correctly created and retry.
Run Code Online (Sandbox Code Playgroud)

而且我也无法在CloudWatch.

我尝试使用 python version 在本地运行此代码3.6.0,并且两个版本都可以使用。此外,此日志记录代码的两个版本都在 Lambda 函数内工作。他们只在 Glue 中失败。

小智 7

这段代码对我有用:

import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
root.addHandler(handler)
root.info("check")
Run Code Online (Sandbox Code Playgroud)

  • 也为我工作!谢谢巴拉特! (2认同)

Gre*_*reg 2

您应该能够使用以下内容命名日志流(将“logger-name-here”替换为您想要的日志流名称):

import logging

MSG_FORMAT = '%(asctime)s %(levelname)s %(name)s: %(message)s'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
logging.basicConfig(format=MSG_FORMAT, datefmt=DATETIME_FORMAT)
logger = logging.getLogger(<logger-name-here>)

logger.setLevel(logging.INFO)

logger.info("Test log message")
Run Code Online (Sandbox Code Playgroud)