在关联Glue开发端点的AWS SageMaker JupyterLab中展示自定义日志的问题
在SageMaker JupyterLab(关联Glue开发端点)中显示日志到单元格输出
我懂你遇到的问题——用Python logging 模块或者GlueContext的日志器时,日志没法像print那样直接显示在笔记本单元格里,默认都跑到CloudWatch去了对吧?这是因为Glue开发端点的默认日志配置没有把输出定向到笔记本的标准输出(stdout),而print是直接写入stdout的,所以能正常显示。
下面给你两种针对性的解决方法:
方法1:配置Python logging模块输出到单元格
我们可以给日志器添加一个StreamHandler,让日志直接输出到stdout(也就是笔记本单元格),还可以按需移除默认的CloudWatch Handler,避免日志重复发送:
import logging import sys # 获取根日志器(或者你自定义的日志器) logger = logging.getLogger() # 移除所有默认Handler(如果不想日志再到CloudWatch的话) for handler in logger.handlers[:]: logger.removeHandler(handler) # 创建指向stdout的StreamHandler stream_handler = logging.StreamHandler(sys.stdout) # 设置日志级别(比如DEBUG/INFO/WARNING等) stream_handler.setLevel(logging.DEBUG) # 可选:设置日志格式,让输出更清晰 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) # 将Handler添加到日志器 logger.addHandler(stream_handler) # 设置日志器的全局级别 logger.setLevel(logging.DEBUG) # 测试一下 logger.info("这条日志终于能显示在笔记本单元格里啦!") logger.debug("调试日志也能看到哦~")
方法2:适配GlueContext的日志器
GlueContext的get_logger()返回的其实也是Python logging的日志实例,所以我们可以用同样的思路给它添加StreamHandler:
from pyspark.context import SparkContext from awsglue.context import GlueContext import logging import sys # 初始化GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) logger = glueContext.get_logger() # 添加指向stdout的StreamHandler stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setLevel(logging.INFO) # 可选添加格式 formatter = logging.Formatter('%(asctime)s - GlueLogger - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # 测试 logger.info("GlueContext的日志现在也能在单元格里显示啦!")
这样配置之后,不管是Python原生的logging还是Glue的日志器,都会把日志直接输出到你的笔记本单元格里,就跟print的效果一样啦。
内容的提问来源于stack exchange,提问作者queise
相关产品推荐
相关产品推荐

