如何清理EC2/Ubuntu服务器上Apache Storm的workers-artifacts和storm-logs
Apache Storm workers-artifacts 日志自动清理方案
1. 日志轮转删除范围说明
你配置的log4j2规则仅会删除当前运行的对应topology的日志,不会删除整个artifact仓库:
- 你在A1 appender的Delete规则中配置的basePath是
${sys:workers.artifacts}/${sys:storm.id},其中storm.id是每个topology启动时生成的唯一标识,规则仅作用于该topology对应的目录 - 已停止运行的topology对应的目录不会被log4j2规则处理,因为对应的worker进程已经退出,不会触发日志轮转动作
2. 当前worker.xml未生效的原因排查
你的配置存在三个常见的未生效原因:
- 删除规则逻辑限制:只有同时满足「文件最后修改时间超过3天」+「该目录下总文件大小超过5G/总文件数超过15个」两个条件时,才会触发删除,阈值过高可能导致长期没有文件被清理
- 规则覆盖不全:Delete规则仅配置在A1 appender下,STDOUT、STDERR、METRICS三个输出的日志仅配置了最多保留4/9个滚动文件,没有按时间清理的规则
- 触发时机限制:Delete规则仅在日志触发轮转(每小时整点/文件大小达到100MB)时才会执行,如果日志产生速度慢,长期没有触发轮转就不会执行清理
3. cron+bash脚本清理方案可行性
该方案是目前最稳妥的兜底清理方案,不受topology运行状态、log4j2配置限制,可实现全量旧数据清理,参考实现如下:
#!/bin/bash # 日志根目录,替换为你实际的存储路径 LOG_DIR="/path/to/storm-logs/workers-artifacts" # 通用保留天数 RETENTION_DAY=7 # 第一步:清理超过保留天数的所有日志文件 find ${LOG_DIR} -type f -mtime +${RETENTION_DAY} -delete # 可选步骤:清理已经停止的topology的整个目录 RUNNING_TOPO_IDS=$(storm list | grep -v "Topology name" | awk '{print $2}') for dir in ${LOG_DIR}/*/; do topo_id=$(basename ${dir}) if ! echo "${RUNNING_TOPO_IDS}" | grep -q "${topo_id}"; then rm -rf ${dir} fi done
将上述脚本保存为/opt/scripts/storm-log-clean.sh,添加可执行权限后配置cron定时执行:
# 编辑crontab,添加以下规则,每天凌晨2点执行清理 0 2 * * * /bin/bash /opt/scripts/storm-log-clean.sh >> /var/log/storm-log-clean.log 2>&1
4. topology层级的日志清理实现
可通过两种方式实现topology粒度的自定义清理:
- 自定义日志配置提交:每个topology提交时,携带单独定制的
worker.xml配置,通过storm jar命令的--conf "log4j.configurationFile=./custom-worker.xml"参数指定,可针对不同topology设置不同的保留时长、大小阈值 - 脚本按topology匹配清理:在上述bash脚本中,通过
storm list获取运行中topology的名称和id的对应关系,针对不同名称的topology设置不同的保留天数,单独执行清理规则
推荐组合方案
建议将两种方案配合使用:
- log4j2配置负责运行中topology的实时日志轮转,控制单topology的日志占用上限
- cron脚本作为兜底,定期清理已停止topology的目录、以及log4j2规则漏处理的旧日志
内容的提问来源于stack exchange,提问作者Aditya Raman
相关产品推荐
相关产品推荐

