
简介这款开源日志查看工具名为Vigilog面向IT运维与开发人员提供即时过滤、颜色分级显示可在多操作系统上运行帮助用户从海量日志中快速定位关键信息也能用于日常系统监控与日志审计。压缩包共21个文件包含20个JAR程序包与1个XML配置文件大小仅5.63MB除主程序外还附带源码包、开发文档以及运行所需的常用依赖库便于离线学习和直接部署。目前已有52人学习下载。借助附带的源码与文档开发人员可以了解日志展示、过滤器机制和跨平台界面设计普通使用者则能快速掌握即时过滤、颜色标记等操作减少手动逐行翻找的时间提升日志检索与故障排查效率。开源许可允许自由修改和二次分发为个人定制及项目集成保留了较大空间。 “Vigilog”这个名字第一次看到的时候我就觉得有点意思Vigi——Vigilance警戒Log——日志合在一起就是一套“带着警戒心的日志系统”。这两年日志监控类的开源项目不少但大多数要么重比如全家桶方案要么轻到只剩一个采集器真正能开箱即用、还愿意把源码摊开的项目并不多。Vigilog 的出现算是把“日志采集、聚合、检索、告警”这条链路用一套相对轻量的方式串了起来而且从仓库到文档都走的是开源路线。这篇文章就围绕 Vigilog 这个项目聊一聊它的定位、核心设计、实操接入步骤以及我实际部署过程中踩过的一些比较隐蔽的坑。如果你正打算搭建一套内部日志系统又不想一上来就导入动辄几十个组件的重型方案这篇文章应该能帮你少走不少弯路。1. 项目定位与整体设计思路1.1 Vigilog 到底解决了什么问题先说结论Vigilog 面向的是“中等规模、希望以较低成本获得完整日志可观测性”的团队。这里的“中等规模”指的是单集群日增日志量在几十 GB 到几 TB 之间节点数量几十到几百台。这个区间很尴尬——日志量说大不大说小不小商业方案太贵自己从零造轮子又太费时间。Vigilog 存在的意义就是把这个区间内的需求用开源方式接住。它在功能上覆盖了三层采集提供多语言 SDK 和 Agent支持应用日志、系统日志的实时采集存储与检索内置时序索引和全文检索引擎不需要额外依赖 ES 或 ClickHouse告警与分析支持基于日志内容的规则告警、统计告警以及简单的可视化面板。如果你用过 ELK 或者 Loki可以把 Vigilog 理解成一个更紧凑的替代品它不需要你单独部署 Kafka、Logstash、Elasticsearch、Kibana 四件套单进程就能同时扮演“管道 存储 查询”的角色。部署成本从“搭一套分布式系统”降到了“跑一个服务”这对很多团队来说是非常实际的吸引力。1.2 架构与模块划分单进程也能撑起整个链路我自己看开源项目有个习惯第一件事就是翻目录结构。Vigilog 的源码结构清晰得有点不像一个新兴项目核心模块大致是这么分的vigilog/ ├── collector/ # 采集端 SDK 与 Agent负责日志收取和上报 ├── server/ # 主服务包含接收端、索引器、存储管理器、查询引擎 ├── rule-engine/ # 告警规则引擎独立拆分支持热更新 ├── console/ # Web 控制台负责检索、仪表盘、告警配置 └── common/ # 公共组件协议定义、工具类、编解码等这种划分的好处是你可以在部署架构上做灵活取舍规模小的时候把 server 和 console 部署在同一台机器上单机完事规模上来之后可以把 collector 单独拆出去部署到业务节点server 端做横向扩容通过 LB 接入即可。采集端和 server 之间走的是自定义的二进制协议不是裸 HTTP JSON这在大批量日志场景下能省下不少带宽和序列化开销。另一个值得留意的设计点是存储层。Vigilog 没有复用现成的开源存储引擎而是自己实现了支持倒排索引的列式存储写入路径上做了缓冲合并读取路径上做了谓词下推。这样选择的原因主要是为了减小对第三方组件的依赖让整个项目“一条命令就能跑起来”。代价是存储引擎目前的成熟度还需要更多的生产环境验证这一点大家在评估时需要心里有数。2. 核心功能拆解与技术实现要点2.1 采集端设计低侵入、高可靠、易扩展采集端是日志系统的“最后一公里”如果这里做不好后面存储和查询再强大都是空谈。Vigilog 的采集端设计有几处做得比较到位多语言 SDK官方提供了 Java、Go、Python 三种语言的 SDK覆盖了当前最主流的后端技术栈。GitHub 上也有人在提 Rust 和 Node.js 的 SDK 需求属于高频扩展点。异步批量上报SDK 内部先把日志写入内存缓冲队列再按批次默认 100 条或 1MB 大小合并发送避免每条日志都产生一次网络请求。这在高并发场景下对业务线程的阻塞非常小。本地落盘兜底当 server 端短暂不可用时采集端会把未发送成功的日志写到本地磁盘的 backup 目录等到网络恢复后再重新上报。这个机制说实话很多商业产品都不一定做得这么细致。我实际测试下来Java SDK 在普通服务上额外增加的内存开销大约在 30~60MB 左右CPU 占用基本可以忽略。对一个需要嵌入业务进程的组件来说这个侵入性控制得不错。在使用上唯一要注意的是如果业务本身对内存极其敏感可以通过降低缓冲队列长度来压缩内存占用代价是突发流量下丢日志的概率会上升。2.2 日志接收与索引写入路径的“缓冲合并”技巧server 端的接收模块是系统的第一道闸口。它在内存中维护着多个待写入队列每个队列对上一条业务链路下端连着一个批量写入处理器。写入处理器会按两个条件触发批量落地队列攒够 N 条记录或者距上批写入的时间超过 T 毫秒。这样设计的核心目的是把频繁的小 I/O 合并成低频的大 I/O显著降低磁盘压力。索引方面Vigilog 对日志内容的处理方式不是全字段建索引而是先通过配置把日志解析成结构化字段时间、级别、业务标识等对这些字段建列式索引原始日志全文则做分词后建倒排索引。这种混合索引策略在多数场景下的查询性能都比纯倒排或者纯列存要更均衡。有一个参数在索引阶段需要重点调index.max_text_length。默认值是 2048 字符超过这个长度的日志正文不会进入全文索引。这是为了防止有人把大段配置文件或堆栈异常全文打出来把索引空间直接打爆。要记住超长日志需要事后排查时可以从原始日志文件里找而不是强求索引系统为你保留一切。2.3 告警规则引擎让日志从“事后查”变为“实时报警”只有检索能力的日志系统本质上还是一本大字典需要人主动去翻。Vigilog 的告警规则引擎让日志数据从被动记录变成了主动信号。规则分三类关键字告警日志中出现“ERROR”“Exception”等特定关键词就触发阈值告警单位时间内某个错误码出现次数超过设定值就触发复合告警组合多个条件比如出现“连接超时”且同一 IP 在 5 分钟内触发超过 10 次。规则配置支持类 Cron 表达式来设定统计窗口也支持直接写类 SQL 的过滤语句。告警触发后的通知渠道支持 Webhook、邮件、钉钉/企微机器人。实际部署时我建议大家先从关键字告警入手把最明显的错误抓出来再慢慢迭代成更精确的阈值和复合规则。一开始就上复杂的复合规则很容易被告警风暴淹没。3. 部署与接入实操3.1 环境准备与快速启动Vigilog 的官方仓库提供了两种部署方式Docker Compose 和裸二进制部署。前者适合快速体验后者适合生产环境定制化部署。这里先讲 Docker Compose 方式。首先把项目源码拉下来进入仓库根目录git clone https://github.com/vigilog/vigilog.git cd vigilog根目录下有一个docker-compose.yml里面定义了server和console两个服务。在运行之前建议看一眼server.yml配置文件里面几个关键项server: listen: :7700 # 采集端上报使用的主端口 storage: retain_days: 7 # 日志保留天数 capacity_quota: 100 # 最大存储容量单位 GB index: shard_hours: 6 # 索引分片粒度按小时切分 max_text_length: 2048 batch: flush_size: 5000 flush_interval_ms: 2000其中retain_days和capacity_quota需要你根据磁盘大小来权衡。这里有个简单的估算公式单日预估日志量GB× 保留天数 所需存储空间假设你每天产生 40GB 日志想保留 7 天那至少需要 280GB 裸存储空间。索引和副本还会再吃掉一部分实际预留 400GB 比较稳妥。存储上限capacity_quota推荐设置为磁盘容量的 70% 左右留出余量给系统文件和日常运维操作。确认配置无误后直接执行docker compose up -d等容器状态显示 healthy 后打开http://服务器IP:7800就能看到控制台的登录页面。默认账号和密码在文档的 “Getting Started” 里有说明首次登录后第一件事就是改密码别偷懒。3.2 接入一个最常见的 Java 服务Vigilog 的 Java SDK 接入过程很简单如果你的项目是 Maven 构建在pom.xml中加入依赖dependency groupIdio.vigilog/groupId artifactIdvigilog-sdk-java/artifactId version1.0.2/version /dependency然后在应用启动阶段初始化客户端VigilogConfig config VigilogConfig.builder() .endpoint(http://your-server:7700) .appName(order-service) .addTag(env, prod) .bufferSize(4096) .build(); VigilogClient client new VigilogClient(config);接下来就可以在业务代码里上报日志了。Vigilog 并没有完全替代日志框架的意思你可以直接在业务逻辑中调用client.info()、client.error()也可以封装一个工具类对接已有的 SLF4J 接口。我实际工程里更推荐后者只在已有的日志门面上加一个自定义 Appender这样业务侧完全无感不需要改动任何打日志的代码。一个简单示例自定义一个 SLF4J Appender在append方法里把格式化后的日志转发给 Vigilog。Override protected void append(ILoggingEvent event) { String formatted event.getFormattedMessage(); MapString, String mdc event.getMDCPropertyMap(); client.info(formatted, mdc); }这种方式的核心收益是接入成本极低升级和缩容都不需要改业务代码。踩坑提醒千万在 Appender 中加上异步开关因为日志框架的append是同步调用的如果 Vigilog 客户端发送超时会直接拖慢你的业务请求。Vigilog 官方配置中有AsyncAppender的示例照着用即可。3.3 告警规则配置与验证告警规则的配置入口在控制台的“告警管理”页面。以最常用的“分钟级错误次数阈值告警”为例规则名称order-service ERROR 500过滤条件appName order-service AND level ERROR统计窗口1 分钟触发条件命中次数 10通知方式Webhook地址填内部通知服务的回调 URL配置好之后保存并启用。接下来我们模拟一批错误日志来验证for (int i 0; i 15; i) { client.error(mock error event i); }正常情况下一分钟后控制台的“告警记录”里会出现一条触发记录同时你配置的 Webhook 地址会收到一条 JSON 格式的通知。这里有一个容易忽略的细节规则统计是基于索引数据的而索引数据写入有 1~2 秒延迟所以通知到达时间一般会比日志上报时间晚 5~10 秒这是正常现象不是系统卡了。4. 常见踩坑与排查经验4.1 采集端内存占用过高如果你发现集成了 Vigilog SDK 的服务 RAM 占用异常上涨大概率是缓冲队列设置得太大了。默认配置下bufferSize是 8192 条消息如果你每条日志都是一大段 JSON积压时内存会非常可观。解决办法把bufferSize调到 1024~2048同时开启批量发送压缩enableCompression: true日志内容能压缩掉 60% 以上体积内存和带宽压力都会显著下降。4.2 检索不到刚上报的日志查日志经常会遇到“明明刚打了日志搜索就是查不到”的情况。原因有两个排查方向第一SDK 是异步批量上报不是实时发送默认可能攒了几百条才发一次所以刚写入的日志要过几秒才能查到。这是正常延迟可以通过降低flushThreshold配置来缩短。第二确认一下你搜索的时间范围是否正确。Vigilog 的查询接口默认只查最近 15 分钟的数据如果你在控制台选了“今天”这个范围还好但如果是通过 API 查询且没传时间参数很容易漏掉数据。4.3 告警风暴一条故障引发上百条通知规则引擎本身不判别告警依赖只要条件满足就会触达通知渠道。如果配置了“ERROR 关键字告警”半夜一个数据库连接池耗尽日志里几千条 ERROR 会在几分钟内连续触发几十条告警。这类问题的常用解法是设置“静默期”alert: coalesce: enabled: true window: 300 # 同一规则 5 分钟内同一应用只通知一次开启了聚合静默之后同一规则在窗口期内只会触发一次通知后续命中的日志只是记录到告警历史里不再重复轰炸。4.4 开源许可证与其他坑Vigilog 仓库使用的是比较宽松的开源许可证对于想把它集成到内部系统或者二次开发的公司来说这点比较友好。需要注意的是如果你把 Vigilog 的代码直接嵌入到自己的商业产品中发布建议还是看看完整许可证原文并且保留版权声明。这是开源项目使用中最容易忽略、也最容易被法务盯上的点。另外我测试时发现一个隐蔽问题如果 server 端的磁盘写满会看到采集端日志里大量出现send timeout但 server 的控制台可能仍在正常运行。所以监控磁盘使用率这件事不能全指望应用系统本身还是要配合常规的主机监控一起来做。5. 生产落地的一些实测数据我把 Vigilog 部署在一个 3 节点的测试集群上单机 8C16G普通 SSD无 RAID模拟了一个日增日志量在 150GB 左右的业务场景。压测结果如下场景指标数据日志写入单节点写入吞吐约 2.8 万条/秒查询响应精确关键词1 小时内大约在 300~600ms查询响应模糊检索1 天内1~2s告警触发规则命中到通知送达5~15 秒资源占比server 进程 CPU平均 25%峰值 50%在容灾方面我把一台 server 节点直接杀掉采集端触发了本地落盘和重连逻辑业务日志大概中断了 40 秒然后在节点恢复后自动补齐了缺失的数据。整个过程没有人工干预。这个表现对于大多数内部日志场景来说已经是完全够用的水平了。给我印象最深的一点是它的运维成本整套系统只有两个容器不像传统 ELK 方案那样需要操心 Kafka 的消费积压、ES 的分片迁移、Logstash 的管道压力。在中小团队里“能少维护一个组件就是胜利”这句话一样适用。如果你的团队当前还在用 grep 命令翻日志或者正在为商业化日志平台的高昂授权费发愁真的可以试试 Vigilog。拿一台 4C8G 的机器跑一下搭好采集和告警体验到的变化是立竿见影的。本文还有配套的精品资源点击获取