Ubuntu Kafka 日志管理实用技巧
一 先分清两类日志
- Kafka 数据日志(消息存储):由 Broker 写入磁盘,按主题/分区组织,核心配置集中在 server.properties(如:log.dirs、log.retention.、log.cleanup.policy、log.segment.bytes、log.roll.、log.retention.check.interval.ms)。这类“日志”本质是消息数据,并非文本运行日志。
- 服务运行日志(server.log 等):由 Log4j 输出(常见文件:server.log、controller.log、kafka-authorizer.log、kafka-request.log、log-cleaner.log、state-change.log),路径由 log4j.properties 的 log4j.appender.kafkaAppender.File 等控制,适合用 logrotate 做按日轮转与压缩。
二 数据日志保留与清理策略
- 保留时间:优先使用 log.retention.ms(覆盖 minutes/hours),默认 168 小时(7 天)。
- 保留大小:设置 log.retention.bytes(默认 -1 表示不限制),按“分区总大小”计算,超出阈值后从最老段开始删除。
- 清理策略:
- delete(默认):按时间/大小删除旧段;
- compact:按键保留最新值,适合变更日志/状态存储;
- 可组合为 delete,compact。
- 清理触发:后台任务间隔由 log.retention.check.interval.ms 控制(默认 300000 ms = 5 分钟)。
- 删除细节:过期段先被标记为 .deleted,延迟 file.delete.delay.ms(默认 60000 ms)后由定时任务真正删除。
- 段与滚动:通过 log.segment.bytes(默认 1GB)与 log.roll.{hours,ms}(默认 7 天)控制段切分,便于清理与检索。
三 运行日志轮转与归档(Logrotate)
- 建议将运行日志统一落到 /var/log/kafka/,并为 Kafka 创建 /etc/logrotate.d/kafka:
/var/log/kafka/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 kafka kafka
sharedscripts
postrotate
# 若 Kafka 支持 USR1 触发重新打开日志文件(按实际启动脚本调整)
[ -f /var/run/kafka.pid ] && kill -USR1 $(cat /var/run/kafka.pid) 2>/dev/null || true
endscript
}
- 要点:
- 使用 copytruncate 可避免重启进程(但存在极小概率丢尾);更推荐支持 USR1 的优雅重开。
- 结合 size 与 daily 可防止单日日志过大;保留周期按合规要求设置(如 7 天)。
- 确保目录属主为运行 Kafka 的系统用户(如 kafka:kafka)。
四 监控告警与容量保障
- JMX 直连:在启动前导出 JMX_PORT=9999,结合 JConsole/VisualVM 观察指标(如 BytesIn/BytesOut、RequestHandlerAvgIdlePercent、UnderReplicatedPartitions)。
- Prometheus + Grafana:使用 JMX Exporter 暴露指标,示例:
- 启动参数加入:
-javaagent:/opt/prometheus/jmx_prometheus_javaagent-0.18.0.jar=9090:/opt/prometheus/kafka.yml
- 抓取 9090 端口指标并在 Grafana 展示。
- 容量与健康检查:
- 定期执行 df -h 与 du -sh /var/log/kafka /your/kafka/data 观察磁盘;
- 关注 UnderReplicatedPartitions 与 RequestHandlerAvgIdlePercent 的异常波动。
五 实用配置示例与运维命令
- server.properties 关键项(按业务调优):
log.dirs=/data/kafka-logs
log.retention.ms=259200000
log.segment.bytes=1073741824
log.roll.hours=168
log.cleanup.policy=delete
log.cleaner.threads=2
- 动态调节保留时间(无需重启):
- 将某 Topic 保留时间临时改为 1 小时:
./kafka-configs.sh --bootstrap-server localhost:9092
–alter --entity-type topics --entity-name your_topic
–add-config retention.ms=3600000
- 运行日志轮转验证:
- 手动触发一次轮转:logrotate -f /etc/logrotate.d/kafka
- 检查是否生成 .gz 归档且 Kafka 继续正常写入。