直接安装 monolog/monolog 即可,它是 php 最通用的日志库;必须用全名、传非空 name 参数、添加 handler 才能输出日志;注意 psr-3 兼容性,避免误用 monolog 特有方法。

直接装 monolog/monolog 就行,不需要单独“日志组件”
Composer 本身不提供日志功能,也没有叫“日志组件”的官方包。你真正要的是 monolog/monolog —— PHP 最通用的日志库。它不是插件,是独立包,装了就能用。
执行这条命令即可:
composer require monolog/monolog
常见错误现象:composer require monolog 失败(缺 vendor 名)或 composer require monolog/plugin 找不到包(根本不存在这个包名)。
- 必须写全名
monolog/monolog,斜杠不能省 - 别信网上搜到的“monolog-core”“php-log”之类别名,它们要么过时,要么非官方
- 如果项目已锁死 PHP 版本(比如
"php": "^7.4"),monolog/monolog ^3.0会装不上,得降级到^2.10
Monolog\Logger 初始化时必须传 name 参数
装完后不能直接 new Logger 就开记,name 是必填项,否则报错:ArgumentCountError: Too few arguments to function Monolog\Logger::__construct()。
最简可用示例:
$logger = new \Monolog\Logger('app');
这个 'app' 是 channel 名,不是随便写的字符串,它会影响日志分类、处理器路由和调试时的上下文识别。
- 同一个应用里多个
Logger实例建议用不同 name(如'db'、'api'),方便后期分流 - name 不能含空格或特殊符号,否则某些处理器(如 SyslogHandler)可能出问题
- 别用
new \Monolog\Logger('')或null,PHP 8+ 会严格报错
不配 Handler 就算写了 info() 也不会输出任何内容
Logger 默认不输出日志——它只负责格式化和分发,真正的写入靠 Handler。没加 Handler,调 $logger->info('hello') 就像往虚空喊话,控制台、文件、Syslog 都看不到。
快速落地的写法(写入文件):
$handler = new \Monolog\Handler\StreamHandler(__DIR__.'/app.log', \Monolog\Logger::DEBUG);<br>$logger->pushHandler($handler);
常见误区:
- 漏掉
pushHandler(),以为 new 完 Handler 就自动生效 - Handler 级别设太高(比如
ERROR),但用了info(),结果日志静默消失 - 路径权限不对:确保 PHP 进程对
app.log所在目录有写权限,否则报Failed to open stream - 开发环境别一上来就配
RotatingFileHandler,先用StreamHandler验证通路
PSR-3 兼容性陷阱:别把 $logger 当成数组或对象属性硬塞
很多框架(Laravel、Symfony)容器里注入的 $logger 是 PSR-3 接口类型(Psr\Log\LoggerInterface),它只保证有 info()、error() 等方法,不保证是 Monolog\Logger 实例。
所以这些写法是错的:
// ❌ 错误:Monolog 特有方法,PSR-3 不承诺存在<br>$logger->pushHandler(...);<br>// ❌ 错误:试图读私有属性<br>var_dump($logger->handlers);
如果你需要操作 Handler 或配置,必须确认类型:
if ($logger instanceof \Monolog\Logger) {<br> $logger->pushHandler(...);<br>}
否则容易在切换日志实现(比如换成 symfony/debug)时直接崩。
实际项目里,Handler 配置通常该交给框架配置层或 DI 容器,而不是运行时手动 push。









