स्पार्क कंसोल पर प्रदर्शित होने वाले 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 बहुत प्रतिबंधक है। WARN या ERROR यहां बेहतर तरीके से फिट हो सकते हैं।
बर्फीली

2
उसे अपनी परियोजनाओं में जोड़ें मुख्य वर्ग।
अखलाड

2
बहुत बढ़िया जवाब। किसी भी तरह से PySpark से प्रोग्राम करने का तरीका?
तगारग

2
इसका प्रोग्रामेटिक भाग काम नहीं करता है। इसके बजाय इस उत्तर को @cantdutchthis stackoverflow.com/a/37836847/1056563
javadba

1
यह @AkhlD कौन है?
एवाड क्लेन

151

spark-shellप्रकार शुरू करने के ठीक बाद ;

sc.setLogLevel("ERROR")

स्पार्क 2.0 (स्काला) में:

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

एपीआई डॉक्स: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession

जावा के लिए:

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

आप इस प्रॉपर्टी को किसी प्रोग्राम में कैसे सेट करेंगे?
एलेक्स राज कालीमूर्ति

यह केवल चिंगारी के लिए avaibale है। Sql.SparkSession या JavaSparkContex के लिए भी avaibale ??
SharpLu

हां, यह JavaSparkContext के लिए उपलब्ध है । धन्यवाद, @cantdutchthis इसने मुझे कुछ समय के लिए परेशान किया है।
एलन

1
यह एकमात्र उत्तर है जिसने मेरे लिए एक अलग log4j बनाए बिना काम किया। धन्यवाद!
abhihello123

2
यह मेरे लिए काम करता है, हालांकि मुझे अभी भी अपने परीक्षण की शुरुआत में कुछ संदेश मिल रहे हैं। कोई उपाय?

46

धन्यवाद @AkhlD और @Sachin जनानी में बदलाव का सुझाव देने के लिए .confफ़ाइल ।

निम्नलिखित कोड ने मेरी समस्या हल कर दी:

1) गयी import org.apache.log4j.{Level, Logger} आयात अनुभाग में

2) स्पार्क संदर्भ वस्तु के निर्माण के बाद निम्नलिखित पंक्ति को जोड़ा गया अर्थात val sc = new SparkContext(conf):

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

12
यह कोशिश की लेकिन अभी भी लॉगिंग आउटपुट मिल रहा है।
क्षितिज

1
मैं पहुँच conf करने के लिए कोई अनुमति होने के रूप में इस समाधान की तरह /
जिम हो

31

स्पार्क-सबमिट या स्पार्क-एसक्यूएल का उपयोग करते हुए आवेदन जमा करते समय लॉग स्तर बदलने के लिए नीचे दिए गए आदेश का उपयोग करें:

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>

यदि आप कंसोल के बजाय फ़ाइल में लॉग लिखना चाहते हैं, तो log4j.xml में FileAppender पर स्विच करें। 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: ERROR कॉन्फ़िगरेशन फ़ाइल [log4j.properties] नहीं पढ़ सका। java.io.FileNotFoundException: log4j.properties (ऐसी कोई फ़ाइल या निर्देशिका नहीं)

इस समस्या को हल करने पर संकेत-

वितरित फ़ाइल सिस्टम (HDFS या मेसोस) में लॉग 4 जे कॉन्फिग फाइल रखें और लॉग 4 जे प्रॉपर्टीकॉन्फिगेटर का उपयोग करके बाहरी कॉन्फ़िगरेशन जोड़ें । या स्पार्ककंटेक्स्ट ऐडफाइल का उपयोग करें इसे प्रत्येक नोड पर उपलब्ध कराने के लिए फिर कॉन्फ़िगरेशन को पुनः लोड करने के लिए log4j PropertyConfigurator का उपयोग करें।


2
यह उन कुछ उदाहरणों में से एक है जो orgपारंपरिक लॉग से डिफ़ॉल्ट रूप से लॉग करने वाले सभी लॉग को क्लोब नहीं करता है ।
गहरीकरण

1
यह बहुत अच्छी तरह से काम करता है, लेकिन Log4j.propertiesफाइल किस लिए है? इसका उपयोग नहीं लगता है। क्या आप बस XML फ़ाइल में सेट की गई संपत्तियों का दस्तावेजीकरण कर रहे हैं?
vy32

1
आप दोनों में से किसी का भी उपयोग कर सकते हैं।
राहुल शर्मा

3
मुझे उपरोक्त के साथ सफलता मिली है - मैं --filesसभी नोड्स पर log4j.properties उपलब्ध कराने के लिए स्पार्क-सबमिट कमांड में उपयोग करता हूं ।
बेन वॉटसन

1
यह एकमात्र समाधान है जिसने मेरे लिए काम किया और इसमें कोई कोड परिवर्तन शामिल नहीं है। किसी फ़ाइल Log4.propertiesको main/resourcesउस स्थिति में बनाएं जिसमें वह मौजूद नहीं है
येइकेल

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)

आप log4jएपीआई का उपयोग करके बहुत कुछ हासिल कर सकते हैं ।
स्रोत: [ Log4J कॉन्फ़िगरेशन डॉक्स , कॉन्फ़िगरेशन अनुभाग]


# 2 के log4j.propertiesदौरान पासspark-submit

यह एक बहुत मुश्किल है, लेकिन असंभव नहीं है। और मेरे पसंदीदा।

ऐप स्टार्टअप के दौरान लॉग 4 जे हमेशा की तलाश और लोड होता है log4j.properties क्लासपाथ से फ़ाइल ।

हालांकि, जब spark-submitस्पार्क कलस्टर के क्लासपाथ का उपयोग किया जाता है, तो ऐप की क्लासपाथ पर पूर्वता है! यही कारण है कि इस फ़ाइल को अपने वसा-जार में डालने से क्लस्टर की सेटिंग ओवरराइड नहीं होगी!

जोड़े -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मोड का उपयोग करना चाहिए स्पार्क डॉक्स, रनटाइम एन.वी.

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रूट dir पर उपलब्ध होंगी, इसलिए इसमें कोई पथ जोड़ने की आवश्यकता नहीं है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 - आपको नीचे जोड़ना चाहिए, यदि आप मेरी तरह हैं और पाते हैं कि ऊपर दिए गए उत्तरों से मदद नहीं मिली है, तो शायद आपको भी अपनी log4j conf फ़ाइल से '.template' प्रत्यय को निकालना होगा और फिर उपरोक्त पूरी तरह से काम करेगा!
शाम

1
प्रोग्रामेटिक एप्रोच पर अतिरिक्त ध्यान दें- स्पार्ककॉन्टेक्ट बनने से पहले लेवल सेट करना होगा
नायर

@ArunrajNair ऐसा नहीं होना चाहिए, क्योंकि लॉगिंग एक अलग विशेषता है, जो स्पार्ककॉन्टेक्ट से जुड़ी नहीं है।
आठ

19

आप लॉग को इसके स्तर को निम्नानुसार सेट करके अक्षम करें:

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

या लॉग फ़ाइल को संपादित करें और लॉग लेवल को केवल निम्न प्रॉपर्टी को बदलकर बंद करें:

log4j.rootCategory=OFF, console

मैं किस फ़ाइल में उपरोक्त गुण सेट करता हूँ ??
विस्वास

आप अपने ड्राइवर प्रोग्राम @Vishwas
Sachin Janani

मैंने एक ही जोड़ा है, लेकिन अभी भी लॉग कंसोल पर दिखाई देता है
Vishwas

क्या आपने संपत्ति log4j.rootCategory = OFF को बदल दिया है। मैंने अपने अंत और इसके ठीक काम पर इनका परीक्षण किया है
सचिन जननी

3
यह स्पार्क 2.3.1 पर मेरे लिए शून्य अंतर बनाता है
टॉबी एगिट

15

मैं सिर्फ आयात विवरणों के नीचे शीर्ष पर अपने सभी pyspark लिपियों में इस पंक्ति को जोड़ता हूं।

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

उदाहरण मेरे pyspark स्क्रिप्ट के हेडर

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

13
यह काम करता है, लेकिन यह INFO संदेशों की 58 लाइनों को नहीं रोकता है जो स्पार्क संदर्भ के निर्माण के दौरान दिखाई देते हैं।
vy32

1
ध्यान दें कि यह स्पार्क 2.x
येइकेल

13

ऊपर दिए गए उत्तर सही हैं, लेकिन मुझे बिल्कुल मदद नहीं मिली क्योंकि मुझे अतिरिक्त जानकारी की आवश्यकता थी।

मेरे पास अभी स्पार्क सेटअप है इसलिए log4j फ़ाइल में अभी भी '.template' प्रत्यय था और पढ़ा नहीं जा रहा था। मेरा मानना ​​है कि लॉगिंग तब स्पार्क कोर लॉगिंग कॉन्फ को डिफॉल्ट करता है।

इसलिए यदि आप मेरे जैसे हैं और पाते हैं कि ऊपर दिए गए उत्तर मदद नहीं करते हैं, तो हो सकता है कि आपको भी अपने log4j conf फ़ाइल से '.template' प्रत्यय को निकालना पड़े और फिर उपरोक्त पूरी तरह से काम करे!

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


कृपया इस उत्तर की जाँच करें, stackoverflow.com/a/51554118/2094086 आशा है कि आप वही देख रहे हैं।
गौरव अदकर

5

पायथन / स्पार्क में हम कर सकते हैं:

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' को परिभाषित करने के बाद इस फ़ंक्शन को कॉल करें: शांत_लॉग्स (sc)


मैं एक प्रोग्रामेटिक तरीका खोजना पसंद करूंगा जो log4j फ़ाइल के साथ खिलवाड़ किए बिना काम करता है - लेकिन जब मैं कोशिश करता हूं कि, मुझे अभी भी चेतावनी मिलती है जैसे कि WARN org.apache.spark.scheduler.TaskSetManager: चरण 0.06 में कार्य खो दिया (TID 2570) ..., निष्पादक 15): टास्क किल्ड (एक और अटैचमेंट
MrCartoonology

5

tl; डॉ

स्पार्क संदर्भ के लिए आप उपयोग कर सकते हैं:

sc.setLogLevel(<logLevel>)

जहां loglevelसभी, DEBUG, ERROR, FATAL, INFO, OFF, TRACE या WARN हो सकते हैं।


विवरण-

आंतरिक रूप से, setLogLevelकॉल करता है org.apache.log4j.Level.toLevel(logLevel)कि यह तब सेट का उपयोग करता है org.apache.log4j.LogManager.getRootLogger().setLevel(level)

आप सीधे लॉगिंग स्तरों का OFFउपयोग करके सेट कर सकते हैं :

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

आप स्पार्क शेल के लिए डिफ़ॉल्ट लॉगिंग सेट कर सकते हैं conf/log4j.propertiesconf/log4j.properties.templateशुरुआती बिंदु के रूप में उपयोग करें ।

स्पार्क अनुप्रयोगों में लॉग स्तर सेट करना

स्टैंडअलोन स्पार्क अनुप्रयोगों में या स्पार्क शैल सत्र में, निम्नलिखित का उपयोग करें:

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

स्पार्क 2-स्पार्क का उपयोग स्पार्क 2 के लिए किया जाता है।
नेफिलीम

3

बस अपने स्पार्क-शेल या स्पार्क-सबमिट कमांड के नीचे परम जोड़ें

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

लॉग 4j.properties फ़ाइल से सटीक संपत्ति नाम (log4jspark.root.logger यहाँ) की जाँच करें। आशा है कि यह मदद करता है, चीयर्स!


1
आदेश-पंक्ति से इसे सेट करने के लिए भयानक होगा। लेकिन यह मेरे लिए काम नहीं किया।
स्वदेव

2

एक दिलचस्प विचार यह है कि यहां सुझाए गए के रूप में रॉलिंगएपेंडर का उपयोग करना है: http://shzhangji.com/blog/2015/05/31/spark-streaming-log-configuration/ ताकि आप कंसोल स्पेस को "पॉलेट" न करें, लेकिन अभी भी $ your_LOG_PATH_HERE / $ {dm.log.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. अन्य log4j.rootCategory = ERROR, कंसोल द्वारा वर्णित मान / log4j.properties समायोजित करें
  2. अपनी स्पार्क जॉब को अंजाम देते समय सुनिश्चित करें कि आप लॉग -4j.properties फ़ाइल पथ के साथ फ़ील करें
  3. यदि यह अभी भी काम नहीं करता है तो आपके पास एक जार हो सकता है जिसमें log4j.properties है जो आपके नए log4j.properties से पहले बुलाया जा रहा है। जार से उस log4j.properties को निकालें (यदि उपयुक्त हो)

0
sparkContext.setLogLevel("OFF")

1
मैंने दोनों को किया। log4j.properties से .template प्रत्यय को हटा दिया और ERROR के स्तर को निर्धारित किया, और val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR) यह काम किया
सैम-टी

0

उपरोक्त सभी पदों के अलावा, यहां मेरे लिए समस्या का समाधान है।

लकड़हारा लकड़ियों को बांधने के लिए slf4j का उपयोग करता है। यदि log4j पहली बाइंडिंग नहीं है, तो आप log4j.properties फ़ाइलें जो आप चाहते हैं, उन्हें संपादित कर सकते हैं, लॉगर भी उपयोग नहीं किए जाते हैं। उदाहरण के लिए, यह एक संभावित SLF4J आउटपुट हो सकता है:

SLF4J: क्लास पथ में कई SLF4J बाइंडिंग शामिल हैं। SLF4J: [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-spleple-1.6.6.jar !/ org / slf4j / / में बाध्यकारी पाया गया। impl / StaticLoggerBinder.class] SLF4J: [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j/logsjj12/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

यह एक मेरे लिए काम किया। केवल ERROR संदेशों के रूप में प्रदर्शित होने के लिए 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 है

एक परिशिष्ट जो लॉग इवेंट्स को अनदेखा करता है। ( https://log.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/log/log4j/core/appender/NullAppender.html )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.