对于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。

部署服务端非常简单,只需以下几步:

  1. 初始化数据库:创建数据库 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;
  1. 拉取Docker镜像
docker pull registry.cn-hangzhou.aliyuncs.com/kuafucv/zero-observer:2.1.0
  1. 启动容器
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,值得持续关注。

最后提醒:监控是保障系统稳定性的基石,建议在项目初期就引入此类工具,避免事后排查问题的被动局面。现在就去试试吧!