RedAnts
Published on 2025-03-04 / 16 Visits
0
1

Fluentd入门实录:从“一脸懵”到“我还不算菜”的日志管理奇幻漂流

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            # → 请记住这个端口号![1](@ref)

灵魂配置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没匹配!” ——别谢我,都是过来人的辛酸泪。


技术菜鸡の自我修养:本指南适用于和我一样“一看文档就困,一配环境就崩”的普通人类。祝各位早日成为日志管理界的“甩手掌柜”!


Comment