Spark driver/executor中Prometheus JMX-exporter日志无法输出如何解决?
JMX Exporter在Spark进程中无法输出FINE级别日志解决方案
根因说明
Prometheus JMX Exporter使用JDK原生java.util.logging(JUL)输出日志,Spark默认集成JUL到SLF4J的桥接组件,结合参数加载顺序、日志级别配置不匹配,会导致FINE级别日志被过滤。
操作步骤
调整双日志框架配置
JMX Exporter的日志会先经过JUL,再被桥接到Spark的log4j,需要两边都配置对应级别:- 修改
/etc/metrics/conf/logging.properties:
.level = FINE # 单独指定JMX Exporter日志级别 io.prometheus.jmx.level = FINE # 配置控制台输出规则 java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter- 修改你指定的
log4j.properties(JUL的FINE对应SLF4J的DEBUG级别):
log4j.logger.io.prometheus.jmx=DEBUG, console- 修改
调整JVM参数顺序
日志相关系统属性必须放在-javaagent参数之前,保证JMX Exporter加载时读取到正确配置,参考顺序:/usr/local/openjdk-8/bin/java -XX:+UseG1GC \ -Dlog4j.debug \ -Dlog4j.configuration=log4j.properties \ -Djava.util.logging.config.file=/etc/metrics/conf/logging.properties \ -javaagent:/prometheus/jmx_prometheus_javaagent.jar=8090:/etc/metrics/conf/prometheus.yaml \ # 剩余Spark参数 -Dspark.driver.port=7078 -Dspark.driver.blockManager.port=7079 ...排查异常场景
- 加JVM参数
-Dsun.java.util.logging.config.debug=true,可输出JUL配置加载过程,确认配置文件路径正确、未被覆盖 - 确认Spark进程运行用户对日志输出路径有读写权限
- 集群环境下确认日志收集规则已捕获stdout/stderr输出,避免日志已生成但未被收集
- 加JVM参数
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

