如何停止在spark控制台上显示信息消息?

but5z9lq  于 2021-05-27  发布在  Spark
关注(0)|答案(17)|浏览(599)

我想阻止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

我该怎么阻止这些?
thtygnil

thtygnil1#

以上答案是正确的,但并没有完全帮助我,因为有额外的资料,我需要。
我刚刚设置了spark,所以log4j文件仍然有“.template”后缀,并且没有被读取。我认为日志记录默认为spark core logging conf。
所以,如果你和我一样,发现上面的答案没有帮助,那么也许你也必须从log4j conf文件中删除“.template”后缀,然后上面的工作就完美了!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html

v8wbuo2f

v8wbuo2f2#

简单的命令行操作。。。 spark2-submit --driver-java-options="-Droot.logger=ERROR,console" …其他选择。。

jmp7cifd

jmp7cifd3#

sparkContext.setLogLevel("OFF")
sdnqo3pr

sdnqo3pr4#

一个有趣的想法是使用rollingappender,如下所示:http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ 因此,您不必“polute”控制台空间,但仍然可以在$your\u log\u path\u 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
qoefvg9y

qoefvg9y5#

感谢@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)
ryhaxcpt

ryhaxcpt6#

除了以上所有的帖子,这里是什么解决了我的问题。
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简单包

<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

希望这有帮助!

de90aj5v

de90aj5v7#

您可以通过将其级别设置为“关”来禁用日志,如下所示:

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

或编辑日志文件,只需更改以下属性即可将日志级别设置为关闭:

log4j.rootCategory=OFF, console
hsgswve4

hsgswve48#

所有的方法都收集了示例

简介

实际上,有很多方法可以做到。有些人比其他人更难,但你自己决定哪一个最适合你。我会尽力把它们全部展示出来。

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配置文档,配置部分]

在spark submit期间通过log4j.properties

这是非常棘手的,但不是不可能的。我最喜欢的。
log4j在应用程序启动期间总是在寻找和加载 log4j.properties 类路径中的文件。
但是,在使用 spark-submit spark cluster的类路径优先于应用程序的类路径!这就是为什么把这个文件放到fat jar中不会覆盖集群的设置!
添加 -Dlog4j.configuration=<location of configuration file>spark.driver.extraJavaOptions (为司机)或 spark.executor.extraJavaOptions (对于遗嘱执行人)。
请注意,如果使用文件 file: 应该显式地提供协议,并且文件需要在所有节点上本地存在。
要满足最后一个条件,可以将文件上载到节点可用的位置(如 hdfs )或者,如果使用 deploy-mode client . 否则:
上载自定义 log4j.properties 使用spark submit,将其添加到 --files 与应用程序一起上载的文件列表。
来源:spark docs,调试

步骤:

例子 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文档,运行时环境
执行 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"

注意事项:

文件上载到 spark-cluster--files 将在根目录下可用,因此不需要在中添加任何路径 file:log4j.properties .
中列出的文件 --files 必须提供绝对路径! file: 配置uri中的前缀是必需的。

3编辑集群的conf/log4j.properties

这将更改全局日志配置文件。
更新 $SPARK_CONF_DIR/log4j.properties 文件,它将与其他配置一起自动上载。
来源:spark docs,调试
找到你的 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将使用配置文件( spark-defaults.conf , spark-env.sh , log4j.properties ,等等)。
来源:spark docs,配置

步骤:

复制群集的 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我的评论!
祝你旅途愉快!

y0u0uwnf

y0u0uwnf9#

热释光;博士

对于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)

您可以在中为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

参考资料:掌握Spark由雅切克拉斯科夫斯基。

cx6n0qe3

cx6n0qe310#

使用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.属性:

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(没有这样的文件或目录)
关于解决这个问题的提示-
在分布式文件系统(hdfs或mesos)中保留log4j配置文件,并使用log4j属性配置器添加外部配置。或者使用sparkcontext addfile使其在每个节点上可用,然后使用log4j propertyconfigurator重新加载配置。

kkbh8khc

kkbh8khc11#

只需将下面的param添加到spark shell或spark submit命令中

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

检查log4j.properties文件中的确切属性名(此处为log4jspark.root.logger)。希望这有帮助,干杯!

d4so4syb

d4so4syb12#

在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\u logs(sc)

kse8i1jr

kse8i1jr13#

调整conf/log4j.properties,如other log4j.rootcategory=error,console所述
确保在执行spark作业时传递--file标志和log4j.properties文件路径
如果它仍然不起作用,您可能会有一个jar,其中包含在新log4j.properties之前被调用的log4j.properties。从jar中删除log4j.properties(如果合适)

dxpyg8gm

dxpyg8gm14#

编辑您的 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 有关每种方法的详细信息可以在文档中找到。

yptwkmov

yptwkmov15#

这个对我有用。只显示错误消息 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

相关问题