当前位置: 首页 > 知识库问答 >
问题:

从log4j中分离Logback中的应用程序日志和Spark日志

戚鸿
2023-03-14
        <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.jarslf4j-log4j12-1.7.16.jar都在/usr/local/Spark/jars中,尽管在pom.xml中排除了这些jar,但Spark很可能引用了这些jar,因为如果删除它们,在spark-submit的运行时会给出一个ClassNotFoundException。

我的问题是:有没有一种方法可以在我的应用程序中使用Logback实现本机日志记录,同时保留Spark的内部日志记录功能。理想情况下,我希望将我的日志返回应用程序日志写到一个文件中,并允许Spark日志仍然在stdout中显示。

共有1个答案

邓高韵
2023-03-14

我也遇到过类似的问题。

我们的构建与您的类似(但是我们使用了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