Skip to main content

什么是日志

Laravel 的日志系统以**通道(Channel)**这一概念为核心进行设计。 通道是定义日志写入目标和方式的配置单位,可以组合文件、Slack、syslog 等多种输出目标。 内部使用 Monolog 库,可以利用其丰富的 handler 与 formatter。
默认使用的是 stack 通道。stack 是把多个通道集中管理的父通道。

配置

日志的配置集中在 config/logging.php。可通过环境变量 LOG_CHANNEL 切换默认通道。

可用的通道驱动

日志级别

Laravel 支持 RFC 5424 定义的 8 个日志级别。 按严重程度从高到低排列。 通道的 level 配置意味着最低日志级别。 例如 levelerror 时,只写入 error 及以上(criticalalertemergency)。

基本用法

Log 门面

使用 Illuminate\Support\Facades\Log 门面写入各级别消息。
在控制器中的使用示例:

log() 辅助函数

使用 log() 辅助函数可无需 import Log 门面即可写日志。

添加上下文信息

在消息之外传入上下文(数组),可将相关信息一并记录。

withContext() — 为整个通道附加公共上下文

若希望为某个特定通道之后所有日志条目附加公共信息,可使用 withContext()。 适合像请求 ID 这样希望在所有日志中包含的信息。

shareContext() — 为所有通道附加公共上下文

withContext() 只对目标通道生效,而 shareContext() 会为所有通道附加公共上下文。

通道配置

stack 通道 — 同时写入多个通道

使用 stack 通道,一次日志调用即可写入多个通道。
在该配置下,debug 及以上的所有日志会写入 daily(文件),而仅 critical 及以上会同时发送到 slack
在生产环境建议将 slack 通道的级别设置为 errorcritical。 若把琐碎日志都推送到 Slack,通知会过多,重要告警可能被淹没。

daily 通道 — 日志轮转

daily 通道会按日期分文件,并自动删除旧文件。
减小 days 会更快删除旧日志。 为了应对生产环境的故障排查,请保留足够的保留期。

向 Slack 发送错误通知

获取 Slack 的 Incoming Webhook URL 并配置到 .env 中。
slack 加入 stack 通道,并设置 LOG_CHANNEL=stack,即可在错误发生时自动通知。

向指定通道写入日志

通过 Log::channel() 可以明确指定目标通道。

按需通道

使用 Log::build() 可以在不定义配置的前提下临时创建自定义通道。 适合测试或写入到临时输出目标的场景。

实践场景

在中间件中附加请求 ID

若为所有日志附加共同的请求 ID,可方便地从日志中追踪特定请求的处理链路。
1

创建中间件

2

实现 handle() 方法

3

注册中间件

bootstrap/app.php 中注册为全局中间件。
完成上述配置后,所有日志都会自动附加 request-id

记录弃用警告

可将使用 PHP 或 Laravel 的弃用功能时的警告写入日志。
.env 中指定通道。

Laravel Pail — 实时日志监控

Laravel Pail 是可在终端实时查看应用日志的开发工具。它与标准 tail 命令不同,设计上兼容包括 Laravel Nightwatch、Sentry、Flare 在内的任何日志驱动。
执行 Pail 需要 PHP 的 PCNTL 扩展。

安装

基本用法

日志过滤

小结

  • 开发环境:使用 singledaily 写入文件
  • 生产环境:使用 stack 组合 daily(文件保存)与 slack(错误通知)
  • 特定处理的日志:通过 Log::build() 创建按需通道,写入独立文件
  • 实时监控:通过 php artisan pail 在终端查看
  • debug 日志可能包含机密信息。生产环境建议 LOG_LEVEL=error 及以上。
  • 请定期轮转日志文件,避免占满磁盘(daily 通道的 days 配置)。
  • 向 Slack 等外部服务发送通知请注意速率限制。请设置为仅通知严重错误。
最后修改于 2026年8月2日