基于Rsyslog + MongoDB搭建集中式日志管理系统:
一、架构概述
- 日志采集端:Web服务器/防火墙等设备
- 日志服务器:Rsyslog + MongoDB
- 数据流向:
Laravel App → Rsyslog Client → Rsyslog Server → MongoDB
Firewall → Rsyslog Client → Rsyslog Server → MongoDB
二、服务端配置(日志中心服务器)
- 安装必要组件
# Ubuntu
sudo apt-get install rsyslog rsyslog-mongodb mongodb
# CentOS
sudo yum install rsyslog rsyslog-mongodb mongodb-org
- 配置Rsyslog服务端
# 编辑配置文件
sudo vim /etc/rsyslog.conf
# 启用网络接收
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# 添加MongoDB支持
module(load="ommongodb")
# 定义日志模板
template(name="MongoLogs" type="list") {
property(name="timestamp" dateFormat="iso8601")
constant(value=" ")
property(name="hostname")
constant(value=" ")
property(name="syslogtag")
constant(value=" ")
property(name="msg" spifno1stsp="on")
}
# 转发到MongoDB
action(type="ommongodb"
server="127.0.0.1"
serverport="27017"
database="syslog"
collection="logs"
template="MongoLogs")
- 配置MongoDB
# 启动MongoDB服务
sudo systemctl start mongod
# 创建日志数据库用户
mongo
> use syslog
> db.createUser({
user: "rsyslog",
pwd: "StrongPassword123",
roles: [ { role: "readWrite", db: "syslog" } ]
})
- 重启服务
sudo systemctl restart rsyslog mongod
三、客户端配置(Web服务器/防火墙)
- Laravel日志配置
# .env文件
LOG_CHANNEL=syslog
LOG_SYSLOG_HOST=your-log-server-ip
APP_NAME=laravel-app
- Rsyslog客户端配置
sudo vim /etc/rsyslog.d/10-forward.conf
# 转发规则
*.* @@your-log-server-ip:514 # TCP传输
# 或
*.* @your-log-server-ip:514 # UDP传输
# Laravel专用模板
template(name="LaravelFormat" type="string" string="%timegenerated% %HOSTNAME% %syslogtag% %msg%\n")
if $syslogtag contains 'laravel' then {
action(type="omfwd" Target="your-log-server-ip" Port="514" Protocol="tcp" Template="LaravelFormat")
}
- 防火墙日志配置(以iptables为例)
# 添加日志规则
iptables -A INPUT -j LOG --log-prefix "[FIREWALL] "
# 配置rsyslog捕获防火墙日志
sudo vim /etc/rsyslog.d/20-ufw.conf
:msg, contains, "[FIREWALL]" -/var/log/ufw.log
& @@your-log-server-ip:514
四、验证配置
- 发送测试日志
logger -t TestTag "This is a test message"
- 查询MongoDB
mongo syslog -u rsyslog -p
db.logs.find().pretty()
五、常见问题排查
- 日志未接收:
- 检查防火墙是否开放514端口
- 验证rsyslog服务状态
systemctl status rsyslog
- 查看本地日志
/var/log/syslog
- MongoDB连接问题:
- 检查MongoDB服务状态
- 验证认证信息是否正确
- 测试本地连接
mongo --host 127.0.0.1 --port 27017 -u rsyslog -p
六、高级配置建议
- 日志分类存储
# 按设备类型分集合
template(name="DynamicCollection" type="list") {
property(name="hostname")
constant(value="_")
property(name="syslogfacility-text")
}
action(type="ommongodb"
server="127.0.0.1"
database="syslog"
collection="DynamicCollection")
- 安全增强
# TLS加密传输
action(type="ommongodb"
server="mongodb.example.com"
tls="on"
tls.caCert="/path/to/ca.pem"
tls.myCert="/path/to/client-cert.pem")
- 性能优化
# Rsyslog队列配置
action(type="ommongodb"
queue.type="LinkedList"
queue.size="100000"
queue.workerThreads="4"
queue.dequeueBatchSize="1000")
七、日志查看示例
- Laravel日志查询:
db.logs.find({
"syslogtag": "laravel-app"
}).sort({ timestamp: -1 })
- 防火墙日志分析:
db.logs.aggregate([
{ $match: { "syslogtag": { $regex: /FIREWALL/ } } },
{ $group: { _id: "$hostname", count: { $sum: 1 } } }
])
提示:建议配合ELK Stack或Grafana进行可视化展示,可通过MongoDB Connector实现数据集成。