在 Spark StandAlone 上使用 Logback 进行日志记录

问题描述 投票:0回答:3

我们正在使用

Spark StandAlone 2.3.2 and logback-core/logback-classic with 1.2.3

有非常简单的 Logback 配置文件,它允许我们将数据记录到特定目录,并且在本地我可以从编辑器传递虚拟机参数

-Dlogback.configurationFile="C:\path\logback-local.xml"

它可以正常工作并正确记录

在 Spark StandAlone 上,我尝试使用 external link

传递参数
spark-submit
  --master spark://127.0.0.1:7077
  --driver-java-options "-Dlog4j.configuration=file:/path/logback.xml"
  --conf "spark.executor.extraJavaOptions=-Dlogback.configurationFile=file:/path/logback.xml"

这里是配置文件(位 ansibilized),已验证实际路径并且它们存在,知道集群上可能存在什么问题。我已经验证了 Spark UI 上的环境变量,它们反映了相同的 drvier 和执行器选项。

Logback 和 Spark StandAlone 一起使用有任何潜在问题吗?

这里没有任何特定于配置文件的内容,它只是过滤 json 日志记录与文件的数据,以便在日志服务器上更好地可视化

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>{{ app_log_file_path }}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--daily-->
            <fileNamePattern>{{ app_log_dir }}/{{ app_name }}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>90</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d [%thread] %-5level %logger{36} %X{user} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="FILE_JSON" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator>
                <expression>
                    return message.contains("timeStamp") &amp;&amp;
                    message.contains("logLevel") &amp;&amp;
                    message.contains("sourceLocation") &amp;&amp;
                    message.contains("exception");
                </expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>NEUTRAL</OnMatch>
        </filter>
        <file>{{ app_json_log_file_path }}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--daily-->
            <fileNamePattern>{{ app_log_dir }}/{{ app_name }}_json.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>90</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    <logger name="com.baml.ctrltech.greensheet.logging.GSJsonLogging" level="info" additivity="false">
        <appender-ref ref="FILE_JSON" />
    </logger>
    <root level="INFO">
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE_JSON"/>
    </root>
</configuration>
java scala apache-spark logback apache-spark-standalone
3个回答
1
投票

我们无法让 Logback 与 Spark 一起使用,因为 Spark 内部使用 Log4J,我们必须切换到相同的


1
投票

我修复了为 logback 添加一个依赖项并排除 sbt 中 Spark 的传递依赖项:

val sparkV = "3.3.1"
val slf4jLogbackV = "2.1.4"

val slf4jLogback = "com.networknt" % "slf4j-logback" % slf4jLogbackV
val sparkSql = ("org.apache.spark" %% "spark-sql" % sparkV)
  .cross(CrossVersion.for3Use2_13)
  .exclude("org.apache.logging.log4j", "log4j-slf4j-impl")

0
投票

我们在Spark 3.2.0中使用Logback。备注:

  1. 添加 logback-core 和 logback-classic 依赖项
  2. 从构建中的 org.apache.spark 依赖项中排除所有 log4j 和 slf4j-logj12
  3. 在驱动程序和执行程序 extraJavaOptions 上使用 -Dlogback.configurationFile (不是示例中的 -Dlog4j.configuration )
© www.soinside.com 2019 - 2024. All rights reserved.