如何停止火花控制台上显示的消息?
我想停止火花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
我如何阻止这些?
编辑您的conf/log4j.properties
文件并更改以下行:
log4j.rootCategory=INFO, console
至
log4j.rootCategory=ERROR, console
另一种方法是:
启动火花shell并input以下内容:
import org.apache.log4j.Logger import org.apache.log4j.Level Logger.getLogger("org").setLevel(Level.OFF) Logger.getLogger("akka").setLevel(Level.OFF)
之后你将不会看到任何日志。
Level的其他选项包括: all
, debug
, error
, fatal
, info
, off
, trace
, trace_int
, warn
有关每个细节可以在文档中find。
启动spark-shell
types之后
sc.setLogLevel("ERROR")
在Spark 2.0中:
spark = SparkSession.builder.getOrCreate() spark.sparkContext.setLogLevel("ERROR")
感谢@AkhlD和@Sachin Jananibuild议在.conf
文件中进行修改。
以下代码解决了我的问题:
1)在导入部分添加了import org.apache.log4j.{Level, Logger}
2)在创buildspark上下文对象后添加下面的行,例如val sc = new SparkContext(conf)
:
val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR)
您通过将其级别设置为OFF来设置禁用日志,如下所示:
Logger.getLogger("org").setLevel(Level.OFF); Logger.getLogger("akka").setLevel(Level.OFF);
或编辑日志文件,只需更改以下属性即可将日志级别设置为closures:
log4j.rootCategory=OFF, console
上面的答案是正确的,但没有完全帮助我,因为我需要额外的信息。
我刚刚设置了Spark,所以log4j文件仍然有'.template'后缀,并没有被读取。 我相信,日志logging默认为Spark核心日志loggingconf。
所以,如果你像我一样,发现上面的答案没有帮助,那么也许你也必须从你的log4j conf文件中删除'.template'后缀,然后上面的作品完美!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
在使用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"
Log4j.properties:
log4j.rootLogger=ERROR, console # set the log level for these components log4j.logger.com.test=DEBUG 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> <root> <priority value ="ERROR" /> <appender-ref ref="console" /> </root> </log4j:configuration>
一个有趣的想法是使用RollingAppenderbuild议在这里: 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
解决原因的另一种方法是观察通常有哪些日志logging(来自不同的模块和依赖关系),并为日志logging的每个粒度进行设置,同时将冗长的“安静”第三方日志转变为冗长:
例如,
# 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
在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.rootCategory = ERROR,控制台所述调整conf / log4j.properties
- 确保在执行spark工作的同时传递带有log4j.properties文件path的文件标志
- 如果它仍然不起作用,你可能会有一个jar包,它会在新的log4j.properties之前调用log4j.properties。 从jar中删除log4j.properties(如果适用)
sparkContext.setLogLevel("OFF")
TL;博士
对于Spark上下文,你可以使用:
sc.setLogLevel(<logLevel>)
其中
loglevel
可以是ALL,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.properties
设置Spark shell的默认日志logging。 使用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)
禁用日志logging(在log4j中):
在conf/log4j.properties
使用以下内容来完全禁用日志logging:
log4j.logger.org=OFF
参考:由Jacek Laskowski掌握Spark。