Composer怎么安装日志组件 Composer怎么引入Monolog插件【记录】

7次阅读

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

Composer怎么安装日志组件 Composer怎么引入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

MonologLogger 初始化时必须传 name 参数

装完后不能直接 new Logger 就开记,name 是必填项,否则报错:ArgumentCountError: Too few arguments to function MonologLogger::__construct()

最简可用示例:

$logger = new MonologLogger('app');

这个 'app'channel 名,不是随便写的字符串,它会影响日志分类、处理器路由和调试时的上下文识别。

  • 同一个应用里多个 Logger 实例建议用不同 name(如 'db''api'),方便后期分流
  • name 不能含空格或特殊符号,否则某些处理器(如 SyslogHandler)可能出问题
  • 别用 new MonologLogger('')NULL,PHP 8+ 会严格报错

不配 Handler 就算写了 info() 也不会输出任何内容

Logger 默认不输出日志——它只负责格式化和分发,真正的写入靠 Handler。没加 Handler,调 $logger->info('hello') 就像往虚空喊话,控制台、文件、Syslog 都看不到。

快速落地的写法(写入文件):

$handler = new MonologHandlerStreamHandler(__DIR__.'/app.log', MonologLogger::DEBUG);<br>$logger->pushHandler($handler);

常见误区:

  • 漏掉 pushHandler(),以为 new 完 Handler 就自动生效
  • Handler 级别设太高(比如 ERROR),但用了 info(),结果日志静默消失
  • 路径权限不对:确保 PHP 进程对 app.log 所在目录有写权限,否则报 Failed to open stream
  • 开发环境别一上来就配 RotatingFileHandler,先用 StreamHandler 验证通路

PSR-3 兼容性陷阱:别把 $logger 当成数组或对象属性硬塞

很多框架(laravelsymfony)容器里注入的 $logger 是 PSR-3 接口类型(PsrLogLoggerInterface),它只保证有 info()error() 等方法,不保证是 MonologLogger 实例。

所以这些写法是错的:

// ❌ 错误:Monolog 特有方法,PSR-3 不承诺存在<br>$logger->pushHandler(...);<br>// ❌ 错误:试图读私有属性<br>var_dump($logger->handlers);

如果你需要操作 Handler 或配置,必须确认类型:

if ($logger instanceof MonologLogger) {<br>    $logger->pushHandler(...);<br>}

否则容易在切换日志实现(比如换成 symfony/debug)时直接崩。

实际项目里,Handler 配置通常该交给框架配置层或 DI 容器,而不是运行时手动 push。

text=ZqhQzanResources