装完写不进日志的根本原因是php版本、自动加载路径或日志目录权限未对齐;需确认php≥8.1(v3.x)或≥7.2(v2.x),存在composer.json以生成autoload.php,logs/目录手动创建并赋写权限,且开启错误报告验证。

直接运行 composer require monolog/monolog 就能装上,但多数人卡在“装完写不进日志”——根本原因不是命令错了,而是 PHP 版本、自动加载路径或日志目录权限没对齐。
确认 PHP 和 Composer 是否真可用
很多人以为 composer --version 能跑就万事大吉,其实常漏掉两个关键点:
-
php -v必须 ≥ 8.1(若装 v3.x)或 ≥ 7.2(v2.x),否则composer require会静默失败或报Your requirements could not be resolved - 国内环境没设镜像时,
composer require monolog/monolog容易超时卡住;加-vvv可看卡在哪一步,临时换镜像更稳:composer config -g repo.packagist composer https://packagist.phpcomposer.com - 项目根目录下必须有
composer.json(哪怕空的),否则vendor/autoload.php不会生成 —— 没它,Class 'MonologLogger' not found是必然结果
安装时指定版本号比默认更安全
不写版本号,Composer 可能按 PHP 版本自动选 v2 或 v3,导致 PHP 8.1+ 项目出现 Deprecated: Return type 警告。显式指定可避免这类隐性冲突:
- PHP 8.1+ 项目:用
composer require monolog/monolog:^3.0 - PHP 7.2–8.0 项目:用
composer require monolog/monolog:^2.10 - 装完立刻验证:
vendor/autoload.php是否存在?vendor/composer/autoload_classmap.php里有没有"Monolog\"的映射?没有就说明 autoload 没生效
最小示例跑不通?先盯死三个硬条件
别急着配 Formatter 或 Processor,先让 $log->info('ok') 写出一行带时间戳的日志。以下三点任一不满足,就会静默失败或报错:
-
logs/目录必须手动创建,且 Web 服务器用户(如www-data、nginx)有写权限;Permission denied错误常因目录不存在或属主不对 - 开发时务必打开错误报告:
error_reporting(E_ALL); ini_set('display_errors', '1');,否则写入失败可能完全没提示 - 路径统一用正斜杠:
__DIR__ . '/logs/app.log',Windows 下硬拼容易被 Monolog 内部解析出错
能跑通这行:[2026-03-11T22:53:01.123456+00:00] app.INFO: ok [] [],才算真正过了第一关。后面加 Slack 推送、数据库 Handler、日志轮转,都得建立在这个可写、可读、无权限问题的基础上。










