部署 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-loghttps://gitee.com/kuafucv/zero-observer快速接入极简接入零代码变更zero-log 提供了Spring Boot Starter接入流程极其简单只需三步第一步引入Maven依赖SpringBoot 2.xdependency groupIdio.github.kuafucv/groupId artifactIdzero-log-spring-boot-starter/artifactId version2.3.0/version /dependencySpringBoot 3.xdependency groupIdio.github.kuafucv/groupId artifactIdzero-log-spring-boot3-starter/artifactId version2.3.0/version /dependency第二步配置application.ymlzero: 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/efkzero-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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE license ( id bigint(20) NOT NULL, create_time datetime NOT NULL, content text NOT NULL, remark text DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;Docker 部署# 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/kuafucv/zero-observer:2.2.0 # 启动容器 docker run -itd -p 8080:8080 --name zero-observer \ -e TZAsia/Shanghai \ -e ES_IP127.0.0.1 \ -e ES_PORT9200 \ -e ES_USERNAMEes \ -e ES_PASSWORDes \ -e MYSQL_IP127.0.0.1 \ -e MYSQL_PORT3306 \ -e MYSQL_USERNAMEroot \ -e MYSQL_PASSWORD123456 \ 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/