采集多台Linux主机日志时
一、分布式日志采集方案
方案1:Agent代理模式(推荐)
架构设计:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Linux主机1 │ │ Linux主机2 │ │ Linux主机N │
│ ┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │
│ │ Agent │──┼────┤ │ Agent │──┼────┤ │ Agent │ │
│ └────────┘ │ │ └────────┘ │ │ └────────┘ │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└────────────────────┼────────────────────┘
▼
┌──────────────────┐
│ 中央后端服务器 │
│ (Flask + DB) │
└────────┬─────────┘
▼
┌──────────────────┐
│ 前端 │
└──────────────────┘
实现方式:
-
在每台Linux主机上部署轻量级Agent(Python脚本或专用工具如Filebeat)
-
Agent负责:
-
监控本地日志文件变化
-
实时推送日志到中央后端
-
支持离线缓存(网络断开时暂存本地)
-
优点:
-
解耦性好,后端集中管理
-
支持水平扩展,新增主机只需部署Agent
-
实时性好,支持断线重连
缺点:
-
需要在每台主机上部署Agent
方案2:SSH远程采集模式
架构设计:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Linux主机1 │ │ Linux主机2 │ │ Linux主机N │
│ /var/log/... │ │ /var/log/... │ │ /var/log/... │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└──────────────────┼──────────────────┘
▼
┌──────────────────┐
│ 后端服务器 │
│ (SSH连接采集) │
└────────┬─────────┘
▼
┌──────────────────┐
│ 前端 │
└──────────────────┘
实现方式:
-
后端通过SSH连接到各主机
-
使用paramiko库远程读取日志文件
-
配置SSH密钥认证避免密码输入
优点:
-
无需在目标主机部署额外软件
-
统一管理,单点维护
缺点:
-
实时性较差(轮询方式)
-
依赖SSH服务和网络连接
-
权限管理复杂
方案3:Syslog协议模式
架构设计:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Linux主机1 │ │ Linux主机2 │ │ Linux主机N │
│ syslog配置 │ │ syslog配置 │ │ syslog配置 │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└──────────────────┼──────────────────┘
▼ (UDP/TCP)
┌──────────────────┐
│ Syslog Server │
│ → 后端处理 │
└────────┬─────────┘
▼
┌──────────────────┐
│ 前端 │
└──────────────────┘
实现方式:
-
配置各主机的syslog服务将日志转发到中央服务器
-
后端作为Syslog服务器接收日志
-
解析syslog格式并存储到数据库
优点:
-
标准协议,兼容性好
-
无需额外代理
缺点:
-
功能相对简单
-
可靠性依赖网络
二、推荐方案:Agent代理模式
2.1 Agent实现思路
在每台Linux主机上部署一个轻量级采集脚本:
# agent.py - 日志采集代理
import time
import paramiko
import json
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class LogHandler(FileSystemEventHandler):
def __init__(self, server_url, log_file):
self.server_url = server_url
self.log_file = log_file
def on_modified(self, event):
if event.src_path == self.log_file:
# 读取新增内容并发送到后端
with open(self.log_file, 'r') as f:
f.seek(self.get_last_position())
new_lines = f.readlines()
# 发送到后端API
self.send_logs(new_lines)
def send_logs(log_lines):
"""发送日志到中央后端"""
import requests
payload = {
'hostname': socket.gethostname(),
'logs': log_lines
}
requests.post(f'{BACKEND_URL}/api/logs/collect', json=payload)
if __name__ == '__main__':
event_handler = LogHandler(BACKEND_URL, '/var/log/syslog')
observer = Observer()
observer.schedule(event_handler, path='/var/log', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
2.2 后端改造
修改app/controllers/log_controller.py增加批量接收接口:
三、前端设置
3.1 前端无需大规模修改
前端主要是展示层,数据通过API获取,只需:
-
增加主机选择器:在页面顶部添加主机筛选下拉框
-
修改日志列表:显示日志来源主机名
-
更新图表:支持按主机筛选统计数据
3.2 前端修改示例
修改src/pages/HistoryLogs.tsx增加主机筛选:
import { Select } from 'antd';
const HistoryLogs = () => {
const [selectedHost, setSelectedHost] = useState('all');
const [hosts, setHosts] = useState<string[]>([]);
useEffect(() => {
// 获取所有主机列表
fetch('/api/logs/hosts')
.then(res => res.json())
.then(data => setHosts(data.hosts));
}, []);
const handleSearch = () => {
fetch(`/api/logs/history?host=${selectedHost}&...`)
.then(res => res.json())
.then(data => setLogs(data.data));
};
return (
<div>
<Select
value={selectedHost}
onChange={setSelectedHost}
style={{ width: 200 }}
options={[
{ value: 'all', label: '所有主机' },
3.3 后端增加主机列表接口
四、部署建议
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 主机数量较少(<10台) | SSH远程采集 | 部署简单,无需额外软件 |
| 主机数量较多(>10台) | Agent代理模式 | 可扩展性好,实时性高 |
| 已有syslog基础设施 | Syslog协议 | 利用现有架构 |
建议步骤:
-
在中央服务器部署后端和前端(保持现状)
-
-
修改前端增加主机筛选功能
-
测试日志采集效果
五、安全性考虑
-
通信加密:使用HTTPS传输日志
-
认证机制:Agent使用API Key认证
-
权限控制:限制日志文件读取权限
-
数据脱敏:敏感信息自动脱敏处理

浙公网安备 33010602011771号