1. 开篇碎碎念
“我只是个想安静写代码的打工人,为什么日志管理要这么难?!” ——这大概是我第101次试图用awk+grep+手动压缩日志时的内心哀嚎。直到我遇到了Fluentd,这个自称*“统一日志层”*的老哥。它承诺用YAML式配置解决所有烦恼,但安装文档却让我瞬间瞳孔地震……
但别怕!经过三天三夜的以身试坑,我总结出了一份自嘲级保姆教程,专治“文档读三遍依然配置失败”的疑难杂症。
2. 需求一:5分钟让Fluentd在Ubuntu上撒欢跑
Step 1:安装——像极了人生,先解决依赖问题
别被术语吓到,跟着敲就完事儿:
# 宇宙惯例:先更新!不然装不上别哭
sudo apt-get update
# 安装CURL,一个下载界的交际花
sudo apt-get install -y curl
# 添加官方仓库(此处有个隐藏彩蛋:你的Ubuntu版本会被自动识别!)
curl -fsSL https://toolbelt.treasuredata.com/sh/install-ubuntu-$(lsb_release -sc)-td-agent4.sh | sudo sh
# 终极一击——安装Fluentd(其实它叫td-agent,惊不惊喜?)
sudo apt-get install -y td-agent
Step 2:验证——要是没日志输出,就当无事发生过
# 启动服务,设置服务自启动
sudo systemctl start td-agent
sudo systemctl enable td-agent
#检查状态
sudo systemctl status td-agent
#服务重启
sudo systemctl restart td-agent
#服务关闭
sudo systemctl stop td-agent
#查看日志
vim /var/log/td-agent/td-agent.log
#检查td-agent.conf 是否语法错误
sudo td-agent --dry-run -c /etc/td-agent/td-agent.conf
# 完整配置
<source>
@type tail
path /var/log/myapp.log
pos_file /var/log/td-agent/myapp.log.pos
tag app.logs
format /^(?<time>[^ ]+) \[(?<level>[^\]]+)\] (?<message>.*)$/
time_key time
time_format %Y-%m-%dT%H:%M:%S.%L%z
</source>
<filter app.logs>
@type grep
<regexp>
key level
pattern ERROR
</regexp>
</filter>
<match app.logs>
@type file
path /var/log/error.log
append true
<buffer>
@type file
path /var/log/td-agent/buffer/error
flush_mode interval
flush_interval 1s
</buffer>
</match>
# 手动造点假日志(我称之为“程序员的自娱自乐”)
echo '2023-10-01T12:00:00.123+0800 [ERROR] 咖啡机炸了' >> /var/log/myapp.log
echo '2023-10-01T12:01:00.456+0800 [INFO] 猫咪踩了键盘' >> /var/log/myapp.log
# 看看Fluentd有没有好好干活
cat /var/log/error.log
# 如果只看到“咖啡机炸了”,恭喜你已经成功过滤ERROR日志!
Step 3:进阶玩法——让Fluentd内卷起来
-
场景1:同时抓ERROR和CRITICAL的老板需求
<filter app.logs> @type grep <regexp> key level pattern /ERROR|CRITICAL/ # 召唤两种级别的错误,打工人的双倍快乐 </regexp> </filter>
-
场景2:强迫症必备之时间戳
<match app.logs> @type file path /var/log/error.log <format> @type json # 输出带时间戳的JSON,假装自己很专业[1](@ref) </format> </match>
-
场景3:自动压缩旧日志,存储省到老板流泪
<match app.logs> @type file compress gzip # 自动压缩成祖传zip包[1](@ref) timekey 1d # 按日切分,让日志管理像切蛋糕一样优雅 </match>
Step4:躲不开的坑——来自踩坑侠的忠告
- 权限问题:Fluentd要是报错
Permission denied
,记得用sudo chmod
给读写权限,或者直接甩锅给Linux用户组。 - 正则翻车:强烈建议去Rubular测试你的正则表达式,别问我怎么知道的。
- 看tag!看tag!看tag!:配置里每个
<source>
和<match>
的tag必须对上,不然日志就像前任的消息——石沉大海。
3. 需求二:让日志坐上Kafka火箭,直通SpringBoot
Part 1:插件安装——别输错命令,别问为什么强调这个(kafka安装看下面)
# 切个Gem源,速度拉满(国内用户的求生欲)
sudo td-agent-gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
# 安装Kafka插件(过程可能需要一杯咖啡的时间)
sudo td-agent-gem install fluent-plugin-kafka
# 检查是否安装成功(绿灯亮起:懂我意思吧?)
td-agent-gem list | grep fluent-plugin-kafka
Part 2:配置示例——日志的奇幻漂流
# 告诉Fluentd:把日志丢给Kafka(topic名字请自行替换成老板的奇思妙想)
<source>
@type tail
path /var/log/myapp.log
pos_file /var/log/td-agent/myapp.log.pos
tag app.logs
<parse>
@type none
</parse>
</source>
<match app.logs>
@type kafka2
brokers PLAINTEXT://localhost:9092
default_topic logs-topic
required_acks 1 # 单节点改为1避免等待副本
<format>
@type json
</format>
<buffer>
@type memory
flush_interval 1s # 最大积压时间1秒
</buffer>
</match>
根据文档内容,Kafka的安装流程如下:
4.Kafka安装全攻略(附踩坑预判)
Part 1:环境准备Java是敲门砖
# 装新不装旧原则(OpenJDK走起)
sudo apt update && sudo apt install -y openjdk-11-jdk
# 灵魂拷问:Java装好了没?
java -version
# 预期输出:openjdk 11.x.x
Part 2:下载Kafka安装包
文档版本差异警示!注意3.5.0和3.9.0可能混用,以实际链接为准
# 当前最新稳定版(3.9.0)
wget https://downloads.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.tgz
# 解压到/opt目录(日后的泪都是乱装软件时脑子进的水)
sudo tar -xzf kafka_2.13-3.9.0.tgz -C /opt/
sudo mv /opt/kafka_2.13-3.9.0 /opt/kafka
Part 3:权限配置:防崩指南
# 创建专属日志目录并夺权
sudo mkdir -p /var/log/kafka-logs
sudo chown -R $USER:$USER /opt/kafka /var/log/kafka-logs
Part 4:单节点变身记
灵魂配置1:Zookeeper(Kafka的动力源泉)
nano /opt/kafka/config/zookeeper.properties
# 核查两处镀金配置(改错就等着报Port in use吧)
dataDir=/var/log/zookeeper # → Zookeeper的数据宅基地[1](@ref)
clientPort=2181 # → 请记住这个端口号
灵魂配置2:Kafka Broker(运输大动脉)
nano /opt/kafka/config/server.properties
# VIP改键区域(新手必改三连):
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://你机器的真实IP:9092 # ← 此处手抖必死
log.dirs=/var/log/kafka-logs # ← 指向前面建的日志目录[1](@ref)
zookeeper.connect=localhost:2181
Part 5:启动双王 Zookeeper和Broker
测试模式(狂看Log时用)
# Zookeeper前台启动(记得开新terminal)
/opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties
# Kafka前台启动(点击即送的报错信息)
/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
生产模式(装逼但省心版)
# Zookeeper后台启动(日志输出到文件)
nohup /opt/kafka/bin/zookeeper-server-start.sh config/zookeeper.properties > zk.log 2>&1 &
# Kafka后台启动(假装自己是大厂运维)
nohup /opt/kafka/bin/kafka-server-start.sh config/server.properties > kafka.log 2>&1 &
Part 6:终极验货流程
1. 缔造测试Topic
/opt/kafka/bin/kafka-topics.sh --create \
--topic test-topic \
--bootstrap-server localhost:9092 \
--partitions 1 --replication-factor 1
2. 拍下键盘发送消息
# 生产者窗口(随便打字后Ctrl+D发送)
/opt/kafka/bin/kafka-console-producer.sh \
--topic test-topic --bootstrap-server localhost:9092
3. 虎视眈眈等消息
# 消费者窗口(收不到就准备提刀找自己配置吧)
/opt/kafka/bin/kafka-console-consumer.sh \
--topic test-topic --from-beginning --bootstrap-server localhost:9092
Part 7:(可选). 系统服务黑科技
适用症状:重启服务器后不想手动启服务的强迫症患者
# 创建Zookeeper服务文件(注意替换$USER为你的用户名)
sudo nano /etc/systemd/system/zookeeper.service
# 加入服务配置(复制文档中的[Unit]等部分)
# Kafka服务同理,然后启动全家桶
sudo systemctl daemon-reload
sudo systemctl start zookeeper kafka
sudo systemctl enable zookeeper kafka
需要SpringBoot吃喝Kafka的代码实例,请参考Gitee仓库链接 https://gitee.com/redants-101/fluentd_kafka_springboot.git 代码库
5. 结语:我终于和日志和解了
经过这场战役,我深刻领悟到:真正的大神不是能写出无BUG的代码,而是能用Fluentd让BUG日志优雅归档。虽然过程中无数次想砸键盘,但看到日志按需分类、自动压缩、丝滑流入Kafka的那一刻……我膨胀了!
最后,如果真的卡住了,请默念三遍:“是正则写错了,是权限不够,是tag没匹配!” ——别谢我,都是过来人的辛酸泪。
技术菜鸡の自我修养:本指南适用于和我一样“一看文档就困,一配环境就崩”的普通人类。祝各位早日成为日志管理界的“甩手掌柜”!