Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions docs/cn/logging.md
Original file line number Diff line number Diff line change
@@ -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
<?php

// 记录一条简单的信息消息
frankenphp_log("Hello from FrankenPHP!");

// 带上下文数据记录一条警告
frankenphp_log(
"Memory usage high",
FRANKENPHP_LOG_LEVEL_WARN,
[
'current_usage' => 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()`,
> 因为它允许你按级别(调试、错误等)过滤日志,
> 并在日志基础设施中查询特定字段。
40 changes: 40 additions & 0 deletions docs/cn/observability.md
Original file line number Diff line number Diff line change
@@ -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、延迟百分位数、错误率)。