手动安装 Fluentd + MongoDB 插件并收集 Nginx JSON 日志
以下是完整步骤,从安装 Fluentd 到配置 Nginx JSON 日志存储到 MongoDB。
- 手动安装 Fluentd(td-agent)
如果已通过 RPM 安装 td-agent,跳过此步。否则:
下载 td-agent RPM(以 CentOS 7 为例)
wget https://packages.treasuredata.com/4/redhat/7/x86_64/td-agent-4.5.1-1.el7.x86_64.rpm
安装
sudo rpm -ivh td-agent-*.rpm
启动服务
sudo systemctl start td-agent
sudo systemctl enable td-agent
- 安装 MongoDB 插件
Fluentd 需要 fluent-plugin-mongo 插件来支持 MongoDB 输出:
sudo /usr/sbin/td-agent-gem install fluent-plugin-mongo
验证插件是否安装成功:
sudo /usr/sbin/td-agent-gem list | grep mongo
应输出:
fluent-plugin-mongo (1.0.0)
- 配置 Nginx 输出 JSON 格式日志
(1)修改 Nginx 日志格式
编辑 Nginx 配置文件(如 /etc/nginx/nginx.conf):
http {
log_format json_log escape=json
'{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/access.log json_log; # 使用 JSON 格式
}
重启 Nginx:
sudo systemctl restart nginx
(2)验证日志格式
tail -n 1 /var/log/nginx/access.log
输出示例:
- 配置 Fluentd 收集日志并写入 MongoDB
编辑 Fluentd 配置文件 /etc/td-agent/td-agent.conf:
sudo vim /etc/td-agent/td-agent.conf
替换为以下内容(根据您的 MongoDB 信息调整):
输入:收集 Nginx JSON 日志
输出:存储到 MongoDB
可选:设置写入模式
输出:同时写入本地文件(调试用)
- 启动 Fluentd 并验证
(1)重启 td-agent
sudo systemctl restart td-agent
(2)检查 Fluentd 日志
sudo tail -f /var/log/td-agent/td-agent.log
正常输出示例:
2023-10-01 12:00:00 +0800 [info]: starting fluentd-1.16.0
2023-10-01 12:00:00 +0800 [info]: listening port port=24224
(3)测试日志收集
访问 Nginx 服务生成日志:
curl http://localhost/
检查 MongoDB 是否写入数据:
进入 MongoDB Shell
mongo --host 127.0.0.1 -u user -p password --authenticationDatabase nginx_logs
查询数据
use nginx_logs
db.access.find().pretty()
输出示例:
{
"_id": ObjectId("65123456789abcdef0123456"),
"time": ISODate("2023-10-01T04:00:00Z"),
"remote_addr": "192.168.1.1",
"request": "GET / HTTP/1.1",
"status": "200",
"body_bytes_sent": "612",
"http_user_agent": "Mozilla/5.0..."
}
- 高级优化
(1)MongoDB 索引优化
// 创建索引加速查询
db.access.createIndex({ "time": 1 }); // 按时间排序
db.access.createIndex({ "remote_addr": 1 }); // 按 IP 查询
(2)日志自动清理(TTL 索引)
// 自动删除 30 天前的日志
db.access.createIndex(
{ "time": 1 },
{ expireAfterSeconds: 2592000 } // 30 天 = 30243600 秒
);
(3)错误处理
如果 Fluentd 报错连接 MongoDB,检查:
• MongoDB 是否允许远程访问(bindIp: 0.0.0.0)。
• 防火墙是否放行 27017 端口:
sudo firewall-cmd --add-port=27017/tcp --permanent
sudo firewall-cmd --reload
总结
步骤 关键命令/配置
-
安装 td-agent rpm -ivh td-agent-*.rpm
-
安装 MongoDB 插件 td-agent-gem install fluent-plugin-mongo
-
配置 Nginx JSON 日志 log_format json_log escape=json '{...}';
-
配置 Fluentd /etc/td-agent/td-agent.conf(MongoDB 输出)
-
验证数据 db.access.find().pretty()
现在,Nginx 的 JSON 日志已自动存储到 MongoDB! 🚀