Vigilog:轻量级开源日志采集与告警平台实践指南
2026/9/7 8:12:22 网站建设 项目流程

简介:Vigilog是一款专注于海量日志管理与分析的开源日志查看工具,面向需要跨平台排查问题的开发、运维与IT支持人员。其即时过滤和颜色标记功能可帮助用户快速定位异常、梳理错误时间线并监控系统状态,且支持按需修改源码、定制集成。压缩包以zip形式提供,共21个文件,以20个jar包为主,另有1个xml配置文件;jar包涵盖主程序、swing界面组件、日志处理及glazedlists等第三方依赖库,xml则用于保存过滤规则或运行配置。整个资源仅5.63MB,轻量易部署,适合缺乏重型日志平台的个人或中小企业用户。目前已有52人浏览学习。解压后可获得完整源代码、构建脚本、用户/开发者文档、示例日志与许可证文件,既可用于日常日志排查,也可作为学习桌面应用开发与开源项目组织的参考案例。 最近在几个开源社区和开发者讨论组里总能看到一个名字——Vigilog。刚开始我以为是某个前端组件库或者又一个Web框架,点进去才发现,这是一个专注日志采集、聚合和告警的开源项目。实际部署用了几周之后,我觉得它非常适合中小团队和个人开发者,解决了一个很实际的问题:日志分散在多台机器、多个服务里,出问题的时候到处翻文件、跳着查,效率太低;上ELK又觉得重,光维护那套Java集群就够喝一壶。Vigilog走的是轻量路线,部署简单,资源占用低,但该有的核心功能一样没少。

这篇文章就围绕Vigilog展开。我会先讲它的整体设计思路,再手把手带你把核心链路跑起来,接着聊一聊性能调优和高可用扩展的实操经验,最后整理一份问题排查速查表。无论你是刚接触开源日志项目的新手,还是想找一个可控、可二次开发的日志平台,这篇内容应该都能给你一些参考。

1. Vigilog是什么:为什么我最终选择了这个开源日志项目

Vigilog这个名字很有意思,前半段取自“vigilant”,有警觉、持续关注的意思,后半段就是log。所以这个项目的定位很清晰:一个保持警觉、持续采集和分析日志的开源平台。它的核心能力是日志采集、集中存储、查询分析和规则告警,和ELK、Loki这类工具的定位类似,但侧重点不同。

1.1 这个项目解决的痛点

我在自己的服务器上托管了大概十来个小服务,包括个人博客、API网关、定时任务脚本和一个内部使用的数据看板。过去排查问题时,要登录每一台机器,用tail、grep、awk在那堆滚动日志里翻找,往往崩溃现场发生在凌晨三点,而我发现时已经是第二天早上。加了简单的日志文件集中同步之后,虽然不用每台机器分别登录了,但文件越来越大,检索依然痛苦。

Vigilog解决的不是“日志可视化”这种锦上添花的问题,而是“日志能不能第一时间告诉你有事发生”这种基础问题。它开箱即用地支持日志轮转跟踪、多行日志合并、字段提取和告警规则。部署之后,我可以把分散的日志汇聚到同一个页面里,按服务、按级别、按关键字过滤,并且在匹配到错误模式时自动推送告警。

1.2 和传统日志系统的差异

很多人一提到集中日志首先想到的是ELK或者Loki。不能说那些方案不好,但如果只是个人项目或者一个小团队几十台机器,用Vigilog这类轻量项目会更舒服。

我简单做了个对比,仅代表个人实际体验:

对比项ELKLokiVigilog
部署复杂度高,组件多,内存吃紧中,依赖对象存储低,单二进制或容器化
资源占用Elasticsearch常驻2-4GB有缓存和内存压力默认几百MB以内
查询方式DSL,学习成本高LogQL,有学习门槛类SQL,更容易上手
告警能力需要额外配置Watcher或另接组件依赖Alertmanager等内置规则引擎
离线单机运行很不方便一般很好

当然这不是说Vigilog可以完全替代ELK。在日志量极大、需要复杂全文检索和聚合分析的场景下,ELK依然是成熟选择。但如果你的痛点主要是“日志别丢、出问题能快速定位、有事及时通知”,Vigilog的开源实现已经非常够用。

1.3 开源的价值点

选择Vigilog还有一个重要原因:它是开源的。源码放在GitHub上,许可宽松,可以自由查看和修改。对于一个把数据看得比较重的开发者来说,自己掌控日志管道的每一环很重要。我可以在采集端加自己需要的解析规则,可以在告警模块里接入自己的通知渠道,甚至可以改存储层的保留策略,而不是被一个黑盒SaaS绑定。开源社区也在持续贡献文档和代码,遇到问题可以直接提issue,节奏很快。

2. 整体架构与核心模块拆解

Vigilog的架构不算复杂,这恰恰是它的优势。拆开来看,它主要包含四条链路:采集、传输、存储、查询与告警。

2.1 消息流转链路

首先是采集端。Vigilog提供了一个叫做agent的轻量进程,你把它部署在需要采集日志的机器上。agent会按照配置文件里的路径规则去读取日志文件,支持通配符和glob模式。读取之后先做基本的编码清洗,把非法UTF-8字节处理掉,再做行切分。

接着是传输层。agent将解析后的日志通过HTTP或者gRPC接口推送到Vigilog服务端。这里有一个细节我比较喜欢:支持批量压缩上传,默认开启gzip,对于公网带宽有限的场景能省不少流量。如果agent和服务端之间出现短暂网络故障,agent会在本地做磁盘缓冲,等恢复之后再重新推送,避免日志在传输过程中丢失。

服务端接收到日志后,会进入一个轻量级的处理管道。这个阶段会完成三件事:根据配置的解析规则提取字段,比如时间戳、日志级别、服务名、请求ID等;对原始日志做索引;然后交给存储引擎落盘。

2.2 存储层设计

Vigilog的存储层选型非常有意思。它没有用通用的全文检索引擎,而是自研了一套基于分段文件(segment)的存储格式,配合倒排索引实现快速检索。每条日志会分配一个全局自增ID和时间戳,索引信息独立存放。

这样的设计带来的直接好处是写入路径短、开销低。我用一台2核4G的云主机跑测试,模拟每秒写入500条日志时,CPU使用率稳定在20%左右,内存占用不到300MB。作为对比,我之前在同样配置的机器上跑过一个ELK最小集群,单是Elasticsearch进程就吃掉了1.8GB内存,还没算Kibana和Logstash。

2.3 查询与告警API

查询方面,Vigilog暴露了一套类SQL的HTTP查询接口。比如你想查某个服务在某个时间段内的错误日志,只需要向/api/query发送类似下面这样的请求:

curl -G http://localhost:8090/api/query \ --data-urlencode "q=SELECT * FROM logs WHERE service='api-gateway' AND level='ERROR' AND time_range('now-1h')" \ --data-urlencode "limit=100"

返回结果是标准的JSON,前端页面和后端程序调用都很方便。

告警模块则是基于规则引擎实现的。规则本质上是一个表达式,如果在一定时间窗口内匹配到指定条件,就会触发通知。通知渠道目前支持Webhook、邮件和Slack/Discord这类聊天工具。我在生产环境里配置了一个简单的Webhook,接到告警后自动转发到企业微信机器人,基本做到了秒级通知。

3. 从零部署Vigilog:超详细的实操记录

说了这么多理论,还是得上手跑一遍。这一节我会记录从零部署Vigilog的完整过程,包括环境准备、配置采集和验证告警。

3.1 环境准备与安装

Vigilog服务端的安装方式比较灵活。官方推荐用Docker,也可以直接下载二进制包。我个人习惯用二进制包,因为排查问题的时候更容易理解运行机制,但这里为了照顾多数读者,我以Docker Compose为例。

先创建项目目录:

mkdir vigilog-demo && cd vigilog-demo

然后创建一个docker-compose.yml文件:

version: "3.8" services: vigilog: image: vigilog/vigilog:1.4.2 container_name: vigilog ports: - "8090:8090" volumes: - ./data:/var/lib/vigilog - ./config:/etc/vigilog environment: - VIGILOG_NODE_NAME=node-1 - VIGILOG_HTTP_PORT=8090 restart: unless-stopped

启动之前需要准备一个最小配置文件config/server.yml

http: listen: "0.0.0.0:8090" storage: data_dir: "/var/lib/vigilog" retention_days: 30 agent: enabled: true push_token: "your-token" auto_register: true

提示:push_token一定要改成一个长而随机的字符串。采集端agent往服务端推日志的时候要带上这个token做身份校验,如果泄露了,任何人都可以往里灌垃圾数据。

接着执行启动命令:

docker compose up -d

启动完可以检查一下健康状态:

curl http://localhost:8090/api/health

正常情况下会返回类似{"status":"ok","version":"1.4.2"}的JSON。

3.2 配置采集与解析规则

服务端起来之后,接下来要在一台业务机器上部署agent。同样用Docker方式:

docker run -d \ --name vigilog-agent \ -v /var/log:/var/log:ro \ -v /etc/vigilog-agent:/etc/vigilog-agent \ vigilog/agent:1.4.2 \ --server http://your-server:8090 \ --token your-token

采集规则配置在/etc/vigilog-agent/agent.yml。我拿一个实际场景举例:采集Nginx错误日志,并且从日志文本里提取出错误级别和上游地址:

inputs: - type: file paths: - "/var/log/nginx/error.log" parser: name: regex pattern: '^(?P<time>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(?P<level>\w+)\] .*? upstream: (?P<upstream>[^,]+)' tags: service: nginx

这个正则是我根据Nginx默认的error日志格式写的。正则里用命名捕获组定义字段,Vigilog会自动把time识别为时间字段,把level识别为级别字段,这样存进去之后就能直接在查询里用WHERE level='error'过滤。

如果你不想写正则,Vigilog也内置了常见的日志格式解析器,比如JSON、Apache common log、Syslog。我建议能选内置解析器就选内置的,只有在格式确实比较特殊的时候才自己写正则,毕竟正则在面对日志格式变化时比较脆弱。

3.3 启动、验证与接入告警

配置好之后重启agent容器,然后手动制造一条日志看看效果:

echo "2025/01/12 10:00:00 [error] 123#123: *1 connect() failed (111: Connection refused) while connecting to upstream: 127.0.0.1:8080" >> /var/log/nginx/error.log

等几秒钟,打开Vigilog的Web页面,在查询栏输入:

SELECT * FROM logs WHERE service='nginx' AND level='error'

如果能看到刚才那条日志,说明采集链路已经通了。

接下来配置一个告警规则。在config/alerts.yml里添加:

rules: - name: "nginx upstream errors" expr: | count(level='error') > 5 window: "1m" actions: - type: webhook url: "https://your-webhook.example/alert" payload: '{"text": "Nginx上游错误超过5条/分钟"}'

这个规则的意思是:在一分钟的时间窗口内,如果采集到的level='error'日志条数超过5条,就触发Webhook通知。修改配置后重启服务端容器,规则即生效。

注意:告警表达式里做了聚合操作,底层依赖时间窗口的滑动计算。窗口设得越小,规则执行的频率越高,对性能的消耗也越大。个人经验是生产环境告警窗口最小设到30秒以上,避免过度消耗资源。

4. 性能调优与高可用扩展实践

Vigilog默认配置对中小场景够用,但如果你要管理更大规模的日志流,还是需要做一些调优。这里分享几个我实际用下来比较管用的经验。

4.1 防止日志堆积与磁盘爆满

日志系统最常见的故障不是查不到日志,而是磁盘被写满。Vigilog自带了保留期策略,比如前面配置的retention_days: 30,服务端会定期清理过期分段文件。不过这个清理是异步的,如果某天日志量突然暴增,清理速度可能跟不上写入速度。

我建议再加两道保险。

第一道是在agent端做限流和采样。对于某些高频但不那么重要的日志,可以配置采样率:

inputs: - type: file paths: - "/var/log/access.log" sample_rate: 0.1

这个配置意味着只保留10%的日志。代价是丢失部分访问统计的精确性,但对整体趋势观察没太大影响。

第二道是在系统层面为数据目录设置配额。Linux下可以用quota,或者更简单地用systemd挂载单元的ReadWriteBytes限制。我个人的做法是单独为Vigilog数据目录挂载一块100GB的云盘,既隔离了日志对系统盘的冲击,也方便备份和迁移。

4.2 查询性能优化

Vigilog的查询性能受时间范围影响最大。默认情况下,不指定时间范围的查询会扫描全部分段文件,这在小数据量时没问题,数据量大了之后会明显变慢。所以我在所有客户端查询逻辑里都强制带上时间范围,至少精确到小时,最好是分钟。

另外,如果日志里有一个高基数字段,比如请求ID,频繁基于这个字段做过滤会带来比较大的索引开销。Vigilog允许你在配置文件里指定哪些字段不建索引:

storage: index_options: skip_fields: - request_id - client_ip

当一个字段被跳过索引后,查询时退化为扫描过滤,速度会慢一些,但写入和存储开销会降下来。对于需要精确检索但不经常查询的字段,可以考虑这样取舍。

4.3 横向扩展与容灾

当单机容量不够时,Vigilog支持简单的横向扩展。它的设计思路比较直接:多个服务端节点共享同一个对象存储,比如S3或MinIO,agent按哈希规则把日志分发到不同节点,查询层做聚合。

我目前还没有把Vigilog扩展到集群级别,但测试环境里跑过双节点加MinIO的架构。要注意的是,节点共享存储后,查询接口需要由统一的网关入口转发到各个节点,或者通过负载均衡器做加权轮询。官方推荐用网关节点,同时承担查询聚合的工作。

如果对容灾要求更高,可以给存储层配置跨区域复制,比如MinIO的bucket复制。这样即使一个可用区挂了,另一个可用区还能继续提供查询服务。不过这也意味着存储成本翻倍,需要根据业务重要性权衡。

5. 实战中常见的坑与排查套路

最后这部分我整理了一份问题排查速查表,都是我在实际使用Vigilog的过程中踩过的坑,有些问题甚至排查了半天才发现原因。

问题现象可能原因解决方法
页面能打开,但看不到新日志agent采集路径错误或权限不足先验证agent所在机器能否读到日志文件,ls -l看权限
日志延迟到达gzip压缩在高CPU下耗时明显在agent配置中关闭压缩或降低压缩级别
时间字段解析错误日志时间戳不是RFC3339格式在parser里显式指定时间格式,如time_format: "yyyy/MM/dd HH:mm:ss"
告警规则一直不触发表达式语法或字段类型问题先执行查询确认字段名和值,再检查类型是string还是number
查询超时时间范围过大或索引缺失缩小时间范围,检查skip_fields是否误跳了高频过滤字段
agent推送被拒绝token不匹配或IP白名单限制检查服务端配置的push_token与agent端是否一致

这里我说一个印象特别深的坑。最开始我配置了一个正则解析Syslog格式的日志,字段提取在测试工具里能正常匹配,但接入Vigilog后就是解析不出来。后来我一步步排查,发现是Syslog日志里有些记录包含续行符,也就是消息里还有回车换行。Vigilog默认按行切割日志,一条多行消息被切成了多条,正则自然匹配不上。解决办法是在agent的input配置里开启多行合并:

inputs: - type: file paths: - "/var/log/syslog" multiline: pattern: '^[A-Z][a-z]{2} [0-9]{2}' negate: true what: previous

这段配置的意思是:新的一行如果匹配“月份 日期”开头,就认为是新消息的开始;否则把这一行追加到上一条消息的后面。这样多行堆栈信息就不会被拆散了。配置完之后,原来的正则立刻就能正常提取字段。

还有一个细节是关于日志轮转的。Linux下的logrotate默认会把旧日志重命名为error.log.1这样的文件,如果agent还在跟踪error.log,并且没有正确识别轮转事件,就会出现日志丢失。Vigilog agent内部通过文件inode来跟踪文件句柄,轮转发生时,新创建的error.log会有新的inode,agent会自动切换到新文件继续读取,但我遇到过某些容器环境下inode跟踪失效的情况。保险起见,我建议在agent配置里开启tail_retry_interval,并确保日志目录的挂载方式支持inode标识稳定。

最后再分享几个我个人的使用习惯。我会在每天凌晨自动执行一次Vigilog的存储目录快照,至少保留7天,这样万一误删了数据或者配置改崩了,还能回滚。告警规则我不会贪多,只设两三条真正能反映问题现状的指标,比如“某服务5分钟内错误日志超过10条”,而不是“任何Error都发一条告警”。告警风暴比没有告警更让人头疼,这个道理用过监控系统的人应该都懂。

如果你正准备在团队里引入一个开源日志项目,我建议先不要急着大规模铺开。挑一台测试服务器,把采集、解析、告警这条链路完整跑一遍,再把历史日志导入一部分做查询演练。等确认Vigilog确实能满足核心场景,再逐步推广到更多节点。工具终究是工具,关键是它能不能真正帮你减少被动救火的时间,把精力放到更有价值的事情上去。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询