PHP 应用程序中的日志记录:实践中的最佳实践
日志记录不仅仅是把错误写入文件。它是监控、调试和审计应用程序运行的策略性工具。在本文中,我们将探讨如何在实际中组织 PHP 日志记录,使用现代方法和库。您将学习如何避免常见错误,使日志真正有用。
1. 选择库与 PSR-3 标准
在现代 PHP 社区中,事实上的标准是 PSR-3 (Logger Interface) 接口。它定义了一套统一的日志记录方法,使得无需重写应用程序代码即可轻松更换日志记录库。
最流行的 PSR-3 实现是 Monolog 库。它灵活、高性能,并拥有众多“处理器”(handlers),用于将日志发送到文件、数据库、Slack、Telegram、电子邮件和云服务。
通过 Composer 安装 Monolog:
composer require monolog/monolog基本使用示例:
<?phprequire 'vendor/autoload.php';
use Monolog\\Logger;use Monolog\\Handler\\StreamHandler;
// 创建日志通道(channel)——通常按应用程序或模块名称命名$log = new Logger('my_app');// 添加处理器:将 WARNING 及以上级别的日志写入文件$log->pushHandler(new StreamHandler(__DIR__ . '/logs/app.log', Logger::WARNING));
// 现在可以记录日志了$log->warning('用户 {username} 尝试使用错误密码登录', ['username' => 'ivan']);$log->error('无法连接到数据库:{error}', ['error' => $e->getMessage()]);?>为什么这很重要? 使用 PSR-3 使您的代码独立于特定的库。如果明天您想从 Monolog 切换到其他实现(例如 Log4php),您只需要更改日志记录器的初始化,而无需更改所有调用 $log->error() 的地方。
2. 日志级别:何时使用什么
PSR-3 定义了 8 个日志级别(从最低优先级到最高):DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY。正确使用这些级别是创建可读且有用日志的基础。
- DEBUG — 仅开发人员需要的详细调试信息(变量值、调用跟踪)。仅在开发环境中启用。
- INFO — 应用程序运行中的重要事件:用户注册、订单创建、cron 任务完成。
- NOTICE — 正常但值得注意的事件(例如,使用已弃用的 API)。
- WARNING — 未阻止脚本执行的潜在问题(登录尝试失败、数据库查询缓慢)。
- ERROR — 需要干预的错误:异常、外部服务故障。
- CRITICAL — 严重故障:数据库连接丢失、内存不足。
- ALERT — 需要管理员立即采取行动(网站不可访问)。
- EMERGENCY — 整个系统无法运行。
实用建议: 为不同级别配置不同的处理器。例如,将 WARNING 及以上级别写入文件,而 ERROR 及以上级别则额外发送到 Telegram/Slack。
// 示例:为同一个日志记录器配置两个处理器$log->pushHandler(new StreamHandler(__DIR__ . '/logs/all.log', Logger::DEBUG));$log->pushHandler(new StreamHandler(__DIR__ . '/logs/errors.log', Logger::ERROR));// 对于严重错误——发送到 Telegram$log->pushHandler(new TelegramBotHandler('TOKEN', 'CHAT_ID', Logger::CRITICAL));3. 结构化日志与上下文
其中一项关键