创建 SparkSession 后,java.util.logging 停止工作

问题描述 投票:0回答:1

我有一个在 Quarkus 上运行的 Java 应用程序,用于使用版本为

3.5.0
的 Spark 库读取 Delta Lake 表和 Parquet 文件。以下方法在读取数据方面效果很好,但我的问题是日志记录(java.util.logging)。

 public static long getParquetFileRowCount(String parquetFilePath) {
        logger.log(Level.INFO, "Starting to read parquet file: " + parquetFilePath);
        long count = 0;

        try (
                SparkSession spark = SparkSession
                .builder()
                .appName("Java Spark SQL basic example")
                .config("spark.local.dir","/tmp")
                .config("spark.master", "local")
                .getOrCreate()) {

            count = parquetRowCount(spark, parquetFilePath);

            spark.stop();
        }
        System.out.println("SOUT Read parquet file: " + parquetFilePath + " finished.");
        System.out.println("SOUT count: " + count);
        logger.log(Level.INFO, "Read parquet file: " + parquetFilePath + " finished.");

        return count;
}

输出:

INFO: Starting to read parquet file: *filepath*
SOUT Read parquet file: *filepath* finished.
SOUT count: *count*

因此显示的唯一消息来自 SOUT 方法,而不是记录器,甚至来自我的应用程序的不同类的任何其他日志。即使在下一次执行该操作之后,输出中也只有来自 SOUT 的消息。

有没有办法让 java.util.logging 与 Spark 一起工作?

java apache-spark quarkus java.util.logging
1个回答
0
投票
新创建会话时,Spark 正在调用 org.slf4j.bridge.SLF4JBridgeHandler::removeHandlersForRootLogger

。删除所有处理程序后,他们会在根 JUL 记录器上安装 SLF4JBridgeHandler。问题是此代码在您设置 JUL 记录器后运行。 最好的方法是将

SLF4J 与 java.util.logging

一起使用,并让 log4j2 配置文件或 logback 配置文件控制所有记录器。然后 JUL 将路由到 SLF4J,SLF4J 将与您喜欢的提供商绑定。

© www.soinside.com 2019 - 2024. All rights reserved.