什么是日志
Laravel 的日志系统以**通道(Channel)**这一概念为核心进行设计。 通道是定义日志写入目标和方式的配置单位,可以组合文件、Slack、syslog 等多种输出目标。 内部使用 Monolog 库,可以利用其丰富的 handler 与 formatter。默认使用的是
stack 通道。stack 是把多个通道集中管理的父通道。配置
日志的配置集中在config/logging.php。可通过环境变量 LOG_CHANNEL 切换默认通道。
可用的通道驱动
日志级别
Laravel 支持 RFC 5424 定义的 8 个日志级别。 按严重程度从高到低排列。
通道的
level 配置意味着最低日志级别。
例如 level 为 error 时,只写入 error 及以上(critical、alert、emergency)。
基本用法
Log 门面
使用Illuminate\Support\Facades\Log 门面写入各级别消息。
log() 辅助函数
使用log() 辅助函数可无需 import Log 门面即可写日志。
添加上下文信息
在消息之外传入上下文(数组),可将相关信息一并记录。withContext() — 为整个通道附加公共上下文
若希望为某个特定通道之后所有日志条目附加公共信息,可使用withContext()。
适合像请求 ID 这样希望在所有日志中包含的信息。
shareContext() — 为所有通道附加公共上下文
withContext() 只对目标通道生效,而 shareContext() 会为所有通道附加公共上下文。
通道配置
stack 通道 — 同时写入多个通道
使用stack 通道,一次日志调用即可写入多个通道。
debug 及以上的所有日志会写入 daily(文件),而仅 critical 及以上会同时发送到 slack。
daily 通道 — 日志轮转
daily 通道会按日期分文件,并自动删除旧文件。
向 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 扩展。
安装
基本用法
日志过滤
小结
日志级别的选择
日志级别的选择
通道选择指南
通道选择指南
- 开发环境:使用
single或daily写入文件 - 生产环境:使用
stack组合daily(文件保存)与slack(错误通知) - 特定处理的日志:通过
Log::build()创建按需通道,写入独立文件 - 实时监控:通过
php artisan pail在终端查看
生产环境的注意事项
生产环境的注意事项
debug日志可能包含机密信息。生产环境建议LOG_LEVEL=error及以上。- 请定期轮转日志文件,避免占满磁盘(
daily通道的days配置)。 - 向 Slack 等外部服务发送通知请注意速率限制。请设置为仅通知严重错误。