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

Pyspark 如何将消息写入AWS Glue上的输出日志?,pyspark,aws-glue,Pyspark,Aws Glue,默认情况下,AWS将作业日志输出和错误粘贴到两个不同的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.wa

默认情况下,AWS将作业日志输出和错误粘贴到两个不同的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!”不会出现在我运行的测试作业的任何日志中

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

蒂亚

编辑:

事实证明,上述方法确实有效。发生的事情是,我正在AWS Glue Script editor窗口中运行作业,该窗口捕获Command-F组合键,并仅在当前脚本中搜索。因此,当我试图在页面中搜索日志输出时,它似乎没有被记录


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

尝试使用
logging
模块中的内置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")
导入日志
MSG_FORMAT='%(asctime)s%(levelname)s%(name)s:%(message)s'
日期时间格式=“%Y-%m-%d%H:%m:%S”
logging.basicConfig(格式=MSG\u格式,datefmt=DATETIME\u格式)
logger=logging.getLogger()
logger.setLevel(logging.INFO)
...
logger.info(“测试日志消息”)

我知道这篇文章并不新鲜,但可能对某些人有所帮助: 对于我来说,登录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))

之前根本没有指纹,甚至错误级别

这个想法是从这里开始的

另一种选择是登录到stdout并将AWS日志连接到stdout(使用stdout实际上是云日志记录的最佳实践之一)


更新:它仅适用于setLevel(“警告”)和打印错误或警告时。我没有找到如何在信息级别管理它:(

我注意到上面的答案是用python编写的

import com.amazonaws.services.glue.log.GlueLogger
对象GlueApp{
def main(系统参数:数组[字符串]){
val logger=新的GlueLogger
logger.info(“信息消息”)
logger.warn(“警告消息”)
logger.error(“错误消息”)
}
}

您可以从官方文档中找到Python和Scala解决方案,以防万一,这有助于更改日志级别

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

这适用于粘合Python作业中的信息级别:

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

原来我最初尝试记录日志的方式也很有效。我还发现AWS Glue pyspark脚本不会输出任何低于警告级别的内容(请参见上面的编辑)。我将接受您的答案,因为它也有效。谢谢!什么“”我写这篇文章是为了让cloudwatch看到我的日志?任何你想要的有意义的字符串,比如应用程序名。这个值将用来代替日志消息中的
%(name)s
。是否可以只将自定义消息写入s3?嗨,我有一个小问题,logging.basicConfig(filename='s3:///spark.logs',level=logging.INFO)我可以将日志存储到s3存储桶中吗?我厌倦了上面的配置,它不起作用@Alexeybakulin你需要导入任何东西来使用
log4jLogger
?不知怎的,将这三行添加到我的脚本中,我的作业挂起在那里。状态显示
正在运行
,但没有生成日志这对我的粘合作业不起作用。我正在输出警告el记录了日志,无法看到min Cloud Watch。您还需要什么来让它工作吗?Thanks@padr我也有同样的问题。当你查看日志时,你需要在筛选事件搜索框中搜索日志文本。记录一些不会出现在任何其他日志记录中的无意义文本来测试这一点。这s3键在这里是什么意思?@Lars,是可以将错误消息写入s3?官方文档中的一个文件中需要注意的两件事:1.Glue logger不接受msg格式的字符串,而是需要完整的字符串(因此您必须处理参数).2.Glue logger似乎无法向工作人员广播,因此如果您试图从UDF登录,则需要使用Python logger。如果我想打印中间数据值(如输入数据),以便进行调试,该怎么办?我使用了
logger.info(input\u data)
似乎不起作用..是否签入错误日志?这就是我的stderr日志事件结束的地方…使用日志记录的stdout日志事件也是如此。基本配置打印不在stderr中