diff --git a/docs/cn/logging.md b/docs/cn/logging.md new file mode 100644 index 0000000000..534c4a5cc7 --- /dev/null +++ b/docs/cn/logging.md @@ -0,0 +1,80 @@ +--- +title: 通过 frankenphp_log() 和 Caddy 实现 FrankenPHP 日志记录 +description: 在 FrankenPHP 中使用 frankenphp_log() 或 error_log() 从 PHP 输出结构化日志,通过 Caddy 的日志系统以 JSON 格式路由到 Datadog、Loki 或 Elastic。 +--- + +# 日志记录 + +> [!TIP] +> 日志记录是 FrankenPHP 可观测性体系的一部分。请参阅[可观测性](observability.md)页面了解完整信息,包括实时监控和指标。 + +FrankenPHP 与 [Caddy 的日志系统](https://caddyserver.com/docs/logging)无缝集成。 +你可以使用标准 PHP 函数记录日志,也可以利用专用的 `frankenphp_log()` 函数实现高级 +结构化日志功能。 + +## `frankenphp_log()` + +`frankenphp_log()` 函数允许你直接从 PHP 应用输出结构化日志, +使日志接入 Datadog、Grafana Loki、Elastic 等平台以及 OpenTelemetry 支持变得更加容易。 + +在底层,`frankenphp_log()` 封装了 [Go 的 `log/slog` 包](https://pkg.go.dev/log/slog),提供丰富的日志功能。 + +这些日志包含严重性级别和可选的上下文数据。 + +```php +function frankenphp_log(string $message, int $level = FRANKENPHP_LOG_LEVEL_INFO, array $context = []): void +``` + +### 参数 + +- **`message`**:日志消息字符串。 +- **`level`**:日志的严重性级别。可以是任意整数。为常用级别提供了便捷常量:`FRANKENPHP_LOG_LEVEL_DEBUG`(`-4`)、`FRANKENPHP_LOG_LEVEL_INFO`(`0`)、`FRANKENPHP_LOG_LEVEL_WARN`(`4`)和 `FRANKENPHP_LOG_LEVEL_ERROR`(`8`)。默认为 `FRANKENPHP_LOG_LEVEL_INFO`。 +- **`context`**:包含在日志条目中的附加数据的关联数组。 + +### 示例 + +```php + memory_get_usage(), + 'peak_usage' => memory_get_peak_usage(), + ], +); + +``` + +查看日志时(例如通过 `docker compose logs`),输出将显示为结构化 JSON: + +```json +{"level":"info","ts":1704067200,"logger":"frankenphp","msg":"Hello from FrankenPHP!"} +{"level":"warn","ts":1704067200,"logger":"frankenphp","msg":"Memory usage high","current_usage":10485760,"peak_usage":12582912} +``` + +## `error_log()` + +FrankenPHP 还允许使用标准的 `error_log()` 函数记录日志。如果 `$message_type` 参数为 `4`(SAPI), +这些消息将被路由到 Caddy 日志记录器。 + +默认情况下,通过 `error_log()` 发送的消息被视为非结构化文本。 +它们适用于与依赖标准 PHP 库的现有应用或库的兼容性。 + +### error_log() 示例 + +```php +error_log("Database connection failed", 4); +``` + +这将出现在 Caddy 日志中,通常带有前缀以表明它来自 PHP。 + +> [!TIP] +> 在生产环境中为了更好的可观测性,建议优先使用 `frankenphp_log()`, +> 因为它允许你按级别(调试、错误等)过滤日志, +> 并在日志基础设施中查询特定字段。 diff --git a/docs/cn/observability.md b/docs/cn/observability.md new file mode 100644 index 0000000000..e78fc325e6 --- /dev/null +++ b/docs/cn/observability.md @@ -0,0 +1,40 @@ +--- +title: 使用指标、日志和 Ember TUI 实现 FrankenPHP 可观测性 +description: 通过 Prometheus 指标、结构化日志、Ember TUI 仪表盘以及自定义 Grafana 抓取配置,在开发和生产环境中监控 FrankenPHP。 +--- + +# 可观测性 + +FrankenPHP 提供内置的可观测性功能:[兼容 Prometheus 的指标](metrics.md)和[结构化日志](logging.md)。 +这些功能与以下推荐工具结合使用,可让你在开发和生产环境中全面了解 PHP 应用的运行状态。 + +## Ember TUI 和 Prometheus 导出器 + +[Ember](https://github.com/alexandre-daubois/ember) 是监控 FrankenPHP 最友好的方式。 + +它连接到 Caddy 的管理 API,并与 FrankenPHP 深度集成,提供零配置、无需外部基础设施的实时可见性。 + +它专为开发和生产环境设计,提供用于本地使用的 TUI 仪表盘,以及用于生产监控的 Prometheus 导出守护进程模式。 + +> [!TIP] +> 请参阅 [Ember 文档](https://github.com/alexandre-daubois/ember)了解完整功能列表和设置详情。 + +## 指标 + +当启用 [Caddy 指标](https://caddyserver.com/docs/metrics)时,FrankenPHP 会暴露兼容 Prometheus 的指标,涵盖线程、worker、请求处理和队列深度。 + +请参阅[指标](metrics.md)页面获取可用指标的完整列表。 + +## 日志 + +FrankenPHP 集成了 Caddy 的日志系统,并提供 `frankenphp_log()` 函数用于结构化日志记录,支持严重级别和上下文数据,便于接入 Datadog、Grafana Loki 或 Elastic 等平台。 + +请参阅[日志](logging.md)页面获取使用详情。 + +## 自定义 Prometheus/Grafana 配置 + +如果你更倾向于自定义监控方案,可以直接抓取 FrankenPHP 的指标。 +有两种方式: + +1. **直接抓取 Caddy**:Caddy 在其管理端点暴露指标(默认:`localhost:2019/metrics`) +2. **通过 Ember 抓取**:当 Ember 以 `--expose` 模式运行时,它会在专用端点上暴露 FrankenPHP 指标以及从 Caddy 数据计算得出的指标(RPS、延迟百分位数、错误率)。