Як зупинити показ INFO-повідомлень на іскровій консолі?


181

Я хотів би зупинити різні повідомлення, які надходять на іскрову оболонку.

Я намагався редагувати log4j.propertiesфайл, щоб зупинити це повідомлення.

Ось зміст log4j.properties

# Define the root logger with appender file
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

Але повідомлення все ще відображаються на консолі.

Ось кілька прикладів повідомлень

15/01/05 15:11:45 INFO SparkEnv: Registering BlockManagerMaster
15/01/05 15:11:45 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20150105151145-b1ba
15/01/05 15:11:45 INFO MemoryStore: MemoryStore started with capacity 0.0 B.
15/01/05 15:11:45 INFO ConnectionManager: Bound socket to port 44728 with id = ConnectionManagerId(192.168.100.85,44728)
15/01/05 15:11:45 INFO BlockManagerMaster: Trying to register BlockManager
15/01/05 15:11:45 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.100.85:44728 with 0.0 B RAM
15/01/05 15:11:45 INFO BlockManagerMaster: Registered BlockManager
15/01/05 15:11:45 INFO HttpServer: Starting HTTP Server
15/01/05 15:11:45 INFO HttpBroadcast: Broadcast server star

Як я можу це зупинити?

Відповіді:


168

Відредагуйте conf/log4j.propertiesфайл та змініть такий рядок:

log4j.rootCategory=INFO, console

до

log4j.rootCategory=ERROR, console

Іншим підходом було б:

Запустіть іскрову оболонку та введіть наступне:

import org.apache.log4j.Logger
import org.apache.log4j.Level

Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

Після цього ви не побачите жодного журналу.

Інші варіанти включають в себе рівень: all, debug, error, fatal, info, off, trace, trace_int,warn

Деталі про кожен можна знайти в документації.


15
Я думаю, що OFF занадто обмежуючий. ПОПЕРЕДЖЕННЯ або ПОМИЛКА можуть тут краще поміститися.
snowindy

2
Додайте це у своїх проектах Основний клас.
AkhlD

2
Чудова відповідь. Будь-який спосіб зробити те ж саме з PySpark програмно?
Тагар

2
Програмна частина цього не працює. Замість того, щоб побачити цю відповідь від @cantdutchthis stackoverflow.com/a/37836847/1056563
javadba

1
Хто це @AkhlD?
Авіад Кляйн

151

Відразу після запуску spark-shellтипу;

sc.setLogLevel("ERROR")

В Spark 2.0 (Scala):

spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")

Документи API: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession

Для Java:

spark = SparkSession.builder.getOrCreate();
spark.sparkContext().setLogLevel("ERROR");

Як би ви встановили цю властивість у програмі?
Алекс Радж Каліаморті

Це лише avaibale для spark.sql.SparkSession або також avaibale для JavaSparkContext ??
SharpLu

Так, це доступно для JavaSparkContext . Дякую, @cantdutchthis. Це мене хвилювало деякий час.
алан

1
Це єдина відповідь, яка працювала для мене без створення окремого log4j. Дякую!
abhihello123

2
Це працює для мене, однак я ще отримую пару повідомлень на початку свого тесту. Будь-яка ідея?

46

Дякуємо @AkhlD та @Sachin Janani, що запропонували зміни у .confфайлі.

Наступний код вирішив мою проблему:

1) Додано import org.apache.log4j.{Level, Logger}в розділ імпорту

2) Додано наступний рядок після створення об'єкта контексту іскри, тобто після val sc = new SparkContext(conf):

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)

12
Спробував це, але все одно отримував результати виходу з журналу.
horatio1701d

1
Мені подобається, що це рішення не має дозволу на доступ до конф. /
Джим Хо

31

Використовуйте команду нижче, щоб змінити рівень журналу під час подання програми, використовуючи подачу іскри або spark-sql:

spark-submit \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml"

Примітка: замініть, <file path>де log4jзберігається конфігураційний файл.

Властивості Log4j.

log4j.rootLogger=ERROR, console

# set the log level for these components
log4j.logger.com.test=DEBUG
log4j.logger.org=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.org.spark-project=ERROR
log4j.logger.org.apache.hadoop=ERROR
log4j.logger.io.netty=ERROR
log4j.logger.org.apache.zookeeper=ERROR

# add a ConsoleAppender to the logger stdout to write to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# use a simple message format
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out"/>
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
  </appender>
    <logger name="org.apache.spark">
        <level value="error" />
    </logger>
    <logger name="org.spark-project">
        <level value="error" />
    </logger>
    <logger name="org.apache.hadoop">
        <level value="error" />
    </logger>
    <logger name="io.netty">
        <level value="error" />
    </logger>
    <logger name="org.apache.zookeeper">
        <level value="error" />
    </logger>
   <logger name="org">
        <level value="error" />
    </logger>
    <root>
        <priority value ="ERROR" />
        <appender-ref ref="console" />
    </root>
</log4j:configuration>

Перейдіть до FileAppender в log4j.xml, якщо ви хочете писати журнали у файл замість консолі. LOG_DIR- це змінна для каталогу журналів, яку ви можете надати за допомогою spark-submit --conf "spark.driver.extraJavaOptions=-D.

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${LOG_DIR}"/>
        <param name="datePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n"/>
        </layout>
    </appender>

Ще одна важлива річ, яку слід тут зрозуміти, це те, що коли завдання запускається в розподіленому режимі (кластер-режим розгортання та майстер як пряжа чи мезос), файл конфігурації log4j повинен існувати на вузлах драйверів та робітників ( log4j.configuration=file:<file path>/log4j.xml) інакше log4j init буде скаржитися-

log4j: ПОМИЛКА Не вдалося прочитати файл конфігурації [log4j.properties]. java.io.FileNotFoundException: log4j.properties (Немає такого файлу чи каталогу)

Підказка щодо вирішення цієї проблеми -

Зберігайте конфігураційний файл log4j у розподіленій файловій системі (HDFS або mesos) та додайте зовнішню конфігурацію за допомогою log4j PropertyConfigurator . або використовувати sparkContext addFile, щоб зробити його доступним для кожного вузла, тоді використовуйте log4j PropertyConfigurator для перезавантаження конфігурації.


2
Це один з небагатьох прикладів, який не клобує всіх orgжурналів, які традиційно використовуються з реєстратора за замовчуванням.
заглиблення

1
Це працює дуже добре, але для чого Log4j.propertiesфайл? Це, здається, не використовується. Ви просто документуєте властивості, встановлені у файлі XML?
vy32

1
Ви можете використовувати будь-який з них.
Рахул Шарма

3
Я мав успіх у вищезазначеному - я використовую --filesкоманду spark-submit, щоб зробити log4j.properties доступними для всіх вузлів.
Бен Уотсон

1
Це єдине рішення, яке працювало для мене, і воно не передбачає жодної зміни коду. Створіть файл Log4.propertiesпід main/resourcesв разі, якщо він не існує
Yeikel

30

Всі методи, зібрані на прикладах

Вступ

Власне, існує багато способів зробити це . Деяким важче від інших, але саме вам підійде саме той. Я спробую показати їх усіх.


№1 Програматично у вашому додатку

Здається, це найпростіше, але вам потрібно буде перекомпілювати додаток, щоб змінити ці налаштування. Особисто мені це не подобається, але він працює чудово.

Приклад:

import org.apache.log4j.{Level, Logger}

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)

Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)

Можна набагато більше досягти, використовуючи log4jAPI.
Джерело: [ Документи конфігурації Log4J , розділ Конфігурація]


№2 Прохід log4j.propertiesпротягомspark-submit

Цей дуже складний, але не неможливий. І мій улюблений.

Log4J під час запуску програми завжди шукає та завантажує log4j.propertiesфайл із classpath.

Однак при використанні spark-submitкласу Spark Cluster перевага є перед класним шляхом додатка! Ось чому розміщення цього файлу у вашій жировій банці не змінить налаштування кластеру!

Додати -Dlog4j.configuration=<location of configuration file>в spark.driver.extraJavaOptions (для водія) або
spark.executor.extraJavaOptions (для виконавців) .

Зауважте, що якщо використовується файл, file:протокол повинен бути явно наданий, і файл повинен існувати локально на всіх вузлах .

Щоб задовольнити останню умову, ви можете або завантажити файл у місце, доступне для вузлів (наприклад hdfs), або отримати доступ до нього локально з драйвером, якщо використовується deploy-mode client. Інакше:

завантажте спеціальний log4j.propertiesза допомогою іскрової подачі, додавши його до --filesсписку файлів, які потрібно завантажити у програмі.

Джерело: Іскрові документи, Налагодження

Кроки:

Приклад log4j.properties:

# Blacklist all to warn level
log4j.rootCategory=WARN, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO

Виконання spark-submitдля кластерного режиму:

spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"

Зауважте, що ви повинні користуватися, --driver-java-optionsякщо використовуєте clientрежим. Іскрові документи, Runtime env

Виконання spark-submitдля клієнтського режиму:

spark-submit \
    --master yarn \
    --deploy-mode client \
    --driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"

Примітки:

  1. Файли , завантажені для spark-clusterз --filesбудуть доступні в кореневій директорії, тому немає необхідності додавати будь-який шлях вfile:log4j.properties .
  2. Файли, перелічені в, --filesповинні бути забезпечені абсолютним шляхом!
  3. file: префікс у URI конфігурації є обов'язковим.

№3 Редагування кластерів conf/log4j.properties

Це змінює конфігураційний файл глобального журналу .

оновити $SPARK_CONF_DIR/log4j.properties файл, і він буде автоматично завантажений разом з іншими конфігураціями.

Джерело: Іскрові документи, Налагодження

Щоб знайти своє, SPARK_CONF_DIRви можете скористатися spark-shell:

atais@cluster:~$ spark-shell 
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.1
      /_/   

scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf

Тепер просто відредагуйте /var/lib/spark/latest/conf/log4j.properties (наприклад, метод №2), і всі ваші програми поділяться цією конфігурацією.


# 4 Переопределення конфігураційного каталогу

Якщо ви , як рішення # 3, але хочете , щоб налаштувати його для кожної програми, ви можете скопіювати confпапку, відредагувати його вміст і вказати в якості конфігурації кореня під час spark-submit.

Щоб вказати інший каталог конфігурації, відмінний від типового “SPARK_HOME/conf”, ви можете встановити SPARK_CONF_DIR. Свічка буде використовувати файли конфігурації ( spark-defaults.conf, spark-env.sh, log4j.properties, і т.д. ) з цього каталогу.

Джерело: Іскрові документи, Конфігурація

Кроки:

  1. Скопіюйте кластери conf папку (додаткова інформація, метод №3)
  2. Редагувати log4j.properties в цій папці (приклад у способі №2)
  3. Встановіть SPARK_CONF_DIRв цю папку, перед виконанням spark-submit,
    наприклад:

    export SPARK_CONF_DIR=/absolute/path/to/custom/conf
    
    spark-submit \
        --master yarn \
        --deploy-mode cluster \
        --class com.github.atais.Main \
        "SparkApp.jar"
    

Висновок

Я не впевнений, чи є якийсь інший метод, але я сподіваюся, що це стосується теми від А до Я. Якщо ні, не соромтесь зателефонувати мені в коментарях!

Насолоджуйтесь своїм шляхом!


Це має бути прийнятою відповіддю. Він пропонує багато деталей і підсумовує набагато більше випадків використання, ніж інші. (Без заохочення відключати журнали.)
belgacea

@Atais - Вам слід додати нижче. Отже, якщо ви схожі на мене і виявите, що відповіді вище не допомогли, то, можливо, вам також доведеться вилучити суфікс '.template' з вашого файлу conf4 log4j, і тоді вищезгадане працює чудово!
одноденні

1
Додаткова примітка щодо програмного підходу - рівень повинен бути встановлений до створення SparkContext
Arunraj Nair

@ArunrajNair не повинен бути таким, оскільки ведення журналів - це окрема функція, не підключена до SparkContext.
Atais

19

Ви встановлюєте відключення Журналів, встановлюючи його рівень на OFF, як описано нижче:

Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);

або відредагуйте файл журналу та вимкніть рівень журналу, просто змінивши таке властивість:

log4j.rootCategory=OFF, console

У якому файлі я встановлюю вище властивості ??
Vishwas

Ви можете додати ці рядки до програми Driver @Vishwas
Sachin Janani

Я додав те саме, але все ще журнали з’являються на консолі
Vishwas

Чи змінили ви властивість log4j.rootCategory = OFF. Я перевірив це у своєму кінці та його чудовому виконанні
Сачин Джанані

3
Це робить нульову різницю для мене на Spark 2.3.1
Toby Eggitt

15

Я просто додаю цей рядок до всіх моїх сценаріїв pyspark вгорі трохи нижче операторів імпорту.

SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")

Приклад заголовка моїх сценаріїв pyspark

from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")

13
Це працює, але це не зупиняє 58 рядків повідомлень INFO, які з'являються під час створення контексту Spark.
vy32

1
Зауважте, що це для Spark 2.x
Yeikel

13

Наведені вище відповіді правильні, але точно не допомогли мені, оскільки була потрібна додаткова інформація.

Я тільки що встановив Spark, щоб у файлі log4j все ще був суфікс '.template' і його не читали. Я вважаю, що тоді журнал за замовчуванням налаштований на конфіденційне ведення журналу Spark.

Тож якщо ви схожі на мене і виявите, що відповіді вище не допомогли, то, можливо, вам також доведеться видалити суфікс '.template' з вашого файлу conf4 log4j, і тоді вищезгадане працює чудово!

http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html


Перевірте цю відповідь, stackoverflow.com/a/51554118/2094086 сподіваюся, що ви шукаєте те саме.
Гаурав Адуркар

5

У Python / Spark ми можемо:

def quiet_logs( sc ):
  logger = sc._jvm.org.apache.log4j
  logger.LogManager.getLogger("org"). setLevel( logger.Level.ERROR )
  logger.LogManager.getLogger("akka").setLevel( logger.Level.ERROR )

Після визначення Sparkcontaxt 'sc' викликайте цю функцію за допомогою: silent_logs (sc)


Я хотів би знайти програмний спосіб, який працює, не возившись з файлом log4j - але коли я це спробую, я все одно отримую попередження, як WARN org.apache.spark.scheduler.TaskSetManager: Загублене завдання 612.1 на етапі 0,0 (TID 2570 ..., виконавець 15): Завдання вбито (ще одна спроба
MrCartoonology

5

тл; д-р

Для іскрового контексту ви можете використовувати:

sc.setLogLevel(<logLevel>)

де loglevelможуть бути ВСІ, НАВІДКА, ПОМИЛКА, ФАТАЛЬНІ, ІНФОРМАЦІЯ, ВИМКНЕННЯ, СЛУХА чи ЗАПИСЬ.


Деталі-

Внутрішні setLogLevelдзвінки, org.apache.log4j.Level.toLevel(logLevel)які він потім використовує для встановлення з використанням org.apache.log4j.LogManager.getRootLogger().setLevel(level).

Ви можете безпосередньо встановити рівні журналу, OFFвикористовуючи:

LogManager.getLogger("org").setLevel(Level.OFF)

Ви можете налаштувати журнал за замовчуванням для оболонки Spark в conf/log4j.properties. Використовуйте conf/log4j.properties.templateяк вихідну точку.

Встановлення рівнів журналу в програмах Spark

У автономних програмах Spark або під час сеансу Spark Shell використовуйте наступне:

import org.apache.log4j.{Level, Logger}

Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

Вимкнення журналу (в log4j):

conf/log4j.propertiesЩоб повністю відключити ведення журналу, використовуйте наступне :

log4j.logger.org=OFF

Довідка: Освоєння іскри Яцека Ласковського.


3

Простий в командному рядку ...

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..інші варіанти ..


що таке spark2-submit?
vy32

spark2-submit використовується для Spark2.
Нефілім

3

Просто додайте нижче парам до вашої іскрової оболонки АБО іскри для подання команди

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"

Перевірте точну назву властивості (тут log4jspark.root.logger) з файлу log4j.properties. Сподіваюся, це допомагає, ура!


1
Встановити це з командного рядка було б дивним. Але це не спрацювало для мене.
swdev

2

Цікава ідея - використовувати RollingAppender, як тут запропоновано: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/, щоб ви не «переводили» простір консолі, але Ви все ще зможете бачити результати під $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log.

    log4j.rootLogger=INFO, rolling

log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxFileSize=50MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log
log4j.appender.rolling.encoding=UTF-8

Інший метод, який вирішує причину, - це спостерігати, який тип журналів у вас зазвичай є (виходячи з різних модулів і залежностей), і встановлюйте для кожного деталізацію журналу, перетворюючи при цьому "тихі" сторонні журнали, які занадто багатослівні:

Наприклад,

    # Silence akka remoting
log4j.logger.Remoting=ERROR
log4j.logger.akka.event.slf4j=ERROR
log4j.logger.org.spark-project.jetty.server=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.com.anjuke.dm=${dm.logging.level}
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

0
  1. Налаштування conf / log4j.properties, як описано в іншій log4j.rootCategory = ПОМИЛКА, консоль
  2. Переконайтесь, що під час виконання вашої іскрової задачі ви передаєте - прапор файлу - файл з файлом log4j.properties
  3. Якщо вона все ще не працює, у вас може бути баночка з log4j.properties, яка викликається перед вашими новими log4j.properties. Видаліть log4j.properties з банку (якщо потрібно)

0
sparkContext.setLogLevel("OFF")

1
Я зробив і те й інше - видалив суфікс .template з log4j.properties і встановив рівень ERROR, і val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR) це спрацювало
Sam-T

0

Окрім усіх вищезазначених постів, ось що вирішило питання для мене.

Spark використовує slf4j для прив'язки до реєстраторів. Якщо log4j не є першим знайденим прив'язкою, ви можете редагувати файли log4j.properties все, що завгодно, реєстратори навіть не використовуються. Наприклад, це може бути можливий вихід SLF4J:

SLF4J: Шлях до класу містить кілька прив'язок SLF4J. SLF4J: знайдено прив'язку у [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar! / Org / slf4j / impl / StaticLoggerBinder.class] SLF4J: Знайдено прив'язку у [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j-log4j12/1.7.19/slf4j-log4j12-1.7.19.jar ! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Для пояснення див. http://www.slf4j.org/codes.html#multiple_bindings . SLF4J: Фактична палітура типу [org.slf4j.impl.SimpleLoggerFactory]

Тож тут був використаний SimpleLoggerFactory, який не хвилює налаштування log4j.

Виключення простого пакету slf4j з мого проекту через

<dependency>
        ...
        <exclusions>
            ...
            <exclusion>
                <artifactId>slf4j-simple</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>

проблему вирішено, тому що тепер використовується прив'язка реєстратора log4j і будь-які параметри в log4j.properties дотримуються. FYI мій файл властивостей log4j містить (крім звичайної конфігурації)

log4j.rootLogger=WARN, stdout
...
log4j.category.org.apache.spark = WARN
log4j.category.org.apache.parquet.hadoop.ParquetRecordReader = FATAL
log4j.additivity.org.apache.parquet.hadoop.ParquetRecordReader=false
log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF

Сподіваюся, це допомагає!


0

Цей працював на мене. Для файлів, які відображаються лише як ПОМИЛКА stdout, log4j.propertiesфайл може мати такий вигляд:

# Root logger option
log4j.rootLogger=ERROR, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

ПРИМІТКА. Помістіть log4j.propertiesфайл у src/main/resourcesпапку, щоб він був ефективним. А якщо log4j.propertiesйого немає (мається на увазі sparkвикористання log4j-defaults.propertiesфайлу), ви можете створити його, перейшовши до, SPARK_HOME/confа потім, mv log4j.properties.template log4j.propertiesа потім продовжити вищезазначені зміни.


0

Якщо у вас немає можливості редагувати код java, щоб вставити .setLogLevel()висловлювання, і ви не хочете розгортати більше зовнішніх файлів, ви можете скористатись грубим способом вирішення цього питання. Просто відфільтруйте лінії INFO за допомогою grep.

spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"

0

Якщо хтось застряг на цьому,

нічого з вищезазначеного не працювало для мене. Мені довелося зняти

implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.3"
implementation group: 'com.typesafe.scala-logging', name: "scala-logging_$scalaVersion", version: '3.9.2'

з мого build.gradle, щоб журнали зникли. TLDR: Не імпортуйте будь-які інші рамки реєстрації, вам слід просто використовуватиorg.apache.log4j.Logger


0

Інший спосіб повністю зупинити журнали:

    import org.apache.log4j.Appender;
    import org.apache.log4j.BasicConfigurator;
    import org.apache.log4j.varia.NullAppender;

    public class SomeClass {

        public static void main(String[] args) {
            Appender nullAppender = new NullAppender();
            BasicConfigurator.configure(nullAppender);

            {...more code here...}

        }
    }

Це працювало для мене. NullAppender є

Додаток, який ігнорує події журналу. ( https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/NullAppender.html )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.