Spark 自定义日志推荐实现方式及Log4j使用规范问询
Spark 中 Log4j 的推荐使用方案
- 优先用Spark内置的SLF4J门面获取日志实例,不要直接绑定Log4j实现。Spark 2.x及以上版本默认用SLF4J做日志门面,底层根据版本不同绑定Log4j 1.x或者2.x,业务代码直接调用
org.slf4j.LoggerFactory.getLogger(当前类名.class)获取Logger实例即可,完全适配Spark的日志体系,也不会出现依赖冲突问题。 - 日志配置统一通过作业提交参数指定,不要在代码里硬改配置。你可以把自定义的
log4j.properties/log4j2.xml在提交作业时通过--files参数上传,再通过spark.driver.extraJavaOptions、spark.executor.extraJavaOptions两个配置分别指定Driver和Executor加载的日志配置文件路径即可,全局生效。 - 不要在代码里自定义写本地磁盘的日志Appender。Executor端的日志优先依托集群自带的日志收集能力,比如YARN的日志聚合、K8s的标准输出采集,自定义写本地文件很容易导致节点磁盘打满,且日志分散难以统一排查问题。
关于调用
getRootLogger()的规范说明 日常开发不建议常规调用
getRootLogger()操作日志,相关约定如下:
- 根日志器的配置是全局生效的,你如果手动修改它的级别、增删Appender,会直接影响Spark框架本身的所有日志输出,要么导致核心报错日志被屏蔽无法排查问题,要么突然输出大量框架冗余日志拖慢作业性能。
- 如果需要调整全局日志级别,直接用Spark自带的配置参数即可:调整全局根日志级别用
--conf spark.log.level=WARN,调整指定包的日志级别用--conf spark.logging.class.包名=对应级别,完全不需要直接操作根日志器。 - 只有极端特殊场景下才允许操作根日志器,比如框架默认日志配置有冲突需要临时修复,而且只能在Driver端作业初始化阶段执行,操作完要校验日志级别是否符合预期;绝对禁止在Executor的任务执行逻辑里调用根日志器的修改方法,会导致同节点上运行的其他所有任务的日志输出都异常。
内容的提问来源于stack exchange,提问作者user7551211
相关产品推荐
相关产品推荐

