部署 ELK 或 EFK 太麻烦,运维成本高,我只想看一下应用的日志,远程服务器又不方便。有什么好的办法吗?zero-log 一款嵌入式 Java 应用日志可视化工具,零配置、轻量级,开箱即用!

前言

在微服务架构下,日志集中查看通常依赖于 ELK 或 EFK 等重型基础设施。这些方案功能强大,但部署与运维成本比较高。对于中小团队项目或者个人开发者,在快速迭代的项目中,还是比较笨重的。

而在单体应用或单个 SpringBoot 服务的场景下,开发者往往只需要一个简单直观的方式:在浏览器里实时看日志、搜历史日志、看异常堆栈。

今天要介绍的 zero-log 就是这样一款能够让你一键接入、零代码变更、无需依赖其他中间件的嵌入式日志采集与可视化工具。

项目介绍

zero-log 提供两种运行模式以适应不同场景。

Lite模式(嵌入式模式): Lite模式下,zero-log 实现日志的自动采集和一站式轻量级日志查询页面,包括控制台日志与日志查询功能,并支撑日志数据导出。当前模式下仅支持单应用实例,适合个人开发者、中小型单体应用。需要多应用、多环境、多实例同时接入的,请使用 Standalone 模式

Standalone模式(独立模式): 在Standalone 模式下,zero-log 专注于日志与监控数据的采集,并上报至 zero-observer 服务端。由 zero-observer 提供一站式可视化功能页面,支持多个应用、多环境、多实例统一接入与管理。

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

Gitee 开源地址:

  • https://gitee.com/kuafucv/zero-log
  • https://gitee.com/kuafucv/zero-observer

快速接入

极简接入,零代码变更

zero-log 提供了Spring Boot Starter,接入流程极其简单,只需三步:

第一步:引入Maven依赖

  • SpringBoot 2.x
<dependency>
    <groupId>io.github.kuafucv</groupId>
    <artifactId>zero-log-spring-boot-starter</artifactId>
    <version>2.3.0</version>
</dependency>
  • SpringBoot 3.x
<dependency>
    <groupId>io.github.kuafucv</groupId>
    <artifactId>zero-log-spring-boot3-starter</artifactId>
    <version>2.3.0</version>
</dependency>

第二步:配置application.yml

zero:
  log:
    mode: lite
    enabled: true

第三步:启动类添加注解

@SpringBootApplication
@EnableZeroLog
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

启动服务

启动 Java 服务,http://127.0.0.1:8080/zero-log-web/index.html

看到日志控制台页面,则接入成功。

独立模式

独立模式下,zero-log 只负责采集日志,zero-observer 收集采集的客户端日志与监控数据,并提供开箱即用的可视化与管理功能。

独立模式下,除了支持日志的可视化,还支持接口性能监控、慢请求分析、调用链追踪、JVM可视化监控等功能,配置简单,开箱即用。

官方将这套组合形象地概括为一条公式:
zero-observer + zero-log = actuator + prometheus + grafana + elk/efk

zero-observer 部署

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,
    `execute_count` int(11) DEFAULT NULL,
    `rt_avg` float DEFAULT NULL,
    `rt_max` int(11) DEFAULT NULL,
    `rt_min` 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;

CREATE TABLE `app_env_whitelist` (
    `id` bigint(20) NOT NULL,
    `create_time` datetime NOT NULL,
    `app` varchar(255) NOT NULL,
    `env` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Docker 部署

# 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/kuafucv/zero-observer:2.2.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.3.0

启动成功后,浏览器访问:http://127.0.0.1:8080/zero-observer/
默认用户密码:admin/123456

应用接入

只需要将 lite 模式下的 application.yml 配置文件进行修改即可。

zero:
  log:
    mode: standalone
    enabled: true
    server-url: http://127.0.0.1:8080/zero-observer

启动 Java 服务,等待日志自动上报至 zero-observer ,前往 zero-observer 查看对应数据。

总结

zero-log 和 zero-observer 的组合为Java开发者提供了一套轻量级、低门槛、零侵入的应用监控解决方案。与传统监控方案相比,它免去了繁琐的配置和额外的运维成本,在保持核心功能完备的同时,显著降低了使用门槛。无论是个人学习项目还是中小型企业正式上线,zero-log 都能以极简的方式满足日志监控需求。


🎁 福利时间

如果你正在备战面试或者想要学习其他知识,给大家推荐一个宝藏知识库,作者整理了一些列 Java 程序员需要掌握的核心知识,有需要的自取不谢。

知识库地址:https://farerboy.com/


Logo

一站式 AI 云服务平台

更多推荐