日志
Pin 基于 Laravel 日志体系扩展,提供统一的结构化日志支持。
日志通道
Pin 默认提供结构化 JSON 单文件日志通道。
| 通道 | 说明 |
|---|---|
app | 应用日志、异常日志以及框架运行日志 |
api | API 请求日志 |
sql | SQL 执行日志 |
通道配置
Pin 提供 Pin\Log\Config 用于创建日志通道配置。
单文件通道
Config::single() 创建单文件日志通道:
use Pin\Log\Config;
'app' => Config::single('app'),默认根据通道名称生成日志文件:
storage/logs/{name}.log例如:
Config::single('app')对应:
storage/logs/app.log按天滚动通道
Config::daily() 创建按天滚动日志通道:
Config::daily('app')默认保留最近 14 天日志:
[
'driver' => 'daily',
'days' => 14,
]可以通过参数覆盖默认配置:
Config::daily('app', [
'days' => 30,
]);环境隔离
testing 环境使用独立日志目录,避免测试日志与其他环境日志混合:
storage/testing-logs/{name}.log日志级别
日志级别默认为 debug,可通过环境变量配置:
LOG_{NAME}_LEVEL例如:
LOG_APP_LEVEL=warning对应:
Config::single('app')仅记录 warning 及以上级别日志。
日志格式
Pin 默认使用 JSON 格式输出日志,主要包含以下字段:
| 字段 | 说明 |
|---|---|
datetime | 日志时间 |
message | 日志消息 |
context | 日志上下文数据 |
level | 日志级别 |
level_code | 日志级别编号 |
channel | 日志通道名称 |
extra | 请求上下文等附加信息 |
示例:
{
"datetime": "2026-06-27 10:00:00",
"message": "请求成功",
"context": {
"category": "api",
"status": 200,
"time": 32
},
"level": "DEBUG",
"level_code": 100,
"channel": "api",
"extra": {
"request_id": "16cb517-918e-48cf-9ddb-1879a4d22fbc",
"route": "users"
}
}异常日志会额外包含异常信息:
{
"context": {
"exception": {
"class": "App\\Exceptions\\ExampleException",
"message": "发生异常",
"code": 10001,
"file": "/app/Example.php",
"line": 10
}
}
}异常堆栈记录规则参见异常堆栈。
日志格式化器
可通过 formatter 配置自定义日志格式化器:
'app' => Config::single('app', [
'formatter' => App\Log\CustomFormatter::class,,
])Laravel 默认日志格式:
'app' => Config::single('app', [
'formatter' => null,
])更多日志通道配置请参考 Laravel 日志文档
异常堆栈
Pin 支持记录异常堆栈,并可根据异常类型和调用帧规则控制堆栈内容。
配置
异常堆栈配置位于 config/logging.php:
'stack_trace' => [
'enabled' => env('LOG_STACK_TRACE_ENABLED', false),
'include_exceptions' => [],
'exclude_exceptions' => [],
'max_frames' => 10,
'include_frames' => [],
'exclude_frames' => [
'Illuminate' => 'Illuminate',
],
],配置示例:
'stack_trace' => [
'enabled' => true,
'max_frames' => 20,
'include_frames' => [
'/app/',
],
'exclude_frames' => [
'vendor',
],
],'stack_trace' => [
'enabled' => true,
'include_exceptions' => [
App\Exceptions\PaymentException::class,
],
],// 该配置仅保留匹配 `/app/Services/` 或 `/app/Actions/` 的调用帧。
'stack_trace' => [
'enabled' => true,
'include_frames' => [
'#/app/(Services|Actions)/#',
],
],记录规则
异常堆栈默认关闭:
'enabled' => env('LOG_STACK_TRACE_ENABLED', false)启用后:
- 实现
SkipTrace的异常不会记录堆栈; - 命中
exclude_exceptions的异常不会记录堆栈; include_exceptions为空时,记录所有未排除的异常;include_exceptions不为空时,仅记录指定异常类型。
例如:
'stack_trace' => [
'enabled' => true,
'include_exceptions' => [
App\Exceptions\PaymentException::class,
],
'exclude_exceptions' => [
Illuminate\Validation\ValidationException::class,
],
],表示仅记录 PaymentException 及其子类的堆栈信息,ValidationException 会被排除。
TIP
当异常同时匹配 include_exceptions 和 exclude_exceptions 时,以排除规则为准。
跳过堆栈记录
对于无需记录堆栈的异常,可以实现 SkipTrace 接口:
use Pin\Log\SkipTrace;
use RuntimeException;
class BusinessNoticeException extends RuntimeException implements SkipTrace
{
}调用帧
调用帧示例:
#0/25 /path/app/Services/UserService.php:42 App\Services\UserService->create| 内容 | 说明 |
|---|---|
#0/25 | 当前调用帧序号 / 总帧数 |
file:line | 文件路径和行号 |
class->method | 调用类和方法 |
保留数量由 max_frames 控制:
'max_frames' => 10调用帧过滤
可以通过 include_frames 和 exclude_frames 控制保留的调用帧:
'include_frames' => [],
'exclude_frames' => [
'Illuminate' => 'Illuminate',
],过滤匹配以下字段:
| 字段 | 说明 |
|---|---|
file | 文件路径 |
class | 调用类名 |
function | 方法名 |
规则支持:
| 类型 | 说明 |
|---|---|
| 普通字符串 | 对字段内容进行包含匹配 |
# 开头 | 使用正则表达式匹配 |
API 响应日志
Pin 提供 API 响应日志,用于记录请求结果、异常响应和慢请求信息。
API 响应日志由 Pin\Http\Middleware\LogApiResponse 中间件负责,默认已开启。
配置
API 响应日志配置位于:
config/logging.php
'response' => [
//
],慢请求
logging.response.slow_threshold 支持秒和毫秒:
| 配置 | 阈值 |
|---|---|
2 | 2000ms |
0.5 | 500ms |
500 | 500ms |
规则:
<=10按秒解析;>10按毫秒解析。
默认值为 2,即 2000ms。
记录规则
API 响应日志仅记录符合标准响应结构且未被排除的请求。
记录逻辑如下:
| 条件 | 是否记录 |
|---|---|
| 非标准 JSON 响应 | 否 |
| 命中排除路由 | 否 |
| 调试模式开启 | 记录 |
logging.response.enabled=true | 记录 |
| 业务失败 | 记录 |
| 慢请求 | 记录 |
| 普通成功请求 | 不记录 |
INFO
当调试模式或 logging.response.enabled 开启时,会记录所有符合条件的 API 响应。
默认情况下,仅记录业务失败和慢请求。
日志内容
API 响应日志写入 api channel。
日志级别
| 条件 | 级别 |
|---|---|
HTTP 5xx | error |
| 业务失败 | info |
| 慢请求 | notice |
| 普通请求 | debug |
请求数据
请求数据默认不会记录。
以下情况会记录请求数据:
- 调试模式;
- 业务失败;
- 开启
include_request_payload。
WARNING
生产环境开启请求数据记录时,应注意过滤密码、Token 等敏感信息。
响应数据
响应数据默认会写入日志。
可以通过 logging.response.ignore_response_data 配置不记录响应数据的路由。
当响应数据超过 logging.response.max_length 时会自动截断。
响应数据写入日志前会经过敏感字段脱敏。