Kafka 在 CentOS 的日志管理实践
一 日志分类与存放位置
- 运行日志(Kafka 服务自身输出,如 server.log):默认位于 Kafka 安装目录的 logs/ 下,例如 /opt/kafka_2.13-3.6.1/logs/server.log。该目录由启动脚本中的 LOG_DIR 变量控制,若未显式设置,一般为安装目录下的 logs。
- 消息日志(主题数据,即消息存储):由 server.properties 中的 log.dirs 指定,常见为 /var/log/kafka/logs 或安装目录下的 kafka-logs。注意不要把临时目录(如 /tmp/kafka-logs)用于生产,避免被系统清理导致数据丢失。
- 快速定位与验证:
- 查看进程工作目录与日志输出:ps -ef | grep kafka;tail -f /opt/kafka_2.13-3.6.1/logs/server.log
- 查看 server.properties 中配置的 log.dirs 与监听地址,确认数据与日志路径是否正确。
二 运行日志轮转与保留(log4j + logrotate)
- 使用 log4j 管理运行日志(server.log 等):编辑 config/log4j.properties,通过 log4j.rootLogger 与 RollingFileAppender 设置滚动策略(按大小/时间切分、保留份数、压缩等)。修改后需重启 Broker 生效。
- 使用 logrotate 做系统级轮转(推荐):在 /etc/logrotate.d/ 下创建 kafka 配置,示例:
- 注意区分:logrotate 仅作用于“运行日志”(server.log),Kafka 的“消息日志”(主题数据)轮转与清理由 Broker 参数控制(见第三部分)。
三 消息日志保留与清理策略(Broker 参数)
- 保留时间(时间维度):在 server.properties 中设置保留阈值,优先级为 ms > minutes > hours。示例:
- 保留 7 天:log.retention.hours=168
- 保留 1 小时:log.retention.hours=1 或 log.retention.ms=3600000
- 保留大小(空间维度):log.retention.bytes=-1(不限制)或设置为如 214748364800(约 200GB)。
- 清理策略:
- 删除策略:log.cleanup.policy=delete(默认)
- 压缩策略:log.cleanup.policy=compact(需开启 log.cleaner.enable=true),适用于变更日志等场景。
- 分段与检查:
- 段滚动:log.roll.hours=168(默认 7 天)、log.segment.bytes=1073741824(默认 1GB)
- 检查间隔:log.retention.check.interval.ms=300000(默认 5 分钟)
- 删除延迟:log.segment.delete.delay.ms=60000(默认 1 分钟,满足条件后延迟删除)。
四 目录迁移与容量规划
- 迁移运行日志目录(LOG_DIR):
- 停止 Kafka;将旧日志拷贝至新目录(如 /mnt/kafka/logs);在 bin/kafka-run-class.sh(或启动脚本)中显式设置 LOG_DIR=/mnt/kafka/logs;启动并验证。
- 迁移消息日志目录(log.dirs):
- 停止 Kafka;拷贝数据至新目录(如 /mnt/kafka/data);在 server.properties 中设置 log.dirs=/mnt/kafka/data;启动并验证。
- 多磁盘与吞吐:可将 log.dirs 配置为多个磁盘路径(逗号分隔),Kafka 会在不同磁盘间分布分区数据以提升吞吐。
- 容量与监控:结合保留时间/大小与磁盘容量规划;定期检查 df -h 与 Kafka 日志目录增长。
五 日志级别动态调整与验证
- 动态修改日志级别(无需重启):
- 使用脚本工具:bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --add-config ‘log4j.logger.org.apache.kafka=DEBUG’ --entity-type brokers --entity-name 0
- 验证:tail -f /opt/kafka_2.13-3.6.1/logs/server.log 观察 DEBUG 日志是否出现。
- 静态修改(需重启):编辑 config/log4j.properties,如 log4j.rootLogger=DEBUG, stdout;保存后重启 Broker。