You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark Streaming独立模式下Executor日志滚动与归档方案咨询

解决Spark Streaming独立模式下日志按天滚动并自动清理的问题

Got it, let's fix this log bloat issue for your long-running standalone Spark Streaming job. You’re already on the right path switching from stderr to a Log4j file appender—now let’s tweak the config to get daily log rolling and auto-cleanup after 7 days.

针对Log4j 1.x(大部分Spark旧版本默认)

If your Spark cluster uses Log4j 1.x, you’ll want to use the org.apache.log4j.rolling.RollingFileAppender (from the log4j-extras library, which Spark usually includes by default). This appender supports time-based rolling and automatic old log deletion, which is exactly what you need.

Update your log4j.properties with this configuration:

# 设置根日志级别并绑定按天滚动的appender
log4j.rootLogger=INFO, DailyRollingErrAppender

# 配置按天滚动的appender
log4j.appender.DailyRollingErrAppender=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.DailyRollingErrAppender.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
# 定义带日期后缀的日志文件格式
log4j.appender.DailyRollingErrAppender.RollingPolicy.FileNamePattern=${spark.home}/work/app_%d{yyyy-MM-dd}.stderr.log
# 仅保留最近7天的日志,旧日志自动删除
log4j.appender.DailyRollingErrAppender.RollingPolicy.MaxHistory=7

# 设置日志输出格式(可按需调整)
log4j.appender.DailyRollingErrAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.DailyRollingErrAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# 关闭默认的stderr控制台输出,避免日志重复写入
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.Target=System.err
log4j.rootLogger.stderr=OFF

关键配置说明:

  • TimeBasedRollingPolicy:每天触发一次日志滚动,生成带日期后缀的文件(例如app_2024-05-20.stderr.log)。
  • MaxHistory=7:自动清理7天前的日志文件,无需额外编写清理脚本。
  • 关闭默认的stderr appender:阻止日志继续写入原$SPARK_HOME/work下的stderr文件,确保所有日志都流向滚动文件。

针对Log4j 2.x(Spark 3.x+环境)

如果你的Spark版本使用Log4j 2,配置会更简洁,利用内置的时间触发滚动机制:

<!-- log4j2.xml 示例配置 -->
<Configuration status="WARN">
  <Appenders>
    <RollingFile name="DailyRollingErrAppender" 
                 fileName="${spark:home}/work/app.stderr.log"
                 filePattern="${spark:home}/work/app_%d{yyyy-MM-dd}.stderr.log">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
      <Policies>
        <!-- 每天生成一个新日志文件 -->
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
      </Policies>
      <!-- 仅保留7天的历史日志 -->
      <DefaultRolloverStrategy max="7"/>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="INFO">
      <AppenderRef ref="DailyRollingErrAppender"/>
    </Root>
    <!-- 关闭默认的stderr输出 -->
    <Logger name="org.apache.spark" level="INFO">
      <AppenderRef ref="DailyRollingErrAppender"/>
    </Logger>
  </Loggers>
</Configuration>

验证配置有效性的小技巧:

  1. 修改配置后重启Spark Streaming作业。
  2. 查看$SPARK_HOME/work目录,确认生成带当日日期后缀的日志文件。
  3. 可手动创建几个带过去日期的日志文件,测试7天期限到后是否会被自动删除。
  4. 确保Spark Executor进程对$SPARK_HOME/work目录有写入权限。

内容的提问来源于stack exchange,提问作者Reza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:16:11