一、前言

Java 应用开发的同学都知道,项目上线后,日志可视化查询、接口性能监控、慢请求分析、调用链监控、JVM 可视化监控是一件非常重要的事。
市面上对于上对于日志的可视化查询、接口的性能监控、调用链监控、JVM 的可视化监控都有常用的方案。

  • 日志可视化查询:ELK/EFK。
  • JVM 可视化监控与接口性能:Actuator + Prometheus + Grafana。
  • 调用链监控:PingPoint、Skywalking、Zipkin 等。

不过对于很多开发者来说,这中间存在大量繁琐的配置过程,且具备一定的使用学习门槛,部署成本与运维成本也比较高。

而对于大多数中小型企业或者个人开发者来说,并不想要这么大的投入,但又想要对应用做全方位的监控管理该怎么办?

小编今天要介绍的就是这样一款可免费使用的 Java 应用全方位监控平台。一站式、轻量级、低门槛、零侵入,开箱即用。

旨在于以极简、高效的方式,在一个平台上实现 Java 应用的日志采集与可视化查询、接口性能监控、慢请求分析、调用链监控、JVM 可视化监控。

二、软件介绍

zero-observer + zero-log = Java 应用一站式监控

官网地址:https://kuafucv.com

1. 系统架构

主要分为客户端和服务端两个部分。

2. 采集客户端【zero-log】

旨在提供低门槛、少配置、轻量级、无侵入的方式实现应用日志、接口性能、调用链、JVM 指标的自动采集与上报。

  • 基于 logback 实现自动采集代码中通过 log.error、log.warn、log.info、log.trace 方式输出的日志。
  • 采集各个接口的性能数据。
  • 采集方法调用链数据。
  • 采集 JVM 运行时各项指标。

3. 服务端【zero-observer】

收集客户端采集插件采集的客户端数据,并提供开箱即用的可视化与管理功能。

4. 功能介绍

功能 实现情况
登录认证
仪表盘统计
应用日志采集
应用控制台日志
应用日志列表检索
接口性能监控
接口慢请求分析
CPU 监控
物理内存监控
堆内存监控
非堆内存监控
Eden区监控
Survivor区监控
OldGen区监控
Metaspace区监控
线程监控
GC监控
调用链监控

仪表盘

应用日志

控制台日志

应用日志查询

应用日志详情

接口性能监控

慢请求分析

调用链监控

JVM 监控



三、服务端部署

zero-observer 数据存储使用的是 mysql 与 elasticsearch,mysql 存储的是系统数据,elasticsearch 存储的是日志数据。
所以需要自行安装 mysql 与 elasticsearch。

1. Mysql 初始化脚本

创建数据库: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;

2. 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

四、SpringBoot 应用接入

1. 引入 maven 依赖

<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. 启动类添加注解

启动类添加 @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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐