我想停止发送火花弹上的各种信息。
我尝试编辑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
如何阻止这些?
答案 0 :(得分:142)
修改您的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
答案 1 :(得分:116)
在启动spark-shell
类型后立即;
sc.setLogLevel("ERROR")
在Spark 2.0中:
spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
答案 2 :(得分:45)
感谢@AkhlD和@Sachin Janani建议对class cPoint {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
class cLine {
p1: cPoint;
p2: cPoint;
constructor(p1: cPoint, p2: cPoint) {
this.p1 = p1;
this.p2 = p2;
}
}
class cElement extends Particle {
color: string = "white";
width: number;
height: number;
constructor(x: number, y: number, w: number, h: number, color?) {
super(x, y);
if (typeof color !== 'undefined') this.color = color;
this.width = w;
this.height = h;
}
get lowestX() {
if (this.position.X < this.position.X + this.width) return this.position.X;
return this.position.X + this.width
}
get highestX() {
if (this.position.X > this.position.X + this.width) return this.position.X;
return this.position.X + this.width
}
get lowestY() {
if (this.position.Y < this.position.Y + this.height) return this.position.Y;
return this.position.Y + this.height
}
get highestY() {
if (this.position.Y > this.position.Y + this.height) return this.position.Y;
return this.position.Y + this.height
}
get pointA(): cPoint { return new cPoint(this.lowestX, this.lowestY); } //Upper left corner.
get pointB(): cPoint { return new cPoint(this.highestX, this.lowestY); } //Upper right corner.
get pointC(): cPoint { return new cPoint(this.highestX, this.highestY); } //Lower right corner.
get pointD(): cPoint { return new cPoint(this.lowestX, this.highestY); } //Lower left corner.
get lineAB(): cLine { return new cLine(this.pointA, this.pointB); }
get lineBC(): cLine { return new cLine(this.pointB, this.pointC); }
get lineCD(): cLine { return new cLine(this.pointC, this.pointD); }
get lineDA(): cLine { return new cLine(this.pointD, this.pointA); }
get sides(): cLine[] { return [this.lineAB, this.lineBC, this.lineCD, this.lineDA]; } // An array with the 4 sides of the element.
get lineAdA(): cLine { return new cLine(this.pointA, new cPoint(this.pointA.x + this.velocity.X, this.pointA.y + this.velocity.Y)); }
get lineBdB(): cLine { return new cLine(this.pointB, new cPoint(this.pointB.x + this.velocity.X, this.pointB.y + this.velocity.Y)); }
get lineCdC(): cLine { return new cLine(this.pointC, new cPoint(this.pointC.x + this.velocity.X, this.pointC.y + this.velocity.Y)); }
get lineDdD(): cLine { return new cLine(this.pointD, new cPoint(this.pointD.x + this.velocity.X, this.pointD.y + this.velocity.Y)); }
}
文件进行更改。
以下代码解决了我的问题:
1)在导入部分
中添加了.conf
2)在创建spark上下文对象后添加以下行,即在import org.apache.log4j.{Level, Logger}
之后:
val sc = new SparkContext(conf)
答案 3 :(得分:26)
使用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>
如果要将日志写入文件而不是控制台,请在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>
这里要理解的另一个重要事项是,当作业以分布式模式启动时(部署模式集群和master作为yarn或mesos),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重新加载配置。
答案 4 :(得分:18)
您可以通过将其级别设置为OFF来设置禁用日志,如下所示:
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
或编辑日志文件,只需更改以下属性即可将日志级别设置为off:
log4j.rootCategory=OFF, console
答案 5 :(得分:12)
我只是将这一行添加到导入语句下面的所有pyspark脚本中。
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
我的pyspark脚本的示例标题
from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
答案 6 :(得分:10)
上面的答案是正确的,但并没有完全帮助我,因为我需要其他信息。
我刚刚设置了Spark,因此log4j文件仍然具有'.template'后缀并且未被读取。我相信日志记录默认为Spark核心日志记录。
所以如果你像我一样发现上面的答案没有帮助,那么也许你也必须从你的log4j conf文件中删除'.template'后缀,然后上面的工作完美无缺!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
答案 7 :(得分:5)
对于Spark Context,您可以使用:
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的默认日志记录。使用conf/log4j.properties.template
作为起点。
在独立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)
在conf/log4j.properties
中使用以下内容完全禁用日志记录:
log4j.logger.org=OFF
参考:Jacek Laskowski掌握Spark。
答案 8 :(得分:4)
在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)
答案 9 :(得分:2)
一个有趣的想法是按照此处的建议使用RollingAppender:http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ 这样你就不会“开始”#34;控制台空间,但仍然能够在$ 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
解决问题的另一种方法是观察您通常具有哪种记录(来自不同的模块和依赖项),并为每个记录的粒度设置,同时转动&#34; quiet&#34;第三方日志过于冗长:
例如,
# 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
答案 10 :(得分:2)
只需将以下参数添加到您的spark-shell或spark-submit命令中
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
从log4j.properties文件中检查确切的属性名称(此处为log4jspark.root.logger)。 希望这会有所帮助,加油!
答案 11 :(得分:2)
实际上,有很多方法可以做到。 有些难于其他,但最适合您的取决于您。我将尽力展示它们。
似乎是最简单的方法,但是您将需要重新编译您的应用程序才能更改这些设置。就个人而言,我不喜欢它,但是效果很好。
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
API即可取得更多成就。
来源:[Log4J Configuration Docs,“配置”部分]
log4j.properties
期间通过spark-submit
这很棘手,但并非不可能。和我的最爱。
在应用启动过程中,Log4J始终从类路径中寻找并加载log4j.properties
文件。
但是,在使用spark-submit
时,Spark Cluster的类路径优先于应用程序的类路径!这就是为什么将此文件放在胖子罐中不会覆盖群集设置的原因!
将
-Dlog4j.configuration=<location of configuration file>
添加到spark.driver.extraJavaOptions
(对于驾驶员)或
spark.executor.extraJavaOptions
(用于执行人)。请注意,如果使用 文件,应明确提供
file:
协议,和文件 需要在所有节点上本地存在。
要满足最后一个条件,您可以将文件上传到节点可用的位置(例如hdfs
),也可以使用驱动程序在本地使用deploy-mode client
来访问文件。否则:
使用spark-submit上传自定义
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 docs, Runtime env
在客户端模式下执行spark-submit
:
spark-submit \
--master yarn \
--deploy-mode cluster \
--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"
spark-cluster
上传到--files
的文件将在根目录下可用,因此无需在file:log4j.properties
中添加任何路径。 --files
中列出的文件必须提供绝对路径!file:
前缀是必需的。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的示例为例),您的所有应用程序都将共享此配置。
如果您喜欢解决方案3,但想针对每个应用程序对其进行自定义,则可以实际复制conf
文件夹,编辑其内容并在spark-submit
中指定为根配置。
要指定默认
“SPARK_HOME/conf”
以外的其他配置目录,可以设置SPARK_CONF_DIR
。 Spark将使用此目录中的配置文件(spark-defaults.conf
,spark-env.sh
,log4j.properties
,等)。
conf
文件夹(更多信息,方法#3)log4j.properties
(方法2中的示例)在执行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操作!
尽情享受吧!
答案 12 :(得分:1)
在命令行上很简单......
spark2-submit --driver-java-options="-Droot.logger=ERROR,console"
..其他选项..
答案 13 :(得分:0)
sparkContext.setLogLevel("OFF")
答案 14 :(得分:0)
答案 15 :(得分: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-simple软件包<dependency>
...
<exclusions>
...
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
解决了这个问题,因为现在使用了log4j logger绑定并且遵守了log4j.properties中的任何设置。 F.Y.I.我的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
希望这有帮助!
答案 16 :(得分: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
,然后继续进行操作来创建它以上所述的更改。
答案 17 :(得分:0)
如果您没有能力编辑Java代码来插入.setLogLevel()
语句,并且又不想部署更多外部文件,则可以使用蛮力解决的方法。只需使用grep过滤掉INFO行。
spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
答案 18 :(得分: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
答案 19 :(得分: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)
答案 20 :(得分:0)
在PySpark中添加以下内容为我完成了工作:
self.spark.sparkContext.setLogLevel("ERROR")
self.spark是启动会话(self.spark = spark_builder.getOrCreate()
)