gpt4 book ai didi

java - Spark 的额外记录器位于特定任务的单独文件中

转载 作者:行者123 更新时间:2023-12-03 07:10:14 27 4
gpt4 key购买 nike

我正在使用 Spark 2.4.4,我想使用文件附加器将特定类的日志重定向到特定记录器。

问题是每当我指定 log4j2.properties 时,它似乎会以某种方式覆盖 Spark 根记录器的设置。我不知道后者在哪里配置,我不想与它有任何关系并保留它“原样”。
但我真正想要的是在单独的记录器中记录我自己的方式。

如果可能的话,我仍然想使用属性文件,因为以编程方式执行它是一个样板代码节。

import org.apache.log4j.Logger
import org.apache.logging.log4j.scala.Logging

object StatusHolder {
//@transient lazy val logger = Logger.getLogger(getClass.getName)
@transient lazy val logger = LogManager.getLogger(getClass.getName)

//log stuff

}


最佳答案

经过一些实验和摸索,我成功了

请注意,我喜欢保持最新的库版本,Spark 仍然停留在 Log4j v1
lacks support for Log4J2截至今天(2020 年初),但我以某种方式让它发挥作用。

以下是您需要执行的完整详细步骤

1 - log4j2.properties
代码XML 语法更容易理解,但当您最终掌握它时,属性会更简单。
这也是 Spark 的方法,因此最好在这种情况下坚持下去。

name MySparkLong4JConf

appenders = CA,FA

appender.CA.type = Console
appender.CA.name = CONSOLE
appender.CA.layout.type = PatternLayout
appender.CA.layout.pattern = [%-5level] %d{yy-MM-dd HH:mm:ss} %c{1} - %msg%n

appender.FA.type = File
appender.FA.name = FILE
appender.FA.append = false
appender.FA.fileName = /etc/log/spark-custom-log-${date:yyyyMMdd_HHmmss}.out
appender.FA.layout.type = PatternLayout
appender.FA.layout.pattern = %d{HH:mm:ss} %p %c{1}: %m%n
appender.FA.Threshold = INFO

loggers = StatusLogger

logger.StatusLogger.name = org.apache.spark.StatusLogger <= Your class name
logger.StatusLogger.level = INFO
logger.StatusLogger.additivity=false #<= This is IMPORTANT to decontaminate your Console - as there is a hidden root Loger not defined explicitly here
logger.StatusLogger.appenderRefs = CA, FA
logger.StatusLogger.appenderRef.FA.ref = FILE
logger.StatusLogger.appenderRef.CA.ref = CONSOLE

2 - 您将需要包含以下 Maven 依赖项(适用于 SBT)

    <dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api-scala_2.11</artifactId>
<version>11.0</version>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.0</version>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>

3 - 如果您将代码部署到 Spark(通过 Spark-Shell 或 Spark-Submit),您可能还需要在 jar 中包含对 Shade 插件的引用并包含 log4j

     <artifactSet>
<includes>
<include>org.apache.logging.log4j:*</include>
</includes>
</artifactSet>

4 - 从 Spark 代码调用记录器您可以从代码中的任何位置直接调用此 StatusLogger,因为它是静态的。

import org.apache.log4j.Logger
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.scala.Logging

//The "with Logger" raised a syntax exception probably due to the fact that this is a (static) Scala object and not a class so I had to do without

object StatusLogger {

//if using log4j1 you would need to specify @transient lazy for serde
//@transient lazy val logger = Logger.getLogger(getClass.getName)

//for some reason in Scala "getClass.getName" appends a "$" for this object
//so it screws the class name, I had to pass it manually
val logger = LogManager.getLogger("org.apache.spark.StatusLogger")

def toLogger(m:String) : Unit = {
logger.info(m)
}
}

6 - 请注意,您的默认 Spark 日志将保持原始状态,不会受到此 mod 的影响。该设置只会影响您将以这种方式配置的记录器和附加程序(我实际上想知道为什么该设置没有被覆盖,这是怎么回事(任何人?),但这正是我想要的结果)。

关于java - Spark 的额外记录器位于特定任务的单独文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59552228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com