<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
val logger: Logger = LoggerFactory.getLogger(this.getClass)
val sc: SparkContext = new SparkContext()
val rdd = sc.textFile("myFile.txt")
val slb: StaticLoggerBinder = StaticLoggerBinder.getSingleton
System.out.println("Logger Instance: " + slb.getLoggerFactory)
System.out.println("Logger Class Type: " + slb.getLoggerFactoryClassStr)
Logger Instance: org.slf4j.impl.Log4jLoggerFactory@a64e035
Logger Class Type: org.slf4j.impl.Log4jLoggerFactory
我知道log4j-1.2.17.jar
和slf4j-log4j12-1.7.16.jar
都在/usr/local/Spark/jars中,尽管在pom.xml中排除了这些jar,但Spark很可能引用了这些jar,因为如果删除它们,在spark-submit的运行时会给出一个ClassNotFoundException。
我的问题是:有没有一种方法可以在我的应用程序中使用Logback实现本机日志记录,同时保留Spark的内部日志记录功能。理想情况下,我希望将我的日志返回应用程序日志写到一个文件中,并允许Spark日志仍然在stdout中显示。
我也遇到过类似的问题。
我们的构建与您的类似(但是我们使用了sbt
),详细描述如下:https://stackoverflow.com/a/45479379/1549135
在本地运行这个解决方案很好,但是spark-submit
将忽略所有排除和新的日志框架(logback
),因为Spark的类路径优先于部署的JAR。因为它包含log4j1.2.xx
,所以它只需加载它并忽略我们的设置。
extraclasspath
额外的类路径条目,以预置到执行器的类路径。它的存在主要是为了向后兼容较旧版本的Spark。用户通常不需要设置此选项。
这里没有写的是extraclasspath
优先于默认Spark的类路径!
- log4j-over-slf4j-1.7.25.jar
- logback-classic-1.2.3.jar
- logback-core-1.2.3.jar
libs="/absolute/path/to/libs/*"
spark-submit \
...
--master yarn \
--conf "spark.driver.extraClassPath=$libs" \
--conf "spark.executor.extraClassPath=$libs" \
...
/my/application/application-fat.jar \
param1 param2
但简单地设置:
--conf "spark.driver.userClassPathFirst=true" \
--conf "spark.executor.userClassPathFirst=true" \
对我不起作用。所以我很乐意使用extraclasspath
!
干杯!
问题内容: 我必须在应用程序中添加一个面板,该面板将记录该应用程序的错误。我创建了一个扩展AppenderBase的类,并配置了xml文件以使用此类。 因此,当我在应用程序中登录时,会调用他的appender。 但是目前我还不知道如何将我的appender链接到面板。 你能指导我吗? 问题答案: 为此,您必须编写自定义,有关此信息,请参见:logback.qos.ch/manual/appende
我使用的是JBOSS-7.0,并且希望基于War文件来分离应用程序日志,即我有war1和war2,因此应该基于war1.log和war2.log这样的独立日志文件来生成。现有的日志记录配置是standalone.xml。我读过Jboss给出的这个链接,但是他们给出的配置是在jboss-log4j.xml文件中,而不是standalone.xml日志模块更改。 有人能建议在JBOSS-7.0中为每个
在我的weblogic服务器中,我有两个独立的应用程序。App1是旧的Web应用程序,使用log4j提供Web服务: 当只部署了这个应用程序时,一切正常。 第二个app2是使用logback的web服务应用程序的Spring启动: 当我将第二个应用程序部署到weblogic服务器时,两个应用程序都登录到了app2。日志我真的很困惑,为什么会发生这种事,又是如何发生的
我试图建立一个应用程序,使用log4j使日志文件。日志文件的位置通过log4j.properties文件提供。 到目前为止,它运行良好,但我想将spark日志与我从代码生成的日志分开。或者至少在日志文件中打印我的日志消息。 有办法吗? log4j.properties
那么,这种架构的瓶颈在哪里?也许推送每条带有互斥体的消息是个坏主意?
嗯,这个例子看起来很不完整,因为它从来没有提到关键字。通过查看源代码,我看到了一个示例(测试?)它在log4j.xml中使用了,但对如何使用或调试实际的记录器没有太多解释。 关于如何实际使用/实现ApplicationInsightsAppender for Log4J,有没有人有任何指示? 以下是github https://github.com/microsoft/applicationins