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!”不会出现在我运行的测试作业的任何一个日志中。
有谁知道如何将调试日志语句写入输出日志(/aws-glue/jobs/output
)?
TIA!
编辑:
事实证明以上实际上确实有效。发生的事情是我在AWS Glue Script编辑器窗口中运行该工作,该窗口捕获Command-F组合键并仅在当前脚本中搜索。因此,当我尝试在页面内搜索日志记录输出时,似乎它没有被记录。
注意:我确实通过测试第一响应者的建议发现AWS Glue脚本似乎没有输出任何低于WARN的日志消息!
答案 0 :(得分:6)
尝试使用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")
答案 1 :(得分:1)
我遇到了同样的问题。我通过添加解决了
logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))
在完全没有打印之前,甚至没有错误级别
这个主意是从这里得到的 https://medium.com/tieto-developers/how-to-do-application-logging-in-aws-745114ac6eb7
另一种选择是登录到stdout并将AWS日志记录粘贴到stdout(使用stdout实际上是云日志记录的最佳实践之一)。
更新:它仅适用于setLevel(“ WARNING”)以及在打印ERROR或WARING时起作用。我没有找到如何在INFO级别进行管理的地方:(
答案 2 :(得分:1)
我注意到以上答案都是用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")
}
}
您可以从官方文档here中找到Python和Scala解决方案
答案 3 :(得分:1)
以防万一这有帮助。这可以更改日志级别。
sc = SparkContext()
sc.setLogLevel('DEBUG')
glueContext = GlueContext(sc)
logger = glueContext.get_logger()
logger.info('Hello Glue')
答案 4 :(得分:0)
我知道该文章不是新文章,但可能对某人有所帮助: 对我来说,登录胶水可以使用以下代码行:
# 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)
答案 5 :(得分:0)
这适用于 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")