LCA · 日志收集智能分析系统

企业级日志采集 · 智能运维 · AI 智能告警· 实时分析 · 多渠道通知


目录


功能概览

模块 功能描述
日志采集 Agent 跨平台(Linux/Windows)部署,Glob 路径匹配,断点续传,心跳检测,Agent 离线邮件告警
API 直推 任意应用通过 HTTP API 直接投递日志,无需 Agent,支持批量推送
日志传输 Kafka 消峰削谷 → Elasticsearch 存储,支持多日志库独立 Topic 隔离
日志查询 类 Kibana Discover 界面,时间直方图、字段面板、KQL 全文搜索
AI 智能告警 ES 规则初筛 + OpenAI 兼容大模型深度分析,企业微信 / 钉钉 / 邮件 / Webhook 多渠道通知
告警历史 所有 AI 告警 + Agent 离线告警统一记录,支持按来源 / 级别 / 状态查询
采集任务管理 可视化配置 Agent 采集路径、解析模式(raw/json/regex/delimiter)、多行合并
Agent 管理 实时心跳监控,在线 / 离线状态,3 分钟超时自动标记并邮件通知管理员
权限管理 基于 Casbin RBAC,支持部门 / 岗位 / 角色 / 菜单精细化权限控制
备份管理 Elasticsearch 快照自动备份至阿里云 OSS,支持手动恢复
AI智能体 可以根据指令智能完成相应的任务,你只需要给它发配指令就行
授权码管理 RSA 机器指纹绑定,在线激活,防盗用

系统预览

首页 Dashboard

实时展示日志库数量、日志总量、告警数量、今日采集量;柱状图 + 环形图双视角呈现各日志库文档分布,采集速率以「条/分」精准到分钟。

在这里插入图片描述

日志查询(类 Kibana Discover)

时间直方图 + 可用字段面板 + KQL/Lucene 全文检索,支持快捷时间范围(1m / 5m / 15m / 1h / 4h / 24h / 7d / 30d)与自定义区间。

在这里插入图片描述

告警历史

统一展示 AI 告警与 Agent 离线告警记录,支持按日志库 / 严重程度过滤,一键查看「诊断报告」或「原始日志」。

在这里插入图片描述

AI 智能诊断报告

大模型深度分析后给出「异常摘要 / 根因分析 / 修复步骤」三段式诊断,步骤内联合可运行命令片段,定位问题不再靠猜。

在这里插入图片描述

备份策略

可视化配置 ES 快照 SLM 策略:执行频率 / 保留天数 / 最少最多快照数 / OSS 仓库,自动备份至阿里云 OSS。

在这里插入图片描述

Agent 管理

实时心跳状态跟踪,在线 / 离线一目了然,超时自动标记并邮件告警。

在这里插入图片描述

采集任务管理

为指定 Agent 动态下发采集任务:目标日志库 + Glob 路径 + 解析模式(raw / json / regex / delimiter),60 秒动态生效无需重启。

在这里插入图片描述

AI智能体

可以根据指令智能完成相应的任务,你只需要给它发配指令就行。

在这里插入图片描述


系统架构

┌────────────────────────────────────────────────────────────────┐
│                         LCA 系统架构                            │
├───────────────┬────────────────────────────────────────────────┤
│               │  ┌─────────────┐   ┌──────────────────────┐   │
│  日志源        │  │ 应用服务器   │   │  网络设备 / 容器      │   │
│               │  └──────┬──────┘   └──────────┬───────────┘   │
│               │         │ 文件 Tail              │ HTTP API       │
│  采集层        │  logcollect Agent               │               │
│               │  (断点续传 + 心跳)             ↓               │
│               │         └──────────────→  apiserver :8086       │
│               │                              │                  │
│  传输层        │                         Kafka Topic             │
│               │                              │                  │
│               │                         logtransfer             │
│               │                              │                  │
│  存储层        │                    Elasticsearch 7.x            │
│               │                    (ILM 生命周期管理)          │
│               │                              ↑                  │
│  管理层        │              admin :8080 (Go + Gin)             │
│  展示层        │           Web UI (Vue 3 + Element Plus)         │
│  告警层        │      AI Scanner → 企业微信/钉钉/邮件/Webhook     │
└───────────────┴────────────────────────────────────────────────┘

服务说明

服务 端口 说明
admin 8080 管理后台 API + 静态资源服务(必须启动)
apiserver 8086 日志推送接入点(Agent 上报 + 直接投递)
logtransfer Kafka 消费者,写入 Elasticsearch
logcollect Linux/macOS Agent,部署在被采集机器上
logcollect_win Windows Agent
syslog 514/UDP Syslog 协议接收服务(可选)

技术栈

后端

  • Go 1.21+ · Gin · GORM · Casbin
  • MySQL 8.0 · Redis · Apache Kafka · Elasticsearch 7.x
  • JWT 认证 · RSA License 验证 · Zap 日志

前端

  • Vue 3 · TypeScript · Element Plus · Vite · ECharts

快速部署

前置要求

组件 版本要求 说明
Go 1.21+ 手动部署时需要
Node.js 18+ 前端开发时需要
Docker & Docker Compose 20+ Docker 部署时需要
MySQL 8.0+ 可复用已有实例
Redis 6.0+ 可复用已有实例
Kafka 2.8+ 可复用已有实例
Elasticsearch 7.x 推荐 7.17
授权码 前往购买

方式一:Docker Compose 高可用部署(推荐生产环境)

多实例 + 自动故障转移 + 数据多副本冗余,一键启动 MySQL 主从、Redis Sentinel、Kafka 3 Broker、Elasticsearch 3 节点集群、所有后端服务(admin×2、apiserver×2、logtransfer×2)及 Nginx 负载均衡。

# 1. 克隆代码
git clone https://github.com/jc2255/log-collect-ai-analytics.git
cd log-collect-ai-analytics

# 2. 复制并编辑环境变量(修改数据库密码、JWT Secret 等)
cp .env.example .env
vim .env

# 3. 启动 HA 集群
docker compose -f docker-compose.ha.yaml up -d

# 4. 查看服务状态
docker compose -f docker-compose.ha.yaml ps

# 5. 查看服务日志
docker compose -f docker-compose.ha.yaml logs -f admin1
docker compose -f docker-compose.ha.yaml logs -f apiserver1

启动完成后访问:http://your-server-ip

默认账号:admin 默认密码:admin123

⚠️ 首次使用需在「系统设置 → 授权管理」页面激活授权码

HA 架构详情
层级 能力 实现方式
Redis 自动故障转移 Sentinel 1主2从3哨兵
分布式锁 任务互斥执行 Redis SETNX + Lua 原子释放
Leader Election 定时任务单点执行 续约式锁,失败自动降级 standby
Casbin 同步 多实例策略一致性 Redis Pub/Sub 通知重载
MySQL 读写分离 主库写 + 从库读,GTID 主从复制
Kafka 数据多副本 3 Broker,replication.factor=3
Elasticsearch 数据冗余 3 节点集群 + 1 副本分片
Nginx 负载均衡 upstream 轮询 + 健康检查 + 故障转发
应用层 水平扩展 admin×2, apiserver×2, logtransfer×2
HA 配置文件
文件 说明
configs/admin-ha.yaml admin 服务 HA 配置(Sentinel + 读副本)
configs/apiserver-ha.yaml apiserver 服务 HA 配置
configs/logtransfer-ha.yaml logtransfer 服务 HA 配置
deploy/ha/nginx-ha.conf Nginx 负载均衡配置
deploy/ha/sentinel.conf Redis Sentinel 配置
deploy/ha/mysql-master.cnf MySQL 主库配置
deploy/ha/mysql-slave.cnf MySQL 从库配置

方式二:手动部署

适合已有 MySQL / Redis / Kafka / ES 基础设施的环境。

步骤 1:安装基础依赖
# Ubuntu / Debian
apt-get update
apt-get install -y mysql-server redis-server

# 安装 Kafka(确保已安装 Java 11+)
wget https://downloads.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz
tar -xzf kafka_2.13-3.6.0.tgz
cd kafka_2.13-3.6.0

# 启动 Kafka(需先启动 Zookeeper)
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
bin/kafka-server-start.sh -daemon config/server.properties
步骤 2:初始化数据库
mysql -u root -p <<EOF
CREATE DATABASE IF NOT EXISTS lca DEFAULT CHARACTER SET utf8mb4;
CREATE USER IF NOT EXISTS 'lca'@'%' IDENTIFIED BY 'lca2024';
GRANT ALL PRIVILEGES ON lca.* TO 'lca'@'%';
FLUSH PRIVILEGES;
EOF

数据库表结构由程序启动时 自动 AutoMigrate 创建,无需手动执行 SQL。

步骤 3:编译项目
# 编译所有服务
go build -o bin/admin       ./cmd/admin
go build -o bin/apiserver   ./cmd/apiserver
go build -o bin/logtransfer ./cmd/logtransfer
go build -o bin/logcollect  ./cmd/logcollect

# 编译前端(生产构建)
cd web
npm install
npm run build
# 构建产物在 web/dist/,由 admin 服务托管静态资源
cd ..
步骤 4:修改配置文件
# 根据实际环境修改(MySQL / Redis / Kafka / ES 地址和密码)
vim configs/admin.yaml
vim configs/apiserver.yaml
vim configs/logtransfer.yaml
步骤 5:依次启动各服务
# 建议使用 systemd / supervisord / screen 等方式后台运行

# 管理后台(必须第一个启动,负责 AutoMigrate 和初始化数据)
./bin/admin -config configs/admin.yaml

# 日志接入服务
./bin/apiserver -config configs/apiserver.yaml

# Kafka→ES 传输服务
./bin/logtransfer -config configs/logtransfer.yaml

各服务启动说明

推荐启动顺序

1. MySQL / Redis / Kafka / Elasticsearch  ← 基础设施
2. admin          ← 管理后台,负责建表和初始数据
3. apiserver      ← 日志接入,依赖 MySQL + Kafka
4. logtransfer    ← 数据传输,依赖 Kafka + ES
5. logcollect     ← 采集 Agent(部署在各业务机器上)

使用 systemd 托管(推荐生产环境)

admin 服务为例:

# /etc/systemd/system/lca-admin.service
[Unit]
Description=LCA Admin Server
After=network.target mysql.service

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/lca
ExecStart=/opt/lca/bin/admin -config /opt/lca/configs/admin.yaml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable lca-admin
systemctl start lca-admin
systemctl status lca-admin

健康检查接口

curl http://localhost:8080/health   # admin
curl http://localhost:8086/health   # apiserver

配置文件详解

configs/admin.yaml

server:
  port: 8080          # 管理后台端口
  mode: release       # debug / release

mysql:
  host: 127.0.0.1
  port: 3306
  user: root
  password: "lca2024"
  dbname: lca

redis:
  host: 127.0.0.1
  port: 6379
  password: "lca2024"

kafka:
  brokers:
    - "127.0.0.1:9092"

elasticsearch:
  addresses:
    - "http://127.0.0.1:9200"
  username: ""   # ES 有密码时填写
  password: ""

jwt:
  secret: "change-this-secret-in-production"  # 必须修改!
  expire_hour: 24

log:
  level: info
  filename: logs/admin.log   # 留空则输出到 stdout

license:
  public_key: |               # RSA 公钥,用于验证授权码
    -----BEGIN PUBLIC KEY-----
    ...
    -----END PUBLIC KEY-----

configs/apiserver.yaml

server:
  port: 8086   # 日志接入端口,Agent 和直推 API 均使用此端口

# 其余配置同 admin.yaml

configs/logcollect.yaml(Agent 配置)

api_server: "http://your-apiserver"   # apiserver 地址
admin_server: "http://your-admin"     # admin 地址,用于拉取采集任务
api_key: "ak_your_logstore_xxx"            # 日志库的 API Key(在日志库页面查看)
agent_id: "server-prod-001"               # 当前机器的唯一标识
batch_size: 50                             # 批量发送条数
flush_seconds: 5                           # 最大积攒秒数(超时强制发送)

Agent 部署

Linux / macOS

# 从 GitHub 下载预编译二进制
wget https://github.com/jc2255/log-collect-ai-analytics/raw/main/release/bin/logcollect -O logcollect
chmod +x logcollect

# 创建工作目录
mkdir -p /opt/lca-agent && mv logcollect /opt/lca-agent/

# 创建配置文件
cat > /opt/lca-agent/logcollect.yaml <<'EOF'
api_server: "http://localhost"
admin_server: "http://localhost:80"
api_key: "ak_app-nginx_a1b2c3d4"
agent_id: "web-server-01"
batch_size: 50
flush_seconds: 5
EOF

# 启动(前台调试)
cd /opt/lca-agent && ./logcollect -config logcollect.yaml

# 后台守护进程
nohup /opt/lca-agent/logcollect -config /opt/lca-agent/logcollect.yaml > /var/log/lca-agent.log 2>&1 &

Windows

# 从 GitHub 下载预编译二进制
Invoke-WebRequest -Uri "https://github.com/jc2255/log-collect-ai-analytics/raw/main/release/bin/logcollect.exe" -OutFile "C:\lca-agent\logcollect.exe"

# 创建配置文件 C:\lca-agent\logcollect.yaml(内容同上)

# 启动
C:\lca-agent\logcollect.exe -config C:\lca-agent\logcollect.yaml

# 注册为 Windows 服务(使用 NSSM)
nssm install LCACollect "C:\lca-agent\logcollect.exe" "-config C:\lca-agent\logcollect.yaml"
nssm start LCACollect

采集任务配置

Agent 启动后,在管理后台「日志采集 → 采集任务」中添加任务:

字段 说明 示例
绑定 Agent 指定由哪台 Agent 执行(0=全部 Agent) web-server-01
日志库 日志写入哪个日志库 app-nginx
路径模式 支持 Glob 通配符 /var/log/nginx/*.log
解析模式 raw / json / regex / delimiter raw
多行合并 Java 堆栈等多行日志的合并正则 ^\d{4}-\d{2}-\d{2}

Agent 每 60 秒自动从 admin 拉取最新任务,无需重启即可生效。


API 直接投递日志

无需部署 Agent,任意应用通过 HTTP API 直接推送日志,适合:

  • 容器化应用(Sidecar 模式)
  • 无法安装 Agent 的场景
  • SDK 集成、Logstash / Fluentd 对接

接口说明

POST http://your-apiserver:8086/api/v1/log/push
Content-Type: application/json
X-Trace-Id: <16位 hex>      // 可选,不传服务端会自动生成

{
  "api_key": "ak_your_logstore_xxx",  // 日志库的 API Key(必填)
  "logs": [                            // 日志数组(必填,支持批量)
    { ... },
    { ... }
  ]
}

响应体:

{
  "code": 0,
  "message": "success",
  "data": {
    "count": 1,
    "trace_id": "7eae7b75176463bd"   // 全链路追踪 ID,后续问题定位仅需提供该 ID
  }
}

响应 Header 也会携带 X-Trace-Id;同一条日志在 apiserver / Kafka / logtransfer / ES 中均可通过该 ID 串联。

每条日志可以是任意 JSON 对象,系统会自动附加以下字段:

  • _timestamp:Unix 毫秒时间戳
  • _source_ip:推送方 IP
  • _store_name:日志库名称
  • _trace_id:全链路追踪 ID(便于事后 ES 检索)

curl 示例

1. 推送单条原始日志
curl -X POST http://localhost:8086/api/v1/log/push \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "ak_app-nginx_a1b2c3d4",
    "logs": [
      {
        "@timestamp": "2026-05-18T10:30:00Z",
        "message": "GET /api/users 200 125ms",
        "level": "INFO"
      }
    ]
  }'
2. 批量推送多条日志
curl -X POST http://localhost:8086/api/v1/log/push \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "ak_app-nginx_a1b2c3d4",
    "logs": [
      {
        "@timestamp": "2026-05-18T10:30:01Z",
        "message": "192.168.1.1 - GET /index.html 200 1234",
        "level": "INFO",
        "host": "web-01"
      },
      {
        "@timestamp": "2026-05-18T10:30:02Z",
        "message": "192.168.1.2 - POST /api/login 401 56",
        "level": "WARN",
        "host": "web-01"
      },
      {
        "@timestamp": "2026-05-18T10:30:03Z",
        "message": "Connection refused: database unreachable",
        "level": "ERROR",
        "host": "web-01",
        "service": "user-service"
      }
    ]
  }'
3. 推送结构化 JSON 日志(Java / Go / Python 应用)
curl -X POST http://localhost:8086/api/v1/log/push \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "ak_app-backend_b5c6d7e8",
    "logs": [
      {
        "@timestamp": "2026-05-18T10:31:00Z",
        "level": "ERROR",
        "logger": "com.example.UserService",
        "message": "Failed to save user",
        "thread": "http-nio-8080-exec-3",
        "traceId": "abc123def456",
        "userId": 1001,
        "exception": "java.sql.SQLException: Timeout waiting for connection from pool"
      }
    ]
  }'
4. 推送 Nginx 访问日志(格式化为 JSON)
# 假设 Nginx 配置了 JSON 格式日志
curl -X POST http://localhost:8086/api/v1/log/push \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "ak_app-nginx_a1b2c3d4",
    "logs": [
      {
        "@timestamp": "2026-05-18T10:32:00+08:00",
        "remote_addr": "1.2.3.4",
        "request": "GET /api/v1/users HTTP/1.1",
        "status": 200,
        "body_bytes_sent": 1234,
        "request_time": 0.125,
        "http_user_agent": "Mozilla/5.0",
        "http_referer": "https://example.com"
      }
    ]
  }'
5. 返回示例
{
  "code": 0,
  "msg": "success",
  "data": {
    "count": 3
  }
}

Shell 脚本持续推送示例

#!/bin/bash
# 实时推送应用日志到 LCA
API_URL="http://localhost:8086/api/v1/log/push"
API_KEY="ak_app-backend_b5c6d7e8"
LOG_FILE="/var/log/app/app.log"

tail -F "$LOG_FILE" | while IFS= read -r line; do
  TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
  curl -s -X POST "$API_URL" \
    -H "Content-Type: application/json" \
    -d "{\"api_key\":\"$API_KEY\",\"logs\":[{\"@timestamp\":\"$TIMESTAMP\",\"message\":$(echo "$line" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().strip()))')}]}" \
    > /dev/null
done

Python 集成示例

import requests
import json
from datetime import datetime, timezone

LCA_URL = "http://localhost:8086/api/v1/log/push"
API_KEY = "ak_app-backend_b5c6d7e8"

def push_log(level: str, message: str, **extra):
    payload = {
        "api_key": API_KEY,
        "logs": [{
            "@timestamp": datetime.now(timezone.utc).isoformat(),
            "level": level,
            "message": message,
            **extra
        }]
    }
    try:
        resp = requests.post(LCA_URL, json=payload, timeout=5)
        return resp.json()
    except Exception as e:
        print(f"[LCA] push failed: {e}")

# 使用示例
push_log("INFO", "User login successful", user_id=1001, ip="1.2.3.4")
push_log("ERROR", "Database connection failed", service="user-service", retry=3)

Logstash 对接示例

在 Logstash pipeline 中使用 http output 直接将日志推送到 LCA:

output {
  http {
    url    => "http://localhost:8086/api/v1/log/push"
    format => "json"
    http_method => "post"
    mapping => {
      "api_key" => "ak_app-nginx_a1b2c3d4"
      "logs" => ["%{[@metadata][event]}"]
    }
  }
}

AI 智能告警

在「日志管理 → 日志库」列表页开启「AI 智能告警」开关,点击「配置」进行设置。

配置参数说明

参数 说明 示例
扫描间隔 多少分钟扫描一次 5
ERROR 阈值 近期 ERROR/FATAL 数量超过此值触发告警 10
关键词 命中任意关键词超过 5 次也触发告警 OOM、Connection refused
LLM 提供商 openai / deepseek / qwen / ollama deepseek
LLM API Key 大模型 API 密钥 sk-xxx
LLM Base URL API 地址(OpenAI 兼容格式) https://api.deepseek.com/v1
静默期 同一日志库告警后多少分钟内不再重复告警 60
通知渠道 企业微信 / 钉钉 / 邮件 / Webhook 见下表

通知渠道配置

渠道 需要的参数
企业微信机器人 Webhook URL
钉钉机器人 Webhook URL
邮件 SMTP服务器、端口、账号、密码、收件人
自定义 Webhook Webhook URL

邮件配置说明:

  • QQ邮箱:smtp.qq.com,端口 465(SSL),密码为授权码
  • 163邮箱:smtp.163.com,端口 465(SSL)
  • Gmail:smtp.gmail.com,端口 587(STARTTLS)

支持的大模型

提供商 API Base URL 推荐模型
DeepSeek https://api.deepseek.com/v1 deepseek-chat
阿里通义千问 https://dashscope.aliyuncs.com/compatible-mode/v1 qwen-plus
OpenAI https://api.openai.com/v1 gpt-4o-mini
Ollama(本地) http://localhost:11434/v1 llama3

Agent 离线通知

当 Agent 超过 3 分钟没有心跳时,系统会:

  1. 自动将 Agent 状态标记为离线
  2. 在「告警历史」中写入告警记录
  3. 发送邮件通知给超级管理员(admin 账号)

前提条件:

  • 超级管理员在「个人中心」填写了邮箱
  • 在任意一个日志库的 AI 告警中已配置了邮件(SMTP)通知渠道

授权码

本系统使用 RSA 机器指纹绑定授权机制,防止授权码跨机器使用。

激活步骤

  1. 部署并启动 admin 服务后,进入「系统设置 → 授权管理」
  2. 页面显示当前机器的指纹码(基于 CPU 序列号、MAC 地址等生成)
  3. 前往 lca.top 购买授权码,提交机器指纹
  4. 将收到的授权码粘贴到激活框,点击「激活」
  5. 激活成功后系统功能全部解锁

版本说明

版本 适用场景 授权码
Community 个人非商业用途,部分功能受限 免费申请
Professional 商业用途,单机部署 付费购买
Enterprise 商业用途,多机部署 + 优先技术支持 联系商务

购买地址:https://lca.top · 商务咨询:13925090458


项目结构

log-collect-ai-analytics/
├── cmd/                        # 各服务可执行入口
│   ├── admin/                  # 管理后台服务
│   ├── apiserver/              # 日志接入服务(HTTP Push)
│   ├── logcollect/             # Linux/macOS 采集 Agent
│   ├── logcollect_win/         # Windows 采集 Agent
│   ├── logtransfer/            # Kafka → Elasticsearch 传输服务
│   └── syslog/                 # Syslog 接收服务(UDP 514)
├── configs/                    # 配置文件
│   ├── admin.yaml              # 管理后台配置
│   ├── apiserver.yaml          # 日志接入服务配置
│   ├── logtransfer.yaml        # 传输服务配置
│   ├── logcollect.yaml         # Agent 配置
│   └── rbac_model.conf         # Casbin RBAC 模型定义
├── deploy/                     # Docker 构建文件
│   ├── Dockerfile              # 后端镜像
│   ├── Dockerfile.web          # 前端镜像
│   ├── nginx.conf              # Nginx 反向代理配置
│   └── ha/                     # 高可用部署配置
│       ├── nginx-ha.conf       # Nginx 负载均衡配置
│       ├── sentinel.conf       # Redis Sentinel 配置
│       ├── mysql-master.cnf    # MySQL 主库配置
│       └── mysql-slave.cnf     # MySQL 从库配置
├── internal/
│   ├── handler/                # HTTP 处理器(各业务模块)
│   ├── middleware/             # 中间件(JWT / RBAC / License / 审计日志)
│   ├── model/                  # GORM 数据模型
│   ├── pkg/                    # 公共包(ES / Kafka / Redis / Config / Logger)
│   └── service/                # 业务服务
│       ├── ai_alert_scanner.go         # AI 告警规则扫描
│       ├── ai_alert_notifier.go        # 多渠道通知发送
│       ├── ai_alert_llm.go             # 大模型调用
│       ├── ai_alert_scheduler.go       # 定时调度器
│       └── agent_offline_notifier.go   # Agent 离线检测 & 邮件通知
├── keys/                       # RSA 公钥(私钥不入库!)
├── scripts/
│   ├── init-ha.sh             # HA 基础设施初始化脚本
│   └── start.sh                # 一键启动脚本
├── web/                        # Vue 3 前端工程
│   ├── src/
│   │   ├── api/                # 后端 API 封装
│   │   ├── views/              # 页面组件
│   │   │   ├── log/            # 日志管理(日志库、日志查询、告警历史)
│   │   │   ├── collect/        # 采集任务管理、Agent 管理
│   │   │   ├── monitor/        # 系统监控(登录日志、操作日志、在线用户)
│   │   │   ├── permission/     # 权限管理
│   │   │   ├── backup/         # 备份管理
│   │   │   └── dashboard/      # 首页统计
│   │   └── layouts/            # 主布局
│   └── dist/                   # 构建产物(由 admin 服务托管)
└── docker-compose.ha.yaml      # 高可用部署编排

故障排查

使用 trace_id 定位问题(推荐)

所有走 /api/v1/log/push 的请求会获得一个全链路 trace_id,同一条日志在 4 个组件中均可以该 ID 串联。出问题时,只需拿到 trace_id 后依次类似以下检索:

TRACE=<响应中返回的 trace_id>

# 1) apiserver 是否接收并写入 Kafka
docker logs lca-apiserver1 lca-apiserver2 2>&1 | grep "trace=$TRACE"
# 期望:recv push → api_key OK → kafka write OK

# 2) logtransfer 是否从 Kafka 拉到并写入 ES
docker logs lca-logtransfer 2>&1 | grep "trace=$TRACE"
# 期望:fetch → flush start → flush OK

# 3) ES 是否落库(索引名以 logtransfer “flush OK” 日志中输出为准)
curl -sS "http://localhost:9200/<真实索引名>/_search?q=_trace_id:$TRACE&pretty"

进一步按初步表现决定排查方向:

初步表现 可能原因
apiserver 不出 trace 日志 nginx 未调到该 apiserver / agent 未推到服务端
apiserver 有、logtransfer 无 Kafka topic / partition 未分配、consumer group 未 join(查 kafka-consumer-groups.sh --describe
logtransfer 出 fetch 但无 flush OK ES 连接问题、index 写入被拒
logtransfer flush OK 但 ES 查不到 查询索引名拼错(以“flush OK index=...”日志为准)

Kafka HA 集群 Group Coordinator Not Available

现象:consumer 反复报 [15] Group Coordinator Not Available__consumer_offsets 不存在。

原因:Kafka 默认 offsets.topic.replication.factor=1,与 min.insync.replicas=2 冲突,__consumer_offsets 创建后不可写。

修复:docker-compose.ha.yaml 中 3 个 Kafka broker 均需加上:

KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2

修改后 docker compose -f docker-compose.ha.yaml up -d --force-recreate kafka1 kafka2 kafka3

镜像代码不生效

deploy/Dockerfile 采用 COPY release/bin/${APP_NAME} ./server二进制嵌入镜像。重新编译后必须:

docker compose -f docker-compose.ha.yaml build --no-cache <service>
docker compose -f docker-compose.ha.yaml up -d --force-recreate <service>

单纯 up -d --force-recreate 不会重新打包镜像。


更新日志

v1.3.1

  • 新增全链路 trace_id 追踪:agent → apiserver → Kafka → logtransfer → ES 同一条日志共享一个 X-Trace-Id,后续问题定位只需提供该 ID
  • HTTP 响应体 / Header / Kafka Header / ES _trace_id 字段多点透传
  • 修复 Kafka HA 集群 __consumer_offsets 创建失败问题(OFFSETS_TOPIC_REPLICATION_FACTORMIN_INSYNC_REPLICAS 匹配)
  • kafka-go Reader 统一接入 ErrorLogger,group join / sync 错误不再静默吃掉
  • logtransfer flush 日志从 debug 升为 info,默认可见

v1.3.0

  • 新增高可用(HA)部署模式:Redis Sentinel 自动故障转移、MySQL 主从读写分离、Kafka 3 Broker 集群、ES 3 节点集群
  • 新增分布式锁(Redis SETNX + Lua),保障多实例下定时任务互斥执行
  • 新增 Leader Election 机制,AI 告警调度器、Agent 离线检测自动主备切换
  • 新增 Casbin 策略多实例同步(Redis Pub/Sub),权限变更实时生效
  • 新增 Nginx 负载均衡配置,upstream 健康检查 + 故障自动转发
  • 新增一键 HA 初始化脚本(scripts/init-ha.sh

v1.2.0

  • 新增「告警历史」列表页,统一展示 AI 告警 + Agent 离线告警记录
  • 新增 Agent 离线自动检测,3 分钟超时标记离线并邮件通知管理员
  • 告警历史支持按日志库 / 严重程度 / 状态过滤、单条删除、批量清空

v1.1.0

  • 新增 AI 智能告警(ES 规则初筛 + 大模型深度分析)
  • 支持企业微信 / 钉钉 / 邮件(SSL 465 / STARTTLS 587)/ Webhook 多渠道通知
  • 告警静默期配置,防止告警风暴

v1.0.0

  • 日志采集 Agent(Linux/Windows),断点续传,60 秒动态拉取任务
  • 日志库管理、采集任务管理
  • 类 Kibana 日志查询界面(时间直方图 + 字段面板 + KQL)
  • API 直接推送(任意应用 HTTP 接入,无需 Agent)
  • RBAC 权限管理(部门 / 岗位 / 角色 / 菜单)
  • ES 快照备份管理(阿里云 OSS)
  • RSA 机器指纹 License 授权码机制

Copyright © 2024-2026 LCA Software. All Rights Reserved.

官网 · 购买授权 · 联系我们

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐