5分钟快速上手psr/log:composer安装与LoggerInterface入门教程
【免费下载链接】log项目地址: https://gitcode.com/gh_mirrors/lo/log
psr/log 是 PHP 生态中最核心的日志接口标准包,它实现了 PSR-3 规范,定义了LoggerInterface接口和 8 个标准日志级别。无论你的项目用多快多好的日志库,只要依赖 psr/log,就能轻松切换日志实现而不用改一行业务代码。本文带你用 5 分钟完成 composer 安装,并入门LoggerInterface的实际用法。
什么是 psr/log?为什么每个 PHP 项目都该装它
简单来说,psr/log本身不是一个日志器,而是一份"日志器长什么样"的契约(接口)。它只描述一个 logger 应该具备哪些能力:
- 定义了 LoggerInterface,包含
debug、info、error等 9 个标准方法 - 提供了 LogLevel 常量类,统一管理 8 个日志级别
- 附带 LoggerTrait、AbstractLogger 等"脚手架",帮你省掉大量重复代码
打个比方:psr/log 是"插座标准",各种日志库是"电器"。只要电器符合标准,换任何一家产品都能插上就用。
包的基本信息(名称
psr/log、MIT 协议、要求 PHP ≥ 8.0)都记录在 composer.json 中。
一键安装步骤:composer require psr/log
安装只需一条命令,在任意 PHP 项目根目录下执行:
composer require psr/log如果没有使用 composer 管理的项目,也可以先克隆本仓库体验源码:
git clone https://gitcode.com/gh_mirrors/lo/log安装完成后,包会通过 PSR-4 自动加载,命名空间Psr\Log\对应 src/ 目录,无需任何额外配置。
环境要求清单
| 项目 | 要求 |
|---|---|
| PHP 版本 | ≥ 8.0(见 composer.json) |
| 依赖包 | 无(纯接口包,零依赖) |
| 协议 | MIT |
认识 LoggerInterface:8 个日志级别速览
LoggerInterface 一共定义了 9 个方法:8 个按级别划分的方法 + 1 个任意级别的log()通用方法。8 个级别从高到低排列如下:
| 级别 | 常量 | 典型场景 |
|---|---|---|
| emergency | LogLevel::EMERGENCY | 系统不可用,网站整体宕机 |
| alert | LogLevel::ALERT | 需要立即处理,如数据库不可用 |
| critical | LogLevel::CRITICAL | 应用组件失效、未预期的异常 |
| error | LogLevel::ERROR | 运行时错误,需记录并监控 |
| warning | LogLevel::WARNING | 使用了已废弃的 API 等 |
| notice | LogLevel::NOTICE | 正常但值得关注的事件 |
| info | LogLevel::INFO | 用户登录、关键业务动作 |
| debug | LogLevel::DEBUG | 详细的调试信息 |
所有级别常量集中定义在 LogLevel 中,级别名与官方 PSR-3 规范完全一致,这也是所有 PHP 日志库通用的"语言"。
最快上手方法:在你的类中注入一个 Logger
实际使用时,最常见的姿势是依赖注入——类的构造函数接收一个LoggerInterface,运行时再决定用哪个具体日志库。官方示例见 README.md:
public function __construct(LoggerInterface $logger = null) { $this->logger = $logger; }之后在业务代码里随手记录即可:
$this->logger->info('Doing work'); $this->logger->error('Oh no!', ['exception' => $exception]);📌 小贴士:消息支持{foo}形式的占位符,会被第二个参数(context 数组)中对应的键值替换;异常对象要放在名为exception的键下,这是规范约定的"唯一硬规则"。
进阶技巧:NullLogger 与 LoggerAwareTrait
用 NullLogger 告别 if 判断
当你的库允许"不提供日志器"时,直接塞一个 NullLogger 即可——它继承自AbstractLogger,所有方法都是空操作。这样代码里就不用到处写if ($this->logger)了。
用 LoggerAwareTrait 一行接入日志
LoggerAwareInterface 定义了setLogger()方法,而 LoggerAwareTrait 直接提供了现成实现:
use LoggerAwareTrait;一个use让你的类瞬间获得"接受外部日志器"的能力,特别适合那些已经继承了别的类、无法再继承AbstractLogger的场景。
源码目录导航:5 个文件看懂整个包
psr/log 的全部源码都在 src/ 目录下,结构非常精简:
- src/LoggerInterface.php —— 核心接口,本文主角
- src/LogLevel.php —— 8 个级别常量
- src/LoggerTrait.php —— 把 8 个级别方法委托给
log()的 Trait - src/AbstractLogger.php —— 只继承了
LoggerTrait的抽象基类,自己实现log()即可 - src/LoggerAwareTrait.php / src/LoggerAwareInterface.php —— "能接收日志器"的能力
- src/InvalidArgumentException.php —— 非法级别名时抛出的异常
- src/NullLogger.php —— 什么都不做的"空日志器"
常见问题 FAQ
Q:装了 psr/log 就能打日志了吗?不能。它只是接口,不提供输出能力。你需要再搭配一个实现了LoggerInterface的具体日志库(如 Monolog),psr/log 的价值在于让业务代码与具体日志库解耦。
Q:自定义日志级别会报错吗?会。log()方法要求级别必须是LogLevel中定义的 8 个值之一,否则抛出 InvalidArgumentException。
Q:写日志库时需要继承 AbstractLogger 吗?如果你实现的日志器对所有级别处理逻辑一致,继承 AbstractLogger 只需写一个log()方法,其余 8 个方法自动就位——这是官方推荐的"懒人写法"。
🎉 恭喜!你现在已经掌握了 psr/log 的安装与核心用法。下一步建议:在你的项目中引入一个实现了LoggerInterface的日志库,把NullLogger换成真家伙,体验统一的 PSR-3 日志接口带来的便利。
【免费下载链接】log项目地址: https://gitcode.com/gh_mirrors/lo/log
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考