Composer 默认安装 Monolog v3 要求 PHP ≥ 8.1,而 PHP 7.4–8.0 需显式指定 composer require monolog/monolog:^2.10 才能正确安装兼容版本。

直接执行 composer require monolog/monolog 就能装上,但默认装的是 v3.x,它要求 PHP ≥ 8.1 —— 如果你用的是 PHP 7.4 或 8.0,会报错退出,不是网络问题,是版本锁死。
为什么 composer require monolog/monolog 会失败?
常见错误信息是:Your requirements could not be resolved to an installable set of packages.,背后真实原因是 Monolog v3 强制依赖 psr/log ^3.0 和 PHP ≥ 8.1;而 Laravel 8/9、Symfony 5 等老项目仍跑在 PHP 7.4–8.0 上,它们需要的是 Monolog v2。
- Monolog v2(推荐用于 PHP 7.4–8.0):支持
psr/log ^1.1 || ^2.0,兼容性更广 - Monolog v3(仅限 PHP 8.1+):移除了对
psr/log ^1.0的支持,且用了 PHP 8.1 特性(如枚举) - Composer 默认倾向最新稳定版,不会自动降级适配你的 PHP 版本
如何指定安装 Monolog v2?
显式声明版本约束,让 Composer 明白你要什么:
composer require monolog/monolog:^2.10
这个命令会拉取 v2 最后一个维护分支(v2.10.x),它同时支持 PHP 7.2+ 和 psr/log ^1.1 || ^2.0,和绝大多数主流框架无冲突。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 不要写
^2.0—— 它可能命中早期不稳定的 v2.0.0(已知与某些 PSR-3 实现有兼容问题) - 也不要写
2.10.*—— Composer 不识别这种通配,会报Could not parse version constraint - 如果项目里已有旧版 Monolog(比如 v1),
require会触发升级,Composer 会自动处理 autoloader 重映射
装完怎么验证是否生效?
别急着写日志逻辑,先确认类能被正确加载:
php -a
> var_dump(class_exists('Monolog\Logger'));
// 输出 bool(true)再检查实际加载的版本:
composer show monolog/monolog
输出中应包含 versions : * 2.10.2(或类似 v2.x 补丁号)。
- 如果
class_exists返回 false,大概率是 autoloader 没刷新 —— 运行composer dump-autoload - 如果
composer show显示 v3.x,说明前面没加^2.10约束,得删掉vendor/monolog和composer.lock中相关行,重装 - Monolog v2 的核心类命名空间仍是
Monolog\*,和 v1/v3 一致,迁移成本低
真正容易被忽略的是 PHP 版本和 psr/log 的隐式耦合 —— Composer 不会告诉你“你 PHP 太低”,只会说“依赖无法满足”。盯住 composer show php 和 composer why psr/log 才能快速定位根因。

















