5分钟快速上手psr/log:composer安装与LoggerInterface入门教程
2026/9/19 22:05:25 网站建设 项目流程

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,包含debuginfoerror等 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 个级别从高到低排列如下:

级别常量典型场景
emergencyLogLevel::EMERGENCY系统不可用,网站整体宕机
alertLogLevel::ALERT需要立即处理,如数据库不可用
criticalLogLevel::CRITICAL应用组件失效、未预期的异常
errorLogLevel::ERROR运行时错误,需记录并监控
warningLogLevel::WARNING使用了已废弃的 API 等
noticeLogLevel::NOTICE正常但值得关注的事件
infoLogLevel::INFO用户登录、关键业务动作
debugLogLevel::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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询