🌙

采集多台Linux主机日志时

当需要采集多台Linux主机日志时,不需要在每台主机上都部署后端服务。我来为你介绍几种常见的分布式日志采集方案:


一、分布式日志采集方案

方案1:Agent代理模式(推荐)

架构设计:

┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ Linux主机1   │   │ Linux主机2   │   │ Linux主机N   │
│ ┌────────┐ │   │ ┌────────┐ │   │ ┌────────┐ │
│ │ Agent │──┼────┤ │ Agent │──┼────┤ │ Agent │ │
│ └────────┘ │   │ └────────┘ │   │ └────────┘ │
└──────────────┘   └──────────────┘   └──────────────┘
      │                   │                   │
      └────────────────────┼────────────────────┘
                            ▼
                  ┌──────────────────┐
                  │ 中央后端服务器   │
                  │ (Flask + DB)   │
                  └────────┬─────────┘
                          ▼
                  ┌──────────────────┐
                  │     前端         │
                  └──────────────────┘

实现方式:

  1. 在每台Linux主机上部署轻量级Agent(Python脚本或专用工具如Filebeat)

  2. Agent负责:

    • 监控本地日志文件变化

    • 实时推送日志到中央后端

    • 支持离线缓存(网络断开时暂存本地)

优点:

  • 解耦性好,后端集中管理

  • 支持水平扩展,新增主机只需部署Agent

  • 实时性好,支持断线重连

缺点:

  • 需要在每台主机上部署Agent


方案2:SSH远程采集模式

架构设计:

┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ Linux主机1   │   │ Linux主机2   │   │ Linux主机N   │
│ /var/log/... │   │ /var/log/... │   │ /var/log/... │
└──────┬───────┘   └──────┬───────┘   └──────┬───────┘
      │                 │                 │
      └──────────────────┼──────────────────┘
                        ▼
                  ┌──────────────────┐
                  │ 后端服务器     │
                  │ (SSH连接采集)   │
                  └────────┬─────────┘
                          ▼
                  ┌──────────────────┐
                  │     前端         │
                  └──────────────────┘

实现方式:

  1. 后端通过SSH连接到各主机

  2. 使用paramiko库远程读取日志文件

  3. 配置SSH密钥认证避免密码输入

优点:

  • 无需在目标主机部署额外软件

  • 统一管理,单点维护

缺点:

  • 实时性较差(轮询方式)

  • 依赖SSH服务和网络连接

  • 权限管理复杂


方案3:Syslog协议模式

架构设计:

┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ Linux主机1   │   │ Linux主机2   │   │ Linux主机N   │
│ syslog配置 │   │ syslog配置 │   │ syslog配置 │
└──────┬───────┘   └──────┬───────┘   └──────┬───────┘
      │                 │                 │
      └──────────────────┼──────────────────┘
                        ▼ (UDP/TCP)
                  ┌──────────────────┐
                  │ Syslog Server   │
                  │ → 后端处理     │
                  └────────┬─────────┘
                          ▼
                  ┌──────────────────┐
                  │     前端         │
                  └──────────────────┘

实现方式:

  1. 配置各主机的syslog服务将日志转发到中央服务器

  2. 后端作为Syslog服务器接收日志

  3. 解析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增加批量接收接口:

@log_bp.route('/collect', methods=['POST'])
@jwt_required()
def collect_logs():
   """接收Agent发送的日志"""
   data = request.get_json()
   hostname = data.get('hostname', 'unknown')
   logs = data.get('logs', [])
   
   for log_entry in logs:
       # 解析日志并存储
       record = LogRecord(
           timestamp=datetime.now(),
           hostname=hostname,
           content=log_entry,
           # 自动提取日志级别等信息
      )
       db.session.add(record)
   
   db.session.commit()
   return jsonify({'status': 'success', 'count': len(logs)}), 200

三、前端设置

3.1 前端无需大规模修改

前端主要是展示层,数据通过API获取,只需:

  1. 增加主机选择器:在页面顶部添加主机筛选下拉框

  2. 修改日志列表:显示日志来源主机名

  3. 更新图表:支持按主机筛选统计数据

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: '所有主机' },
                   ...hosts.map(host => ({ value: host, label: host }))
              ]}
           />
          {/* 日志表格... */}
       </div>
  );
};

3.3 后端增加主机列表接口

@log_bp.route('/hosts', methods=['GET'])
@jwt_required()
def get_hosts():
   """获取所有已采集的主机列表"""
   hosts = db.session.query(LogRecord.hostname).distinct().all()
   host_list = [h[0] for h in hosts]
   return jsonify({'hosts': host_list}), 200

四、部署建议

场景推荐方案理由
主机数量较少(<10台) SSH远程采集 部署简单,无需额外软件
主机数量较多(>10台) Agent代理模式 可扩展性好,实时性高
已有syslog基础设施 Syslog协议 利用现有架构

建议步骤:

  1. 在中央服务器部署后端和前端(保持现状)

  2. 在各Linux主机部署Agent(或配置syslog转发)

  3. 修改前端增加主机筛选功能

  4. 测试日志采集效果


五、安全性考虑

  1. 通信加密:使用HTTPS传输日志

  2. 认证机制:Agent使用API Key认证

  3. 权限控制:限制日志文件读取权限

  4. 数据脱敏:敏感信息自动脱敏处理

如果你需要,我可以帮你实现Agent脚本和相应的后端接口修改。

posted @ 2026-06-12 22:57  星火撩原  阅读(12)  评论(0)    收藏  举报
本站已运行:0
🌙 夜间模式
🌙
🌙