如何将消息写入 AWS Glue 上的输出日志?

How do I write messages to the output log on AWS Glue?

AWS Glue 作业将输出和错误记录到两个不同的 CloudWatch 日志,默认为 /aws-glue/jobs/error/aws-glue/jobs/output。当我在脚本中包含 print() 语句进行调试时,它们会写入错误日志 (/aws-glue/jobs/error)。

我试过使用:

log4jLogger = sparkContext._jvm.org.apache.log4j 
log = log4jLogger.LogManager.getLogger(__name__) 
log.warn("Hello World!")

但是 "Hello World!" 没有出现在测试作业 I 运行.

的任何一个日志中

有谁知道如何将调试日志语句写入输出日志 (/aws-glue/jobs/output)?

TIA!

编辑:

事实证明,以上确实有效。发生的事情是我 运行 在 AWS Glue 脚本编辑器 window 中工作,它捕获 Command-F 组合键并且只在当前脚本中搜索。因此,当我尝试在页面内搜索日志输出时,它似乎没有被记录。

注意:通过测试第一响应者的建议,我确实发现 AWS Glue 脚本似乎不会输出任何级别低于 WARN 的日志消息!

尝试使用 logging 模块中的 built-in python 记录器,默认情况下它会将消息写入标准输出流。

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")

我知道这篇文章并不新鲜,但也许对某些人有帮助: 对我来说,登录 glue 使用以下代码行:

# create glue context
glueContext = GlueContext(sc)
# set custom logging on
logger = glueContext.get_logger()
...
#write into the log file with:
logger.info("s3_key:" + your_value)

我遇到了同样的问题。我通过添加解决了它 logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))

之前完全没有打印,连ERROR级别都没有

这个想法来自这里 https://medium.com/tieto-developers/how-to-do-application-logging-in-aws-745114ac6eb7

Another option would be to log to stdout and glue AWS logging to stdout (using stdout is actually one of the best practices in cloud logging).

更新:它仅适用于 setLevel("WARNING") 以及打印 ERROR 或 WARING 时。我没有找到如何在 INFO 级别管理它:(

我注意到上面的答案是写在python中的。对于 Scala,您可以执行以下操作

import com.amazonaws.services.glue.log.GlueLogger

object GlueApp {
  def main(sysArgs: Array[String]) {
    val logger = new GlueLogger
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
  }
}

您可以从官方文档中找到 Python 和 Scala 解决方案 here

以防万一这有帮助。这适用于更改日志级别。

sc = SparkContext()
sc.setLogLevel('DEBUG')
glueContext = GlueContext(sc)
logger = glueContext.get_logger()
logger.info('Hello Glue')

这适用于 Glue Python 作业中的 INFO 级别:

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")

source