Bagaimana cara menghentikan pesan INFO yang ditampilkan pada konsol percikan?


181

Saya ingin menghentikan berbagai pesan yang datang pada cangkang percikan.

Saya mencoba mengedit log4j.propertiesfile untuk menghentikan pesan ini.

Berikut isinya 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

Namun pesan masih ditampilkan di konsol.

Berikut beberapa contoh pesan

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

Bagaimana saya menghentikan ini?

Jawaban:


168

Edit conf/log4j.propertiesfile Anda dan ubah baris berikut:

log4j.rootCategory=INFO, console

untuk

log4j.rootCategory=ERROR, console

Pendekatan lain adalah:

Mulai cangkang dan ketik yang berikut ini:

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

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

Anda tidak akan melihat log apa pun setelah itu.

Pilihan lain untuk Level meliputi: all, debug, error, fatal, info, off, trace, trace_int,warn

Rincian tentang masing-masing dapat ditemukan dalam dokumentasi.


15
Saya pikir OFF terlalu membatasi. PERINGATAN atau KESALAHAN mungkin lebih cocok di sini.
snowindy

2
Tambahkan itu di proyek Anda Kelas utama.
AkhlD

2
Jawaban yang bagus Adakah cara untuk melakukan hal yang sama dari PySpark secara terprogram?
Tagar

2
Bagian terprogram dari ini tidak berfungsi. Alih-alih lihat jawaban ini dari @cantdutchthis stackoverflow.com/a/37836847/1056563
javadba

1
Siapa @AkhlD ini?
Aviad Klein

151

Tepat setelah mulai spark-shellmengetik;

sc.setLogLevel("ERROR")

Di Spark 2.0 (Scala):

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

API Documents: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession

Untuk Jawa:

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

Bagaimana Anda mengatur properti ini dalam suatu program?
Alex Raj Kaliamoorthy

Ini hanya avaibale untuk spark.sql.SparkSession atau juga avaibale untuk JavaSparkContext ??
SharpLu

Ya, itu tersedia untuk JavaSparkContext . Terima kasih, @cantdutchini. Ini telah mengganggu saya untuk sementara waktu.
alan

1
Ini adalah satu-satunya jawaban yang bekerja untuk saya tanpa membuat log4j terpisah. Terima kasih!
abhihello123

2
Ini bekerja untuk saya, namun saya masih mendapatkan beberapa pesan di awal pengujian saya. Ada ide?

46

Terima kasih @AkhlD dan @Sachin Janani karena menyarankan perubahan pada .conffile.

Kode berikut memecahkan masalah saya:

1) Ditambahkan import org.apache.log4j.{Level, Logger}di bagian impor

2) Menambahkan baris berikut setelah pembuatan objek konteks percikan yaitu setelah val sc = new SparkContext(conf):

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

12
Sudah mencoba ini tetapi masih mendapatkan output logging.
horatio1701d

1
Saya suka solusi ini karena tidak memiliki izin untuk mengakses conf /
Jim Ho

31

Gunakan perintah di bawah ini untuk mengubah level log saat mengirimkan aplikasi menggunakan spark-submit atau 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"

Catatan: ganti <file path>tempat log4jfile konfigurasi disimpan.

Log4j.properties:

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>

Beralih ke FileAppender di log4j.xml jika Anda ingin menulis log ke file bukan konsol. LOG_DIRadalah variabel untuk direktori log yang dapat Anda berikan menggunakan 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>

Hal penting lain yang perlu dipahami di sini adalah, ketika pekerjaan diluncurkan dalam mode terdistribusi (mode penyebaran cluster dan master sebagai benang atau mesos) file konfigurasi log4j harus ada pada driver dan node pekerja ( log4j.configuration=file:<file path>/log4j.xml) lain log4j init akan mengeluh-

log4j: ERROR Tidak dapat membaca file konfigurasi [log4j.properties]. java.io.FileNotFoundException: log4j.properties (Tidak ada file atau direktori seperti itu)

Petunjuk untuk memecahkan masalah ini-

Simpan file konfigurasi log4j dalam sistem file terdistribusi (HDFS atau mesos) dan tambahkan konfigurasi eksternal menggunakan log4j PropertyConfigurator . atau gunakan addCile sparkContext untuk membuatnya tersedia pada setiap node kemudian gunakan log4j PropertyConfigurator untuk memuat ulang konfigurasi.


2
Ini adalah salah satu dari beberapa contoh yang tidak memecahkan semua orglog yang secara tradisional dari logger default.
deepelement

1
Ini bekerja dengan sangat baik, tetapi untuk apa Log4j.propertiesfile ini? Sepertinya tidak digunakan. Apakah Anda hanya mendokumentasikan properti yang diatur dalam file XML?
vy32

1
Anda bisa menggunakan keduanya.
Rahul Sharma

3
Saya telah sukses dengan hal di atas - saya gunakan --filesdalam perintah spark-submit untuk membuat log4j.properties tersedia di semua node.
Ben Watson

1
Ini adalah satu-satunya solusi yang bekerja untuk saya dan tidak melibatkan perubahan kode apa pun. Buat file di Log4.propertiesbawah main/resourcesdalam kasus itu tidak ada
Yeikel

30

Semua metode dikumpulkan dengan contoh

Intro

Sebenarnya, ada banyak cara untuk melakukannya . Beberapa lebih sulit dari yang lain, tetapi terserah Anda mana yang paling cocok untuk Anda. Saya akan mencoba memamerkan semuanya.


# 1 Secara programatik di aplikasi Anda

Tampaknya yang termudah, tetapi Anda harus mengkompilasi ulang aplikasi Anda untuk mengubah pengaturan itu. Secara pribadi, saya tidak suka tetapi berfungsi dengan baik.

Contoh:

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)

Anda dapat mencapai lebih banyak lagi hanya dengan menggunakan log4jAPI.
Sumber: [ Dokumen Konfigurasi Log4J , bagian Konfigurasi]


# 2 Lewati log4j.propertiesselamaspark-submit

Yang ini sangat rumit, tetapi bukan tidak mungkin. Dan favorit saya.

Log4J selama startup aplikasi selalu mencari dan memuat log4j.propertiesfile dari classpath.

Namun, saat menggunakan spark-submitclasspath Spark Cluster lebih diutamakan daripada classpath aplikasi! Inilah sebabnya mengapa menempatkan file ini di guci Anda tidak akan mengesampingkan pengaturan cluster!

Tambahkan -Dlog4j.configuration=<location of configuration file>ke spark.driver.extraJavaOptions (untuk driver) atau
spark.executor.extraJavaOptions (untuk pelaksana) .

Perhatikan bahwa jika menggunakan file, file:protokol harus disediakan secara eksplisit, dan file tersebut harus ada secara lokal di semua node .

Untuk memenuhi kondisi terakhir, Anda dapat mengunggah file ke lokasi yang tersedia untuk node (seperti hdfs) atau mengaksesnya secara lokal dengan driver jika menggunakan deploy-mode client. Jika tidak:

unggah custom log4j.propertiesmenggunakan spark-submit, dengan menambahkannya ke --filesdaftar file yang akan diunggah dengan aplikasi.

Sumber: Spark docs, Debugging

Langkah:

Contoh 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

Eksekusi spark-submit, untuk mode klaster:

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"

Perhatikan bahwa Anda harus menggunakan --driver-java-optionsjika menggunakan clientmode. Spark docs, Runtime env

Eksekusi spark-submit, untuk mode klien:

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"

Catatan:

  1. File yang diunggah spark-clusterdengan --filesakan tersedia di direktori root, jadi tidak perlu menambahkan jalur apa pun di file:log4j.properties.
  2. File yang terdaftar di --filesharus disediakan dengan jalur absolut!
  3. file: awalan dalam konfigurasi URI adalah wajib.

# 3 Edit cluster conf/log4j.properties

Ini mengubah file konfigurasi pencatatan global .

perbarui $SPARK_CONF_DIR/log4j.propertiesfile dan itu akan diunggah secara otomatis bersama dengan konfigurasi lainnya.

Sumber: Spark docs, Debugging

Untuk menemukan Anda, SPARK_CONF_DIRAnda dapat menggunakan 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

Sekarang cukup edit /var/lib/spark/latest/conf/log4j.properties(dengan contoh dari metode # 2) dan semua aplikasi Anda akan berbagi konfigurasi ini.


# 4 Ganti direktori konfigurasi

Jika Anda menyukai solusi # 3, tetapi ingin menyesuaikannya per aplikasi, Anda sebenarnya dapat menyalin conffolder, mengedit kontennya dan menentukan sebagai konfigurasi root selama spark-submit.

Untuk menentukan direktori konfigurasi lain selain dari yang standar “SPARK_HOME/conf”, Anda dapat mengatur SPARK_CONF_DIR. Spark akan menggunakan file-file konfigurasi ( spark-defaults.conf, spark-env.sh, log4j.properties, dll ) dari direktori ini.

Sumber: Spark docs, Configuration

Langkah:

  1. Salin conffolder kluster (info lebih lanjut, metode # 3)
  2. Edit log4j.propertiesdalam folder itu (contoh dalam metode # 2)
  3. Setel SPARK_CONF_DIRke folder ini, sebelum menjalankan spark-submit,
    contoh:

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

Kesimpulan

Saya tidak yakin apakah ada metode lain, tapi saya harap ini mencakup topik dari A hingga Z. Jika tidak, jangan ragu untuk mengirim saya komentar.

Nikmati jalanmu!


Ini harus menjadi jawaban yang diterima. Ini menawarkan banyak detail dan jumlah kasus penggunaan lebih banyak daripada yang lain. (Tanpa mendorong untuk menonaktifkan log.)
belgacea

@ Altis - Anda harus menambahkan di bawah Jadi jika Anda seperti saya dan menemukan bahwa jawaban di atas tidak membantu, maka mungkin Anda juga harus menghapus akhiran '.template' dari file conf log4j Anda dan kemudian di atas berfungsi dengan baik!
suatu hari

1
Catatan tambahan tentang pendekatan program- Level ini harus ditetapkan sebelum SparkContext dibuat
Arunraj Nair

@ArunrajNair tidak boleh demikian, karena logging adalah fitur terpisah, tidak terhubung ke SparkContext.
Atais

19

Anda mengatur untuk menonaktifkan Log dengan mengatur levelnya ke OFF sebagai berikut:

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

atau edit file log dan setel level log ke mati hanya dengan mengubah properti berikut:

log4j.rootCategory=OFF, console

Di file mana saya mengatur properti di atas ??
Vishwas

Anda dapat menambahkan baris-baris ini di program Driver Anda @Vishwas
Sachin Janani

Saya telah menambahkan log yang sama tetapi masih muncul di konsol
Vishwas

Sudahkah Anda mengubah properti log4j.rootCategory = OFF. Saya telah menguji ini pada akhirnya dan berfungsi dengan baik
Sachin Janani

3
Ini membuat nol perbedaan bagi saya di Spark 2.3.1
Toby Eggitt

15

Saya hanya menambahkan baris ini ke semua skrip pyspark saya di atas tepat di bawah pernyataan impor.

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

contoh header dari skrip pyspark saya

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

13
Ini berfungsi, tetapi itu tidak menghentikan 58 baris pesan INFO yang muncul selama pembuatan konteks Spark.
vy32

1
Perhatikan bahwa ini untuk Spark 2.x
Yeikel

13

Jawaban di atas benar tetapi tidak benar-benar membantu saya karena ada informasi tambahan yang saya butuhkan.

Saya baru saja menyiapkan Spark sehingga file log4j masih memiliki akhiran '.template' dan tidak sedang dibaca. Saya percaya bahwa logging maka default ke conf log logging inti.

Jadi jika Anda seperti saya dan menemukan bahwa jawaban di atas tidak membantu, maka mungkin Anda juga harus menghapus akhiran '.template' dari file conf log4j Anda dan kemudian jawaban di atas berfungsi dengan baik!

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


Silakan periksa jawaban ini, stackoverflow.com/a/51554118/2094086 harap Anda mencari yang sama.
Gaurav Adurkar

5

Dengan Python / Spark kita bisa melakukan:

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 setelah mendefinisikan 'sc' memanggil fungsi ini dengan: quiet_logs (sc)


Saya ingin menemukan cara programatik yang berfungsi tanpa mengacaukan file log4j - tetapi ketika saya mencobanya, saya masih mendapatkan peringatan seperti WARN org.apache.spark.scheduler.TaskSetManager: Hilang tugas 612.1 di panggung 0.0 (TID 2570 ..., pelaksana 15): TaskKilled (attem lain
MrCartoonology

5

tl; dr

Untuk Konteks Spark Anda dapat menggunakan:

sc.setLogLevel(<logLevel>)

di mana loglevelSEMUA, DEBUG, KESALAHAN, FATAL, INFO, OFF, TRACE atau WARN.


Detail-

Secara internal, setLogLevelpanggilan org.apache.log4j.Level.toLevel(logLevel)yang akan digunakan untuk mengatur menggunakan org.apache.log4j.LogManager.getRootLogger().setLevel(level).

Anda dapat langsung mengatur level logging untuk OFFmenggunakan:

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

Anda dapat mengatur pencatatan log default untuk Spark shell conf/log4j.properties. Gunakan conf/log4j.properties.templatesebagai titik awal.

Mengatur Level Log di Aplikasi Spark

Dalam aplikasi Spark mandiri atau saat dalam sesi Spark Shell, gunakan yang berikut:

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

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

Menonaktifkan logging (dalam log4j):

Gunakan yang berikut ini conf/log4j.propertiesuntuk menonaktifkan sepenuhnya logging:

log4j.logger.org=OFF

Referensi: Mastering Spark oleh Jacek Laskowski.


3

Mudah dilakukan di baris perintah ...

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..pilihan lain..


apa spark2-submit?
vy32

spark2-submit digunakan untuk Spark2.
Nephilim

3

Cukup tambahkan param di bawah ini ke perintah spark-shell ATAU spark-submit Anda

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

Periksa nama properti yang tepat (log4jspark.root.logger di sini) dari file log4j.properties. Semoga ini bisa membantu, tepuk tangan!


1
Untuk mengatur ini dari baris perintah akan menjadi luar biasa. Tetapi ini tidak berhasil untuk saya.
swdev

2

Ide yang menarik adalah menggunakan RollingAppender seperti yang disarankan di sini: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ sehingga Anda tidak "mencemari" ruang konsol, tetapi masih dapat melihat hasilnya di bawah $ 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

Metode lain yang memecahkan penyebabnya adalah dengan mengamati jenis pembalakan apa yang biasanya Anda miliki (berasal dari modul dan dependensi yang berbeda), dan mengatur masing-masing rincian untuk pembalakan, sambil memutar log "pihak ketiga" yang sunyi "yang terlalu bertele-tele:

Misalnya,

    # 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. Sesuaikan conf / log4j.properties seperti yang dijelaskan oleh log4j.rootCategory lainnya = ERROR, konsol
  2. Pastikan saat menjalankan pekerjaan percikan Anda, Anda melewati flag --file dengan path file log4j.properties
  3. Jika masih tidak berhasil, Anda mungkin memiliki botol yang memiliki log4j.properties yang dipanggil sebelum log4j.properties baru Anda. Hapus log4j.properties dari jar (jika perlu)

0
sparkContext.setLogLevel("OFF")

1
Saya melakukan keduanya- menghapus akhiran .template dari log4j.properties dan mengatur level ke ERROR, dan val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR) berhasil
Sam-T

0

Selain semua posting di atas, inilah yang memecahkan masalah bagi saya.

Spark menggunakan slf4j untuk mengikat ke penebang. Jika log4j bukan pengikatan pertama yang ditemukan, Anda dapat mengedit file log4j.properties seperti yang Anda inginkan, para logger bahkan tidak digunakan. Misalnya, ini bisa menjadi output SLF4J yang mungkin:

SLF4J: Jalur kelas berisi beberapa ikatan SLF4J. SLF4J: Ditemukan mengikat di [jar: file: / C: / Pengguna / ~ /.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar! / Org / slf4j / impl / StaticLoggerBinder.class] SLF4J: Ditemukan mengikat di [jar: file: / C: / Pengguna / ~ /.m2/repository/org/slf4j/slf4j-log4j12/1.7.19/slf4j-log4j12-1.7.19.jar ! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Lihat http://www.slf4j.org/codes.html#multiple_bindings untuk penjelasan. SLF4J: Ikatan sebenarnya adalah tipe [org.slf4j.impl.SimpleLoggerFactory]

Jadi di sini SimpleLoggerFactory digunakan, yang tidak peduli dengan pengaturan log4j.

Tidak termasuk paket slf4j-simple dari proyek saya via

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

menyelesaikan masalah, karena sekarang log4j mengikat logger digunakan dan pengaturan apa pun di log4j.properties dipatuhi. FYI file properti log4j saya berisi (selain konfigurasi normal)

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

Semoga ini membantu!


0

Yang ini berhasil untuk saya. Hanya pesan ERROR yang ditampilkan stdout, log4j.propertiesfile mungkin terlihat seperti:

# 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

CATATAN: Masukkan log4j.propertiesfile dalam src/main/resourcesfolder agar efektif. Dan jika log4j.propertiestidak ada (artinya sparkmenggunakan log4j-defaults.propertiesfile) maka Anda dapat membuat itu dengan pergi ke SPARK_HOME/confdan kemudian mv log4j.properties.template log4j.propertiesdan kemudian dilanjutkan dengan kata di atas perubahan.


0

Jika Anda tidak memiliki kemampuan untuk mengedit kode java untuk menyisipkan .setLogLevel()pernyataan dan Anda tidak ingin lebih banyak file eksternal untuk digunakan, Anda dapat menggunakan cara brute force untuk menyelesaikannya. Cukup filter garis INFO menggunakan grep.

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

0

Jika ada orang lain yang terjebak dalam hal ini,

tidak ada yang di atas bekerja untuk saya. Saya harus menghapus

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'

dari build.gradle saya agar log hilang. TLDR: Jangan mengimpor kerangka logging lain, Anda harus baik-baik saja hanya menggunakanorg.apache.log4j.Logger


0

Cara lain untuk sepenuhnya menghentikan log adalah:

    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...}

        }
    }

Ini berhasil untuk saya. NullAppender adalah

Appender yang mengabaikan acara log. ( https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/NullAppender.html )

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.