对于Java开发者来说,项目上线后,日志查询、接口性能、慢请求、调用链以及JVM监控是刚需,但传统的ELK、Prometheus、Skywalking等方案配置繁琐、门槛较高。今天介绍一款一站式、轻量级的开源监控平台——zero-observer + zero-log,让你轻松实现全方位监控,开箱即用!

一、为什么你需要一个“轻量级”监控平台?
在Java应用生态中,监控工具众多:日志可视化用ELK/EFK,JVM和接口性能用Actuator + Prometheus + Grafana,调用链追踪用Pinpoint、Skywalking或Zipkin。然而,对于中小型企业或个人开发者来说,这些方案往往存在以下痛点:
- 配置繁琐:每个组件都需要独立配置和集成,学习成本高。
- 部署和运维成本高:需要维护多个服务,资源消耗大。
- 门槛较高:需要熟悉多种技术栈,如JavaScript(用于Grafana面板)、Go(如Prometheus exporter)或Python(如ELK的Logstash插件)。
而今天的主角——zero-observer + zero-log,旨在以极简的方式,在一个平台上搞定日志采集、接口性能、慢请求分析、调用链追踪和JVM监控。它完全免费,零侵入,仅需少量配置即可接入SpringBoot应用。
二、软件介绍:zero-observer + zero-log 架构解析
官方地址:https://kuafucv.com
1. 系统架构
该平台分为客户端和服务端两部分:

客户端(zero-log)负责数据采集,服务端(zero-observer)负责数据接收、存储和可视化展示。这种解耦设计使得接入成本极低,且易于横向扩展。
2. 采集客户端【zero-log】
旨在提供低门槛、少配置、轻量级、无侵入的方式实现应用日志、接口性能、调用链、JVM 指标的自动采集与上报。
zero-log基于logback实现,能够自动采集以下数据:
- 日志数据:自动采集log.error、log.warn、log.info、log.trace输出的日志。
- 接口性能:采集每个HTTP请求的响应时间、吞吐量等指标。
- 调用链数据:记录方法调用链路,便于定位慢请求和异常。
- JVM指标:采集内存、GC、线程、类加载等运行时数据。
与传统的C++或Go编写的agent相比,zero-log基于Java生态,对SpringBoot应用零侵入,无需修改业务代码。
3. 服务端【zero-observer】
服务端提供开箱即用的可视化与管理功能,包括仪表盘、日志查询、性能监控、调用链查看、JVM监控等。所有数据都通过统一的UI呈现,无需切换多个工具。
4. 功能介绍
| 功能 | 实现情况 |
|---|---|
| 登录认证 | ✅ |
| 仪表盘统计 | ✅ |
| 应用日志采集 | ✅ |
| 应用控制台日志 | ✅ |
| 应用日志列表检索 | ✅ |
| 接口性能监控 | ✅ |
| 接口慢请求分析 | ✅ |
| CPU 监控 | ✅ |
| 物理内存监控 | ✅ |
| 堆内存监控 | ✅ |
| 非堆内存监控 | ✅ |
| Eden区监控 | ✅ |
| Survivor区监控 | ✅ |
| OldGen区监控 | ✅ |
| Metaspace区监控 | ✅ |
| 线程监控 | ✅ |
| GC监控 | ✅ |
| 调用链监控 | ✅ |
以下是平台的核心功能截图:
- 仪表盘:总览全局,展示关键指标。

- 应用日志:实时查看各应用的日志流。

- 控制台日志:类似终端日志输出,方便调试。

- 应用日志查询:支持按级别、关键字、时间范围过滤。

- 应用日志详情:查看单条日志的完整上下文。

- 接口性能监控:展示每个接口的响应时间、调用次数、错误率等。

- 慢请求分析:自动识别并列出响应时间超过阈值的请求。

- 调用链监控:可视化展示请求经过的各个方法调用链路。

- JVM监控:实时显示堆内存、非堆内存、GC次数、线程数等。



提示:这些功能完全免费,无需额外付费即可使用全部核心能力。
三、服务端部署:Docker一键启动
zero-observer 数据存储使用的是 mysql 与 elasticsearch,mysql 存储的是系统数据,elasticsearch 存储的是日志数据。
所以需要自行安装 mysql 与 elasticsearch。
部署服务端非常简单,只需以下几步:
- 初始化数据库:创建数据库
zero_observer,并执行初始化脚本。
CREATE TABLE `app_log_growth_trend` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`app` varchar(255) NOT NULL,
`env` varchar(50) NOT NULL,
`level` varchar(10) NOT NULL,
`statistic_time` datetime NOT NULL,
`log_count` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `app_log_total_growth_trend` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`statistic_time` datetime NOT NULL,
`log_count` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `app_log_level_statistic` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`app` varchar(255) NOT NULL,
`env` varchar(50) NOT NULL,
`level` varchar(10) NOT NULL,
`statistic_time` datetime NOT NULL,
`log_count` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `app_env_instance` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`app` varchar(255) NOT NULL,
`env` varchar(50) NOT NULL,
`ip` varchar(50) NOT NULL,
`port` varchar(5) NOT NULL,
`hostname` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `app_log_statistic` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`app_log_statistic_counter_id` bigint(20) NOT NULL,
`app` varchar(255) NOT NULL,
`env` varchar(50) NOT NULL,
`statistic_time` datetime NOT NULL,
`log_count` bigint(20) NOT NULL DEFAULT '0',
`slow_request_count` bigint(20) NOT NULL DEFAULT '0',
`error_count` bigint(20) NOT NULL DEFAULT '0',
`warn_count` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `app_log_statistic_counter` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`statistic_time` datetime NOT NULL,
`statistic_status` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `system_config` (
`id` bigint(20) NOT NULL COMMENT '主键',
`create_time` datetime NOT NULL COMMENT '创建时间',
`key_code` varchar(50) NOT NULL COMMENT 'key编码',
`key_name` varchar(50) DEFAULT NULL COMMENT 'key 名称',
`key_value` varchar(255) NOT NULL COMMENT 'key值',
`enabled` int(11) NOT NULL DEFAULT '1' COMMENT '是否启用',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `system_config` (`id`, `create_time`, `key_code`, `key_name`, `key_value`, `enabled`)
VALUES (1, '2025-07-19 23:56:06', 'app_log_storage_days', '应用日志存储天数', '3', 1);
CREATE TABLE `users` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`account` varchar(100) NOT NULL,
`pwd` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `token_info` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`subject` varchar(100) NOT NULL,
`token` varchar(255) NOT NULL,
`expire_time` datetime NOT NULL,
`expire_timestamp` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `license` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`content` text NOT NULL,
`remark` text DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `request_monitor_statistic` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`statistic_date` int(11) NOT NULL,
`app` varchar(255) NOT NULL,
`env` varchar(50) NOT NULL,
`uri` varchar(255) NOT NULL,
`executeCount` int(11) DEFAULT NULL,
`rtAvg` float DEFAULT NULL,
`rtMax` int(11) DEFAULT NULL,
`rtMin` int(11) DEFAULT NULL,
`slow_count` int(11) DEFAULT 0,
`slow_avg` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `request_mapping` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`app` varchar(255) NOT NULL,
`env` varchar(50) NOT NULL,
`ip` varchar(50) NOT NULL,
`port` varchar(5) NOT NULL,
`hostname` varchar(255) NOT NULL,
`uri` varchar(255) DEFAULT NULL,
`method` varchar(10) DEFAULT NULL,
`handler_method` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE app_env_instance ADD online INT NULL;
ALTER TABLE app_env_instance ADD last_heartbeat DATETIME NULL;
ALTER TABLE request_monitor_statistic ADD req_method varchar(10) NULL;
CREATE TABLE `app_env` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`app` varchar(255) NOT NULL,
`env` varchar(50) NOT NULL,
`gene` varchar(20) NOT NULL,
`signature` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `sys_lock` (
`id` bigint(20) NOT NULL,
`create_time` datetime NOT NULL,
`lock_name` varchar(100) NOT NULL,
`status` INT NOT NULL,
`last_heartbeat` datetime DEFAULT NULL,
`holder` varchar(255) DEFAULT NULL,
`holder_id` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 拉取Docker镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/kuafucv/zero-observer:2.1.0
- 启动容器:
docker run -itd -p 8080:8080 --name zero-observer \
-e TZ=Asia/Shanghai \
-e ES_IP=127.0.0.1 \
-e ES_PORT=9200 \
-e ES_USERNAME=es \
-e ES_PASSWORD=es \
-e MYSQL_IP=127.0.0.1 \
-e MYSQL_PORT=3306 \
-e MYSQL_USERNAME=root \
-e MYSQL_PASSWORD=123456 \
registry.cn-hangzhou.aliyuncs.com/kuafucv/zero-observer:2.1.0
参数解析:
- TZ:时区,默认 Asia/Shanghai
- ES_IP:elasticsearch 的 ip
- ES_PORT:elasticsearch restapi 的端口
- ES_USERNAME:elasticsearch 用户名,无则不填即可
- ES_PASSWORD:elasticsearch 密码,无则不填即可
- MYSQL_IP:mysql 的ip
- MYSQL_PORT:mysql 端口
- MYSQL_USERNAME 用户名
- MYSQL_PASSWORD 密码
启动成功后,浏览器访问 http://127.0.0.1:8080/zero-observer/,默认用户名密码为 admin/123456。整个部署过程不超过5分钟,相比传统的ELK或Prometheus + Grafana方案,大大降低了运维成本。
⚠️ 注意事项:确保Docker环境已正确安装,且MySQL服务可访问。如果使用云服务器,请配置好安全组规则。
[AFFILIATE_SLOT_1]四、SpringBoot应用接入:零侵入,只需三步
1. 引入Maven依赖
在 pom.xml 中添加zero-log客户端依赖:
<dependency>
<groupId>io.github.kuafucv</groupId>
<artifactId>zero-log-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2. 配置application.yml
在配置文件中指定服务端地址和应用名称:
zero:
log:
server-url: http://127.0.0.1:8080/zero-observer
注意:
- serverUrl 为 zero-observer 服务访问地址,该属性值为 http://ip:port/zero-observer
3. 启动类添加注解
在SpringBoot启动类上添加 注解:@EnableZeroLog
@SpringBootApplication
@EnableZeroLog
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4. 启动服务
启动Java服务后,等待日志自动上报至zero-observer。无需修改业务代码,即可在zero-observer控制台查看所有数据。

更多内容请参考官网:https://kuafucv.com
✅ 验证接入成功:在zero-observer的“应用列表”中看到你的应用名称,并能在“应用日志”或“接口性能”中看到实时数据,即表示接入成功。
扩展建议:如果你同时使用Python、Go或C++开发微服务,也可以考虑将zero-log的采集逻辑适配到其他语言,但当前版本主要支持Java/SpringBoot。
[AFFILIATE_SLOT_2]五、总结与展望
zero-observer + zero-log为Java开发者提供了一站式、轻量级的监控方案,覆盖日志、性能、调用链和JVM四大维度。相比传统方案,它零侵入、部署简单、开箱即用,特别适合中小团队和个人项目。未来,该平台可能会支持更多语言(如Python、Go)的agent,值得持续关注。
最后提醒:监控是保障系统稳定性的基石,建议在项目初期就引入此类工具,避免事后排查问题的被动局面。现在就去试试吧!
浙公网安备 33010602011771号