引言:为什么日志记录是可靠PHP应用的基础
日志记录(log)是将应用中发生的事件写入专门日志文件的过程。对于PHP开发者而言,规范的日志记录不仅是"加分项",更是必需品。没有日志记录,生产环境错误调试将变成猜谜游戏,性能监控也变得不可能。配置不当的日志记录可能导致敏感数据泄露,或者相反,丢失关键重要信息。
在本文中,我们将探讨PHP日志记录的最佳实践:从日志库选择、日志级别到消息结构化与安全性。您将学习如何将零散的echo和var_dump转变为专业的监控系统。
1. 日志库选择:PSR-3与Monolog
在现代PHP社区中,事实标准是Psr\\Log\\LoggerInterface接口(PSR-3)。它定义了8种不同日志级别的方法:emergency、alert、critical、error、warning、notice、info、debug。
最流行的PSR-3实现是Monolog库。它灵活、强大,几乎所有现代框架(Laravel、Symfony、Yii2)都支持它。
通过Composer安装Monolog
composer require monolog/monolog基本使用示例
<?phprequire 'vendor/autoload.php';
use Monolog\\Logger;use Monolog\\Handler\\StreamHandler;
// 创建带有频道名称的日志记录器(例如:'my_app')$log = new Logger('my_app');// 添加处理器:写入文件,级别为INFO及以上$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Logger::INFO));
// 记录日志消息$log->info('用户已登录系统', ['user_id' => 123]);$log->warning('密码错误', ['attempts' => 3]);$log->error('数据库连接错误', ['exception' => $e->getMessage()]);?>请注意:第二个参数是上下文(context)。您可以向其中传递任何附加数据:用户ID、IP、调用堆栈等。切勿将数据拼接到消息字符串中——请使用上下文。
2. 日志级别与过滤
使用正确的日志级别是日志可读性的基础。一般规则:级别越高,消息越少。以下是简要速查表:
- DEBUG (100) — 开发调试信息。生产环境通常关闭。
- INFO (200) — 重要事件:用户注册、订单创建。
- NOTICE (250) — 正常但重要的事件。
- WARNING (300) — 异常情况,但应用继续运行(例如登录尝试失败)。
- ERROR (400) — 需要干预的错误(无法保存文件)。
- CRITICAL (500) — 严重错误(数据库不可用)。
- ALERT (550) — 需要立即处理。
- EMERGENCY (600) — 系统不可用。
不同环境的过滤
生产环境中不应记录DEBUG消息——它们会增加磁盘负载并干扰重要记录的查找。为不同环境使用不同的处理器:
<?phpuse Monolog\\Logger;use Monolog\\Handler\\StreamHandler;use Monolog\\Handler\\FingersCrossedHandler;
$log = new Logger('app');
if (getenv('APP_ENV') === 'production') { // 生产环境只记录WARNING及以上级别 $log->pushHandler(new StreamHandler('/var/log/app/error.log', Logger::WARNING)); // FingersCrossedHandler:缓冲所有消息,但仅在出现错误时写入 $log->pushHandler(new FingersCrossedHandler( new StreamHandle