0. 前言
在分布式系统可观测性架构中,Caddy 作为提供 HTTP/2 和 HTTP/3 的现代化边缘服务网关,其本机日志记录机制虽具备基础的请求追踪能力,但受限于静态文件输出模式与缺乏内置分析引擎,在应对高吞吐量场景时难以满足企业级日志生命周期管理需求。本文将通过 Vector 云原生日志代理的流式日志管道技术,将 Caddy 捕获的结构化 HTTP 请求元数据 JSON 日志流导入至 OpenObserve 的日志分析平台,构建具备实时语义分析能力的可观测性数据平面。
本架构通过将原始日志事件流经 Vector 的消息队列,在保证没有元数据丢失的前提下,实现每秒万级日志事件的实时分析与存储优化。通过 OpenObserve 的压缩算法与动态数据保留策略,本架构可以进一步实现计算资源利用率与存储成本的大幅下降。
1. 为什么需要将 Caddy 日志集成到 OpenObserve?
1.1 为什么是 Caddy
Caddy 作为现代 Web 服务器,内置了丰富的日志记录功能,但其原生日志系统主要用于基础监控。例如,Caddy 可以记录 HTTP 请求的 IP、URL、状态码和响应时间,但若想对这些数据进行深入分析,则需要借助外部日志分析平台。手动导出日志文件并进行人工分析不仅耗时,还容易遗漏关键信息。Caddy 内置了 JSON 格式的日志导出,可以很方便的和其他日志服务集成。
1.2 为什么是 OpenObserve
OpenObserve 是一个开源的日志分析与可观测性平台,支持实时日志聚合、多维度查询、可视化仪表盘和告警功能。它允许用户通过简单的界面快速定位异常请求。将 Caddy 日志接入 OpenObserve,可以将原本分散的日志数据转化为可操作的洞察。
1.3 Vector 又是来干什么的
Vector 是一个高性能的日志管道工具,它能够从各种数据源(如文件和数据库)收集日志,经过格式化、过滤、聚合等处理后,安全可靠地发送到目标系统。Vector 的优势在于:
- 低延迟传输:支持批量处理和压缩,减少网络开销
- 灵活配置:通过声明式配置文件定义数据流的输入、转换和输出
- 可扩展性:可适配几乎任何日志源和目标
2. 环境搭建与前期准备
2.1 确认基础环境要求
在开始之前,需要确保你的系统满足以下条件:
- 操作系统:推荐使用安装了 Docker 的 Debian 12
- Caddy:已安装并运行 Caddy,能够正常的访问反向代理后的站点
- OpenObserve:我们推荐使用 Docker 自建 OpenObserve
- Vector:访问官方文档获取安装方案
2.2 使用 Docker 安装 OpenObserve
2.2.1 安装 Docker 和 Docker Compose
这部分不再赘述,使用一键脚本即可完成这一小节:
# 国内
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 境外
curl -fsSL https://get.docker.com | bash -s docker
2.2.2 使用 Docker Compose 启动应用
我们可以编写如下所示的 compose.yml 用于启动应用:
services:
openobserve:
image: public.ecr.aws/zinclabs/openobserve:latest
container_name: openobserve
restart: unless-stopped
ports:
- "5080:5080"
volumes:
- ./data:/data
environment:
ZO_DATA_DIR: "/data"
ZO_ROOT_USER_EMAIL: "" # 在这里填好你的用户名
ZO_ROOT_USER_PASSWORD: "" # 在这里填好你的密码
RUST_LOG: "warn"
deploy:
resources:
limits:
memory: 1000M # 限制最大内存,富哥可以删除这一小节
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:5080/healthz || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
诚然,我们可以直接使用 docker compose up -d 启动应用,随后我们便可以在 IP:5080 处访问到应用了!
2.2.3 初识 OpenObserve
没写以后补上。

2.2.4 获取 OpenObserve API 密钥
登录 OpenObserve 控制台,进入「数据源」管理页面,完成以下操作:
- 导航到
自定义>Vector,获取可用的配置 - 寻找 OpenObserve 的馈送 API 地址(通常为
/api/<ORG_ID>/<STREAMS_ID>/_json) - 记录清楚每一项的内容

2.3 配置 Caddy 的日志格式
我们将让 Caddy 的日志输出为 JSON 格式,这将方便后续的处理。
example.com {
log {
output file /var/log/caddy/example.com.log {
roll_size 10MiB
roll_keep 1
}
format json
}
# reverse_proxy http://localhost:8080 # 这是之后的请求处理部分,自己写
}
这里我们指定输出的文件为 /var/log/caddy/example.com.log,如果是 Docker 部署的 Caddy 记得挂载一下对应的路径,如果是裸跑的注意创建一下对应的目录并设置好权限。我通常喜欢在日志文件名中写上主机名,方便区分不同的域名的请求。
3. 安装与配置 Vector
3.1 安装 Vector
Vector 官方提供了多种安装方式,包括通过包管理器、Docker 或手动下载二进制文件。对于 Debian 12,我们可以使用以下一键脚本安装 Vector:
curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev | bash -s -- -y
# 这部分可能会随着时间流逝而失效,建议查阅官方文档
3.2 编写 Vector 配置文件
Vector 的配置文件通常以 .toml 或 .yaml 格式编写,需定义三个核心组件:
- 输入(Sources):指定日志的来源(如 Caddy 的日志文件路径)
- 转换(Transforms):可选步骤,用于解析日志格式、重命名字段或采样数据
- 输出(Sinks):定义日志的目标系统(如 OpenObserve)
于是我们可以写出如下所示的配置文件,这里我们使用 sample 用于采样(亿级请求对我们的小机器还是有点吃不消):
# compose.yml
data_dir: "/var/lib/vector" # 这个目录记得创建
sources:
caddy:
type: file
include:
- "/var/log/caddy/example.com.log"
read_from: end
transforms:
sample:
type: sample
inputs:
- caddy
rate: 10 # 采样率,这里代表 1/10 十分之一采样
parse:
type: remap
inputs:
- sample
source: | # 因为我们是输出的 JSON 日志,所以在这里解析
. = parse_json!(.message)
extract_fields:
type: remap
inputs:
- parse
source: |
. = {
"ts": .ts,
"remote_ip": .request.remote_ip,
"method": .request.method,
"host": .request.tls.server_name,
"uri": .request.uri,
"status": .status,
"duration": .duration,
"cf_ray": .request.headers."Cf-Ray"[0],
"ua": .request.headers."User-Agent"[0],
"country": .request.headers."Cf-Ipcountry"[0],
"ip": .request.headers."Cf-Connecting-Ip"[0]
}
sinks:
openobserve:
type: http
inputs:
- extract_fields
uri: "http://IP:5080/api/default/caddy/_json" # 自行修改
method: post
auth:
strategy: basic
user: "" # 自行修改
password: "" # 自行修改
compression: zstd
encoding:
codec: json
timestamp_format: rfc3339
healthcheck:
enabled: false
3.3 启动 Vector 服务
保存配置文件后,通过以下命令启动 Vector:
vector --config ~/.vector/config/vector.yaml
若需后台运行,可结合 screen:
screen -S vector
# 在新会话里面执行:
vector --config ~/.vector/config/vector.yaml
# 随后使用 Ctrl + Alt + D 退出终端保持程序运行
# 使用如下命令查看程序的日志和状态
screen -r vector
4. 验证与调试
4.1 检查 Vector 日志
Vector 的运行日志默认输出到控制台,若遇到错误(如权限问题或配置语法错误),日志会明确提示具体原因。
4.2 在 OpenObserve 中确认日志
- 登录 OpenObserve 控制台,进入「日志」界面
- 使用搜索语句(SQL 查询
SELECT * FROM "caddy")筛选 Caddy 相关日志 - 验证是否能看到最新的访问记录

5. 高级配置与优化
5.1 性能优化技巧
- 批量:通过
batch参数设置每批发送的日志条目数量,平衡传输速度与网络负载 - 压缩:启用
compression参数(如zstd)减少带宽消耗
5.2 多环境与多目标配置
若需为开发、测试、生产环境分别配置不同的 OpenObserve 目标,可在 Vector 配置文件中添加多个 sinks 块,并通过环境变量或条件判断动态切换
5.3 告警与仪表盘配置
在 OpenObserve 中,可创建仪表盘监控以下关键指标:
- HTTP 状态码分布:识别 4xx/5xx 错误
- 请求延迟趋势:分析 API 响应时间是否异常
- 客户端 IP 地理分布:检测潜在的异常流量
目前我们创建了请求延迟、请求采样数和请求来源的三张统计图,可以很方便的通过图表分析数据。
6. 长期维护与扩展
这部分是为一些已经准备长期使用这项解决方案的人准备的,如果你只是想试一试,可以自行探索一下。
6.1 日志保留策略
根据 OpenObserve 的存储配置,设置日志保留周期(如保留 14 天日志),避免数据过载
6.2 扩展其他日志源
Vector 支持从 MySQL、Kafka、Nginx 等多种源收集日志。例如,可将 Nginx 日志也接入 OpenObserve,实现全栈可观测性
7. 附录与参考资料
7.1 Caddy 配置文件详解
7.2 Vector 官方文档链接
7.3 OpenObserve 管理指南
8. 总结
通过本文的详细步骤,你已掌握了从 Caddy 到 OpenObserve 的日志集成全流程。这一方案不仅解决了手动日志分析的痛点,还为后续的自动化监控和深度分析奠定了基础。无论是排查服务器故障、优化性能瓶颈,还是满足合规审计需求,OpenObserve 都能提供直观、高效的支持。如果有下一篇文章的话,我会介绍使用 Grafana 来展示 OpenObserve 中的数据。
那么本篇文章就到这里,有任何问题欢迎留言讨论,期待和你共同进步!