简介: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这类轻量项目会更舒服。
我简单做了个对比,仅代表个人实际体验:
| 对比项 | ELK | Loki | Vigilog |
|---|---|---|---|
| 部署复杂度 | 高,组件多,内存吃紧 | 中,依赖对象存储 | 低,单二进制或容器化 |
| 资源占用 | 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确实能满足核心场景,再逐步推广到更多节点。工具终究是工具,关键是它能不能真正帮你减少被动救火的时间,把精力放到更有价值的事情上去。
本文还有配套的精品资源,点击获取