# 喵坤日志排查工具 **Repository Path**: lorock/miaokun-log ## Basic Information - **Project Name**: 喵坤日志排查工具 - **Description**: 喵坤日志排查工具,轻量级、高性能日志检索与故障定位工具,支持 Java/Go/Python/Node.js 等多语言日志格式,命令行+Web 双端可用,百G大文件秒级响应,让线上排障快人一步。 - **Primary Language**: Go - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-06-05 - **Last Updated**: 2026-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

喵坤® Logo

# 🐾 喵坤® (MiaoKun) **喵坤®在手,效率全有** 为开发者与运维人打造的轻量生产力工具品牌,专注解决技术人日常工作中的高频痛点。坚持「单文件、零依赖、开箱即用」的设计理念,拒绝复杂部署与冗余功能,让工具回归实用本质。 **喵坤®日志排查工具** 轻量级、高性能日志检索与故障定位工具,支持 Java/Go/Python/Node.js 等多语言日志格式,命令行+Web 双端可用,百G大文件秒级响应,让线上排障快人一步。 --- ## 核心优势 | 特性 | 价值 | |------|------| | 🚀 **极速搜索** | 基于 ripgrep 引擎,比传统 grep 快 5-10 倍,百G文件秒级响应 | | 💨 **流式处理** | 实时输出,内存零溢出,轻松处理 100G+ 超大日志 | | 🎨 **双端交互** | 命令行高效操作 + Web 可视化界面 | | 📦 **零依赖部署** | 单二进制交付,前端资源内嵌 | | 🧠 **智能缓存** | 自动解压并缓存 .gz 压缩日志 | | 🔗 **全链路追踪** | 自动提取 traceId,跨文件追踪完整调用链 | | ⏰ **精准过滤** | 时间窗口、日志级别、正则表达式多维度筛选 | | 🔧 **灵活扩展** | 模块化架构,内置 jq 解析器 | | 🔐 **多用户认证** | JWT + 多用户 + 角色权限 + SQLite 持久化,Docker 默认启用 | | 📡 **实时跟踪** | 类 tail -f 实时跟随(基于成熟开源库),支持多文件合并流、logrotate 自动重开、异常多行合并 | | 🔭 **Loki 数据源** | 接入 Grafana Loki 作为远程日志数据源,Go 后端封装 + 前端一键切换,本地功能零改动保留 | --- ## 适用场景 **适合人群** - 后端开发者:快速定位代码异常与接口报错 - DevOps/SRE 工程师:生产环境日志排查与故障溯源 - 测试工程师:自动化测试日志分析与问题复现 - 所有需要频繁处理日志的技术人员 **不适用场景** - 需要复杂日志可视化分析(推荐 ELK/Graylog) - 实时告警触发与监控(推荐 Prometheus/Grafana) - PB 级海量日志聚合分析(推荐专业大数据平台) --- ## 快速开始 ### 前置依赖 ```bash # macOS brew install ripgrep # Ubuntu/Debian sudo apt install ripgrep # CentOS/RHEL sudo yum install ripgrep # 其他系统:https://github.com/BurntSushi/ripgrep#installation ``` ### 安装方式 ```bash # 方式1:源码安装 git clone https://gitee.com/lorock/miaokun-log.git cd miaokun-log make install # 方式2:脚本安装 ./scripts/install.sh ``` ### 30秒上手 ```bash # 1. 列出默认路径下的日志文件 mk list # 2. 搜索最近1天的 ERROR 日志 mk search "ERROR" --since 1 --level ERROR # 3. 按 traceId 追踪完整调用链 mk trace abc123def456 # 4. 启动 Web 可视化服务(默认端口 9528) mk serve ``` --- ## 命令详解 ### 全局选项 ```bash --no-banner # 不显示启动 banner --no-color # 禁用彩色输出 --json # 输出 JSON 格式 --jq 'xxx' # 内置 jq 查询(配合 --json 使用) --config # 指定自定义配置文件(默认:$HOME/.miaokun-log.yaml) ``` ### list - 列出日志文件 ```bash mk list # 列出默认路径日志 mk list /var/log/app # 指定目录扫描 mk list --since 7 # 仅显示最近7天的文件 ``` ### search - 日志搜索(别名:grep) ```bash # 基础搜索 mk search "NullPointerException" # 搜索关键词 mk search "WARN" /var/log/app # 指定目录 # 高级过滤 mk search "ERROR" --since 1 # 最近1天 mk search "." --level ERROR # 指定级别 mk search "error" -i # 大小写不敏感 mk search "ERROR" --from "2026-06-01 10:00" --to "2026-06-01 12:00" # 精确时间 # 结果增强 mk search "ERROR" -B 2 -A 2 # 显示上下文 mk search "ERROR" --stats # 统计信息 mk search "ERROR" --count # 仅显示行数 mk search "ERROR" --json --jq '.[].message' # 提取 JSON 字段 ``` ### trace - TraceId 全链路追踪 自动跨文件聚合同一 traceId 的所有日志,还原完整调用流程。 ```bash mk trace abc123def456 # 全局追踪 mk trace 7a8b9c0d1e2f3a4b5c6d /var/log/app # 指定目录 mk trace ABC123DEF -i # 大小写不敏感 ``` ### stats - 日志统计分析 ```bash mk stats # 统计默认路径 mk stats /var/log/app # 指定目录 mk stats --since 7 # 最近7天 ``` ### serve - 启动 Web 可视化服务 前端资源已内嵌二进制文件,单端口统一提供 API 与静态资源服务。 ```bash mk serve # 启动服务(默认端口 9528) mk serve --port 8080 # 自定义端口 mk serve --auth=true # 启用认证(也可在配置文件设置) mk serve --auth=false # 禁用认证 mk serve --admin-password=xxx # 指定 admin 初始密码(首次启动生效) mk serve --auth-db=/path/auth.db # 指定 SQLite 路径 mk serve -v # 显示 API 请求日志 mk serve -vv # 调试模式 ``` ### 本地验证(实时跟踪 / tail -f) 启动服务后,可用两种方式验证实时跟随: **方式 A:curl 直连 SSE(最快,无需构建前端)** ```bash mk serve --auth=false --port 9528 # 等健康检查通过 printf '2026-07-20 01:00:00 INFO old 1\n' > /tmp/demo.log # 终端 A:订阅实时流(macOS 务必加 poll:true 与 --noproxy) curl -sN --noproxy '*' -X POST http://localhost:9528/api/v1/tail/stream \ -H "Content-Type: application/json" \ -d '{"files":["/tmp/demo.log"],"back_lines":2,"poll":true}' # 终端 B:追加新行 → 终端 A 即时出现 match 事件 echo "2026-07-20 01:05:00 ERROR boom" >> /tmp/demo.log ``` **方式 B:浏览器真实体验** ```bash cd web && npm run build # 刷新 web/dist(或 make build 让二进制内嵌前端) mk serve --auth=false --port 9528 # 打开 http://localhost:9528 → 📡 实时跟踪 Tab → 选文件 → 开始跟踪 → 另开终端追加行 ``` > ⚠️ **macOS 本地调试建议开启轮询模式**:本机若在 macOS 上用浏览器或 curl 验证实时跟踪,因 `hpcloud/tail` 在 macOS(kqueue)下 `NOTE_WRITE` 仅可靠触发首次写入,可能只收到「开始跟踪后第一条」新日志,后续追加行会丢失。**请在实时跟踪面板的「轮询模式」开关打开(或 curl 加 `"poll":true`)** 即可稳定接收全部新增行。生产环境为 Linux(inotify),默认关闭轮询即可,无需手动开启。 > > 另:若本机设置了 `http_proxy`,curl 验证时务必加 `--noproxy '*'`(或 `NO_PROXY=localhost`),否则 SSE 流会被代理缓冲吞掉;浏览器不受此影响。 ### Docker 部署 ```bash # 一键启动全套(NATS + Ingest + Serve) docker compose up -d # 查看服务状态 docker compose ps # 查看日志 docker compose logs -f mk-serve # 停止 docker compose down # 重建镜像(更新代码后必须 --no-cache,因为 Dockerfile 在容器内构建前端) docker compose build --no-cache mk-serve ``` **默认凭据**(Docker 镜像默认启用认证): - 用户名:`admin` - 密码:`miaokun-admin` - ⚠️ 首次登录后请在「👤 个人中心」修改密码 认证数据库持久化在 `mk-auth` 卷(`/var/lib/miaokun/auth.db`),重启不丢失密码。 **Web 界面功能** - 实时日志搜索(支持正则表达式) - 搜索摘要工具栏(匹配数、文件数、ERROR/WARN、耗时、扫描进度) - 结果内搜索(Ctrl+F,高亮 + 键盘导航) - 搜索历史(localStorage 持久化,点击快捷填充,保存完整筛选参数) - 导出功能(TXT / JSON / CSV / Markdown 四种格式) - 复制功能(复制全部 + 悬停复制单条) - 按日志级别一键过滤 - 精确时间范围筛选与多目录切换 - TraceId 跨文件全链路追踪 - 搜索结果自动高亮(关键词紫色高亮) - 文件浏览功能(支持目录导航,面包屑路径返回) - 上下文行显示/隐藏控制(默认前 3 / 后 5,仅限关键词所在文件) - JSON 格式化显示(自动识别并美化) - 长日志折叠(超过 500 字符自动折叠,动态行高计算) - 时间戳识别显示(可点击跳转) - 时间戳跳转(日期选择器 + 首条/±10分钟/末条 快捷按钮) - 文件分组可折叠 - 动态虚拟滚动(基于内容字符数动态计算高度,ResizeObserver 监控容器) - 「滚动到最新」悬浮按钮,快速定位最新日志 - 键盘快捷键(Ctrl+F 搜索、Ctrl+G 下一个、Esc 清空) - 流式搜索进度指示(扫描中 X/Y 绿色脉冲徽章) - 空状态三态区分(加载中 / 无结果 / 未开始) - 登录认证(JWT Token + Refresh Token,自动刷新,401 中文友好提示) - 多用户 + 角色权限(admin/user/viewer,权限矩阵可扩展) - 用户中心(👤 个人中心:查看个人信息、修改密码,改密成功自动登出) - 用户管理(⚙️ admin 专属:创建/删除用户、重置密码、修改角色) - 认证可配置(配置文件 `auth.enabled` 控制,Docker 默认启用,本地默认关闭) - 实时跟踪(📡 独立 Tab:选日志源/目录、正则过滤、初始行数、轮询开关;合并多文件流 + 多文件子标签 + 文件色标 + 仅看某文件;切到搜索时自动暂停保留、切回自动恢复;logrotate 自动重开;后端带 500ms 安全网轮询兜底,确保增量不丢) - Loki 数据源(🔭 Header 分段控件一键切换:结构化表单自动映射 LogQL + 高级区「原始 LogQL」专家模式 + 实时跟踪 query_range 轮询;本地/远程双数据源并存,前端组件完全复用) - 空目录友好提示(非空模态框消失) - 搜索结果内存溢出防护(上限 50000 条,超限自动丢弃最早部分) - XSS 安全防护(用户输入文本渲染前 HTML 转义) **核心 API** | 接口 | 用途 | 认证 | |------|------|------| | GET /api/v1/health | 健康检查 | 公开 | | GET /api/v1/version | 获取版本号 | 公开 | | GET /api/v1/auth/config | 查询认证是否启用(前端决定是否显示登录页) | 公开 | | POST /api/v1/auth/login | 用户登录(返回 JWT Token) | 公开 | | POST /api/v1/auth/refresh | 刷新 Token(401 自动刷新失败后才登出) | 公开 | | POST /api/v1/auth/logout | 用户登出 | 公开 | | GET /api/v1/auth/me | 获取当前用户信息 | ✅ | | POST /api/v1/auth/change-password | 修改自己的密码 | ✅ | | GET /api/v1/auth/users | 用户列表(admin) | ✅ admin | | POST /api/v1/auth/users | 创建用户(admin) | ✅ admin | | DELETE /api/v1/auth/users/{id} | 删除用户(admin) | ✅ admin | | POST /api/v1/auth/users/{id}/reset-password | 重置密码(admin) | ✅ admin | | PUT /api/v1/auth/users/{id}/roles | 修改角色(admin) | ✅ admin | | GET /api/v1/files | 获取日志文件列表 | ✅ | | GET /api/v1/files/list | 文件浏览(支持目录导航 + 分页,空目录返回 data: []) | ✅ | | POST /api/v1/search/stream | SSE 流式搜索 | ✅ | | POST /api/v1/tail/stream | 实时跟踪(tail -f,SSE 持续推送新增行,支持多文件 / 正则过滤 / from_start) | ✅ | | POST /api/v1/search | 同步搜索(返回 JSON 数组) | ✅ | | POST /api/v1/cluster | 异常聚类(按堆栈签名归并 Top N) | ✅ | | GET /api/v1/sources | 获取来源(node/app/type 三维筛选,支持 Loki 标签采样) | ✅ | | POST /api/v1/trace | TraceId 全链路追踪 | ✅ | | POST /api/v1/stats | 日志级别与文件分布统计 | ✅ | | POST /api/v1/ingest | HTTP 日志接收(单条/数组,可选 Token) | 公开 | **API 响应格式约定** - 成功: `{ "success": true, "data": [...], "pagination": {...} }` - 失败: `{ "success": false, "error": { "code": "ERROR_CODE", "message": "中文错误描述" } }` - **重要**: `data` 字段为空时返回 `[]`(空数组),**绝不返回 `null`**,避免前端 `v-if` 条件判断异常 - 所有错误信息均为**中文**(如「请先登录后再操作」、「您没有执行此操作的权限」等) --- ## 配置说明 配置文件路径:`$HOME/.miaokun-log.yaml`(**注意文件名带前导点 `.`**,与 `--config` 帮助文案一致),可通过 `--config` 指定自定义路径。未显式传 `--config` 时自动在 `$HOME/.config`、`$HOME`、工作目录下查找此文件。 ```yaml # 日志搜索根目录 default_paths: - /var/log - /opt/logs - /var/log/app # 搜索时间范围(天) since_days: 7 # 缓存目录(自动解压 .gz 日志) cache_dir: /tmp/miaokun-cache # 认证配置(可选,默认关闭) auth: enabled: false # 是否启用认证 jwt_secret: "your-secret-here" # JWT 签名密钥(至少 16 字符) access_token_ttl: "24h" # 访问令牌有效期 refresh_token_ttl: "168h" # 刷新令牌有效期(默认 7 天) db_path: "/var/lib/miaokun/auth.db" # SQLite 数据库路径(用户/密码持久化) # 首次启动初始化用户(表为空时生效,已有用户时忽略——保留运行时改过的密码) initial_users: - username: admin password: change-me-now # 首次登录后请立即修改 roles: [admin] ``` **认证机制说明**: - 采用**混合存储方案**:配置文件 `initial_users` 仅在 SQLite 表为空时初始化,之后密码以 SQLite 为准 - 用户在 UI 修改密码后,容器重启不会丢失(SQLite 持久化,配合 Docker 卷 `mk-auth`) - 角色体系:`admin`(全部权限)/ `user`(搜索+查看)/ `viewer`(只读),支持扩展 - 命令行 flag 可覆盖配置:`mk serve --auth=true --admin-password=xxx --auth-db=/path/auth.db` 示例配置:`.miaokun-log.example.yaml` ### 接入 Loki 数据源(可选) 除本地文件外,Miaokun 还支持把 **Loki** 作为数据源,后端用 Go 封装 Loki HTTP API,前端组件完全复用(搜索 / 实时跟踪 / 聚类 / 来源筛选零改动)。 ```yaml # 全局默认数据源:local(默认)或 loki;前端也可在「📁本地 / 🔭Loki」控件逐会话切换 datasource: local loki: base_url: http://localhost:3100 # Loki HTTP API 地址 tenant: "" # 可选 X-Scope-OrgID(多租户) username: "" # 可选 Basic Auth password: "" poll_interval_seconds: 2 # 实时跟踪轮询间隔(秒) ``` - 前端顶部「📁本地 / 🔭Loki」分段控件切换数据源;切换即重新拉取来源、刷新搜索。 - Loki 模式:结构化表单自动映射为 LogQL(级别→标签、关键词→行过滤器、来源→app/node 标签);高级区可展开「原始 LogQL」直接粘贴查询。 - 实时跟踪在 Loki 模式下以**轮询 `query_range`** 实现(非 WebSocket),跨平台稳定。 - 环境变量覆盖:`MIAOKUN_DATASOURCE` / `MIAOKUN_LOKI_URL` / `MIAOKUN_LOKI_TENANT` / `MIAOKUN_LOKI_USERNAME` / `MIAOKUN_LOKI_PASSWORD` / `MIAOKUN_LOKI_POLL_INTERVAL`。 --- ## 项目结构 ``` miaokun-log/ ├── cmd/mk/ # 主程序入口(serve / ingest 子命令) ├── internal/ # 核心业务逻辑 │ ├── auth/ # 认证模块(JWT + 多用户 + 角色 + SQLite 存储) │ │ ├── jwt.go # JWT 管理 + AuthConfig + 角色权限矩阵 │ │ ├── handlers.go # HTTP 处理器(登录/登出/改密/用户 CRUD) │ │ ├── store_sqlite.go # SQLite 用户存储(modernc.org/sqlite,纯 Go 无 cgo) │ │ ├── store_memory.go # 内存用户存储(测试用) │ │ └── store_sqlite_test.go │ ├── config/ # 配置管理(含 auth 段) │ ├── discover/ # 日志文件发现 │ ├── cache/ # 压缩文件缓存 │ ├── parser/ # 日志格式解析(JSON/logback/log4j2/JUL/纯文本) │ ├── searcher/ # 流式搜索核心(解析接入 + 字段过滤 + 多机筛选) │ ├── server/ # HTTP 服务器(路由 + 优雅关闭 + 前端嵌入) │ ├── ingest/ # 多机日志采集(NATS JetStream + HTTP 接收) │ ├── timefilter/ # 时间过滤 │ └── trace/ # TraceId 链路追踪 ├── pkg/types/ # 公共类型定义(LogMatch、SearchRequest 等) ├── web/ # 前端代码(Vue3 + Vite + Element Plus) │ ├── src/ │ │ ├── components/ # Vue 组件(LogRowCard、UserCenter、UserManagement 等) │ │ ├── composables/ # 组合式函数(useAuth、useLogStream、useFileList) │ │ ├── types/ # TypeScript 类型(auth.ts、index.ts) │ │ └── utils/ # 工具函数(logContent.ts) │ └── dist/ # 构建产物(内嵌到 Go 二进制) ├── deploy/docker/ # Docker 配置(miaokun-log.yaml) ├── scripts/ # 辅助脚本(e2e 测试、Docker 重建、NATS 发布) ├── Dockerfile # 多阶段构建(node 编译前端 + debian-slim 运行) ├── docker-compose.yml # 编排(mk-nats / mk-ingest / mk-serve) └── Makefile # 编译构建规则 ``` --- ## 品牌理念 - **轻量至上**:单二进制文件,无运行时依赖 - **性能优先**:高性能引擎,极致响应速度与资源效率 - **开箱即用**:默认配置覆盖绝大多数场景 - **持续进化**:围绕技术人工作流,打造一站式生产力工具箱 --- ## 更多资源 - 📖 [CHANGELOG.md](./CHANGELOG.md) - 🐛 [Gitee Issues](https://gitee.com/lorock/miaokun-log/issues) - 📦 [Gitee Releases](https://gitee.com/lorock/miaokun-log/releases) - 💬 加入微信群/QQ群获取技术支持 --- ## 知识产权 **商标信息** 喵坤® 已获得中华人民共和国国家知识产权局商标注册证(第78682220号),核定使用商品/服务项目(国际分类:9),有效期至2034年11月06日。 **版权信息** 喵坤Logo作品已获得中华人民共和国国家版权局著作权登记(国作登字-2024-F-00181372),著作权人:徐保金,创作完成日期:2024年05月07日。 --- **喵坤®,让技术人的工作更轻松** ## 📜 许可证 本项目采用 MIT 开源协议。详见 [LICENSE](LICENSE) 文件。