จะหยุดการแสดงข้อความ INFO บน spark console ได้อย่างไร?


181

ฉันต้องการหยุดข้อความต่าง ๆ ที่กำลังมาบน spark shell

ฉันพยายามแก้ไข 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

แนวทางอื่นคือ:

เริ่ม spark-shell และพิมพ์ดังต่อไปนี้:

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 โดยทางโปรแกรม?
Tagar

2
ส่วนการเขียนโปรแกรมนี้ไม่ทำงาน โปรดดูคำตอบนี้จาก @cantdutchthis stackoverflow.com/a/37836847/1056563
javadba

1
@AkhlD นี้คือใคร
Aviad Klein

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");

คุณจะตั้งค่าคุณสมบัตินี้ในโปรแกรมอย่างไร?
Alex Raj Kaliamoorthy

นี่เป็นเพียง avaibale สำหรับ spark.sql.SparkSession หรือ avaibale สำหรับ JavaSparkContext
SharpLu

ใช่มันใช้ได้สำหรับJavaSparkContext ขอบคุณ @cantdutch นี้ สิ่งนี้รบกวนฉันมาระยะหนึ่งแล้ว
อลัน

1
นี่เป็นคำตอบเดียวที่ใช้ได้สำหรับฉันโดยไม่ได้สร้าง log4j แยกต่างหาก ขอบคุณ!
abhihello123

2
มันใช้งานได้สำหรับฉัน แต่ฉันยังคงได้รับข้อความสองสามข้อความตั้งแต่เริ่มต้นการทดสอบ ความคิดใด ๆ

46

ขอบคุณ @AkhlD และ @Sachin Janani สำหรับการแนะนำการเปลี่ยนแปลงใน.confไฟล์

รหัสต่อไปนี้แก้ไขปัญหาของฉัน:

1) เพิ่มimport org.apache.log4j.{Level, Logger}ในส่วนการนำเข้า

2) เพิ่มบรรทัดต่อไปนี้หลังจากสร้างวัตถุบริบท Spark เช่นหลังจากval sc = new SparkContext(conf):

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

12
พยายามทำสิ่งนี้ แต่ยังคงได้รับเอาต์พุตการบันทึก
horatio1701d

1
ฉันชอบวิธีนี้เนื่องจากไม่ได้รับอนุญาตให้เข้าถึง conf /
Jim Ho

31

ใช้คำสั่งด้านล่างเพื่อเปลี่ยนระดับการบันทึกขณะส่งแอปพลิเคชันโดยใช้ spark-submit หรือ 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.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>

สลับไปที่ 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>

สิ่งสำคัญอีกประการที่ควรทำความเข้าใจที่นี่คือเมื่องานเปิดตัวในโหมดกระจาย (คลัสเตอร์โหมดปรับใช้และต้นแบบเป็นไหมพรมหรือ mesos) ไฟล์การกำหนดค่า log4j ควรมีอยู่บนไดรเวอร์และโหนดงาน ( log4j.configuration=file:<file path>/log4j.xml) มิฉะนั้น log4j init จะบ่น -

log4j: ข้อผิดพลาดไม่สามารถอ่านไฟล์กำหนดค่า [log4j.properties] java.io.FileNotFoundException: log4j.properties (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว)

คำแนะนำในการแก้ปัญหานี้ -

เก็บไฟล์ config log4j ในระบบแฟ้มกระจาย (HDFS หรือ Mesos) และเพิ่มการกำหนดค่าภายนอกโดยใช้PropertyConfigurator log4j หรือใช้sparkContext addFileเพื่อให้พร้อมใช้งานในแต่ละโหนดจากนั้นใช้ log4j PropertyConfigurator เพื่อโหลดการกำหนดค่าใหม่


2
นี่เป็นหนึ่งในตัวอย่างไม่กี่ตัวที่ไม่ใช้การorgบันทึกทั้งหมดที่สืบเนื่องมาจากตัวบันทึกเริ่มต้น
deepelement

1
มันใช้งานได้ดีมาก แต่Log4j.propertiesไฟล์นี้มีไว้ทำอะไร? ดูเหมือนจะไม่ได้ใช้ คุณเพียงแค่บันทึกคุณสมบัติที่ตั้งไว้ในไฟล์ XML หรือไม่?
vy32

1
คุณสามารถใช้อย่างใดอย่างหนึ่ง
ราหูชาร์

3
ฉันประสบความสำเร็จกับข้างต้น - ฉันใช้--filesในคำสั่ง spark-submit เพื่อทำให้ log4j.properties พร้อมใช้งานบนโหนดทั้งหมด
เบ็นวัตสัน

1
นี่เป็นทางออกเดียวที่ได้ผลสำหรับฉันและไม่เกี่ยวข้องกับการเปลี่ยนแปลงรหัสใด ๆ สร้างไฟล์Log4.propertiesภายใต้main/resourcesในกรณีที่ไม่มีอยู่
Yeikel

30

วิธีการทั้งหมดที่เก็บรวบรวมด้วยตัวอย่าง

Intro

อันที่จริงมีหลายวิธีที่จะทำมัน บางอย่างนั้นยากกว่าจากคนอื่น ๆ แต่ก็ขึ้นอยู่กับคุณว่าแบบไหนที่เหมาะกับคุณที่สุด ฉันจะพยายามแสดงให้พวกเขาทั้งหมด


# 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-submitclasspath ของ Spark Cluster มีความสำคัญเหนือกว่า classpath ของแอพ! นี่คือเหตุผลที่การวางไฟล์นี้ลงในขวดโหลของคุณจะไม่แทนที่การตั้งค่าของกลุ่ม!

เพิ่ม-Dlog4j.configuration=<location of configuration file>ไปยัง spark.driver.extraJavaOptions (สำหรับไดรเวอร์)หรือ
spark.executor.extraJavaOptions (สำหรับผู้บริหาร) (สำหรับผู้จัดการ)

โปรดทราบว่าถ้าใช้ไฟล์ที่file:โปรโตคอลควรจะให้อย่างชัดเจนและไฟล์ความต้องการที่จะอยู่ภายในโหนดทั้งหมด

เพื่อตอบสนองเงื่อนไขสุดท้ายคุณสามารถอัปโหลดไฟล์ไปยังสถานที่ที่มีอยู่สำหรับโหนด (ชอบhdfs) deploy-mode clientหรือการเข้าถึงในท้องถิ่นกับคนขับรถถ้าใช้ มิฉะนั้น:

อัปโหลดกำหนดเองlog4j.propertiesโดยใช้ spark-submit โดยเพิ่มลงใน--filesรายการไฟล์ที่จะอัปโหลดด้วยแอปพลิเคชัน

ที่มา: Spark docs, Debugging

ขั้นตอน:

ตัวอย่าง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โหมด Spark docs, 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จะมีให้ที่ root dir ดังนั้นจึงไม่จำเป็นต้องเพิ่มเส้นทางใด ๆfile:log4j.propertiesใน
  2. ไฟล์ที่ระบุในนั้น--filesจะต้องมีเส้นทางที่แน่นอน!
  3. file: คำนำหน้าในการกำหนดค่า URI จำเป็นต้องมี

# 3 แก้ไขของคลัสเตอร์ conf/log4j.properties

นี้จะเปลี่ยนการตั้งค่าไฟล์เข้าสู่ระบบทั่วโลก

อัปเดต$SPARK_CONF_DIR/log4j.propertiesไฟล์และมันจะถูกอัปโหลดโดยอัตโนมัติพร้อมกับการกำหนดค่าอื่น ๆ

ที่มา: Spark docs, Debugging

ในการค้นหาของ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 แต่ต้องการที่จะกำหนดมันต่อการประยุกต์ใช้จริงคุณสามารถคัดลอกโฟลเดอร์แก้ไขเนื้อหาและระบุการกำหนดค่ารากในช่วงconfspark-submit

หากต้องการระบุไดเรกทอรีการกำหนดค่าอื่นนอกเหนือจากค่าเริ่มต้น“SPARK_HOME/conf”คุณสามารถตั้งค่าSPARK_CONF_DIRได้ Spark จะใช้การตั้งค่าไฟล์ ( spark-defaults.conf, spark-env.sh, log4j.properties, ฯลฯ ) จากไดเรกทอรีนี้

ที่มา: Spark docs, Configuration

ขั้นตอน:

  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"
    

ข้อสรุป

ฉันไม่แน่ใจว่ามีวิธีอื่นหรือไม่ แต่ฉันหวังว่านี่จะครอบคลุมหัวข้อจาก A ถึง Z หากไม่รู้สึกลังเลที่จะ ping ฉันในความคิดเห็น!

สนุกกับวิธีของคุณ!


นี่ควรเป็นคำตอบที่ยอมรับได้ มันมีรายละเอียดมากมายและสรุปจำนวนกรณีการใช้งานมากกว่ากรณีอื่น ๆ (ไม่สนับสนุนให้ปิดใช้งานบันทึก)
belgacea

@Atais - คุณควรเพิ่มด้านล่างดังนั้นหากคุณเป็นเหมือนฉันและพบว่าคำตอบข้างต้นไม่ได้ช่วยคุณอาจต้องลบส่วนต่อท้าย '.template' ออกจากไฟล์ conf44 ของคุณจากนั้นไฟล์ด้านบนใช้งานได้อย่างสมบูรณ์แบบ!
OneDay

1
หมายเหตุเพิ่มเติมเกี่ยวกับวิธีการเขียนโปรแกรม - ระดับจะต้องมีการตั้งค่าก่อนที่จะสร้าง SparkContext
Arunraj Nair

@ArunrajNair ไม่ควรเป็นกรณีนี้เนื่องจากการบันทึกเป็นคุณสมบัติแยกต่างหากไม่ได้เชื่อมต่อกับ SparkContext
Atais

19

คุณตั้งค่าปิดใช้งานบันทึกโดยการตั้งค่าระดับเป็นปิดดังนี้:

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

หรือแก้ไขไฟล์บันทึกและตั้งค่าระดับการบันทึกเป็นปิดเพียงแค่เปลี่ยนคุณสมบัติต่อไปนี้:

log4j.rootCategory=OFF, console

ไฟล์ใดที่ฉันจะตั้งค่าข้างต้นคุณสมบัติ?
Vishwas

คุณสามารถเพิ่มบรรทัดเหล่านี้ในโปรแกรมไดรเวอร์ของคุณ @Vishwas
Sachin Janani

ฉันได้เพิ่มแบบเดียวกัน แต่ยังมีบันทึกปรากฏบนคอนโซล
Vishwas

คุณได้เปลี่ยนคุณสมบัติ log4j.rootCategory = OFF ฉันได้ทดสอบสิ่งเหล่านี้ในตอนท้ายและการทำงานที่ดี
Sachin Janani

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 ยังคงมีคำต่อท้าย '.ememplate' และไม่ได้ถูกอ่าน ฉันเชื่อว่าการบันทึกจะใช้ค่าเริ่มต้นไปที่การบันทึกการทำงานหลักของ Spark

ดังนั้นหากคุณเป็นเหมือนฉันและพบว่าคำตอบข้างต้นไม่ได้ช่วยคุณอาจต้องลบคำต่อท้าย '.template' ออกจากไฟล์ log4j conf ของคุณจากนั้นไฟล์ดังกล่าวจะทำงานได้อย่างสมบูรณ์แบบ!

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


โปรดตรวจสอบคำตอบนี้stackoverflow.com/a/51554118/2094086หวังว่าคุณกำลังมองหาสิ่งเดียวกัน
Gaurav Adurkar

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' ที่กำหนดหลังจากเรียกฟังก์ชันนี้โดย: quiet_logs (sc)


ฉันชอบที่จะหาวิธีการเขียนโปรแกรมที่ทำงานได้โดยไม่ต้องยุ่งกับไฟล์ log4j - แต่เมื่อฉันลองฉันยังคงได้รับคำเตือนเช่น WARN org.apache.spark.scheduler.TaskSetManager: งานที่หายไป 612.1 ในระยะ 0.0 (TID 2570 ... , ผู้ดำเนินการ 15 คน): TaskKilled (ตอบรับอีกครั้ง
MrCartoonology

5

TL; DR

สำหรับบริบท Spark คุณสามารถใช้:

sc.setLogLevel(<logLevel>)

ซึ่งloglevelสามารถเป็น ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE หรือ WARN


Details-

ภายในsetLogLevelสายว่ามันแล้วใช้ในการตั้งค่าการใช้org.apache.log4j.Level.toLevel(logLevel)org.apache.log4j.LogManager.getRootLogger().setLevel(level)

คุณสามารถตั้งค่าระดับการบันทึกโดยตรงให้OFFใช้:

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

คุณสามารถตั้งค่าการบันทึกเริ่มต้นสำหรับ Spark shell 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

การอ้างอิง: Mastering Spark โดย Jacek Laskowski


3

ง่าย ๆ ในการทำบนบรรทัดคำสั่ง ...

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..ตัวเลือกอื่น..


คือspark2-submitอะไร
vy32

spark2-submit ใช้สำหรับ Spark2
Nephilim

3

เพียงเพิ่มพารามิเตอร์ด้านล่างลงในคำสั่ง spark-shell หรือ spark-submit ของคุณ

--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/ เพื่อให้คุณไม่ได้ "polute" พื้นที่คอนโซล แต่ ยังสามารถดูผลลัพธ์ภายใต้ $ 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 = ERROR คอนโซลอื่น ๆ
  2. ตรวจสอบให้แน่ใจในขณะที่ดำเนินงาน spark ของคุณที่คุณผ่าน - ไฟล์ธงที่มีเส้นทางไฟล์ log4j.properties
  3. หากยังใช้งานไม่ได้คุณอาจมี jar ที่มี log4j.properties ที่ถูกเรียกใช้ก่อนที่จะมี log4j.properties ใหม่ของคุณ ลบ log4j.properties นั้นออกจาก jar (หากเหมาะสม)

0
sparkContext.setLogLevel("OFF")

1
ฉันทำทั้งสอง - ลบ. ต่อท้ายเทมเพลตออกจาก log4j.properties และตั้งค่าระดับเป็นข้อผิดพลาดและใช้ 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: ไฟล์: / 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-simple จากโครงการของฉันผ่านทาง

<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

หากคุณไม่มีความสามารถในการแก้ไขโค้ดจาวาเพื่อแทรก.setLogLevel()คำสั่งและคุณไม่ต้องการให้มีไฟล์ภายนอกเพิ่มเติมสำหรับการปรับใช้คุณสามารถใช้วิธีบังคับแบบเดรัจฉานเพื่อแก้ปัญหานี้ เพียงกรองบรรทัดข้อมูลโดยใช้ 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 คือ

Appender ที่ละเว้นบันทึกเหตุการณ์ ( https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/NullAppender.html )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.