A number of PHP libraries accept a Psr\Log\LoggerInterface
for logging messages. Unfortunately, applications using
Zend Framework 2 cannot provide their existing Zend\Log\Logger
loggers, as
they don't comply with PSR-3.
In fact, the two interfaces are not compatible, as they declare some common methods with different signatures. For example: Zend alert vs. Psr alert.
This library serves as a backwards-compatible replacement for Zend\Log\Logger
instances that provides a
Psr\Log-compliant interface to the underlying Zend\Log\Logger
instance. The
result is that you can provide either logger depending on the interface required by a given context, while still
having all messages go through Zend\Log\Logger
and benefiting from its robustness.
The only supported method of installation is Composer.
composer require "michaelmoussa/zend-psr-log"
To begin, you must add the ZendPsrLog
module to your application.config.php
module list as with any ZF2 application.
return [
'modules' => [
...,
'ZendPsrLog',
...
],
...
];
Further configuration depends on how you are presently getting your instances of a Zend\Log\Logger
.
"I define a log
entry in my configuration with Zend\Log\Logger
as the key, and then let Zend\Log\LoggerAbstractServiceFactory
do the work."
Then you're done! ZendPsrLog
adds its own factory for creating Zend\Log\Logger
instances, which will be invoked
before the Abstract Factory.
"I define a log
entry in my configuration with a different key, then let Zend\Log\LoggerAbstractServiceFactory
do the work."
For each key you use, you'll need to add a 'My\Key\Here' => new \ZendPsrLog\LoggerFactory('My\Key\Here')
entry to
your service manager config.
"I define a log key in my configuration with no key, and then have my own 'Zend\Log\Logger' => '...'
factory definition in the service manager config"
You need to replace your 'Zend\Log\Logger' => '...'
entry with
'Zend\Log\Logger' => new \ZendPsrLog\LoggerFactory(null)
, as your definition will override the one done by the
ZendPsrLog\LoggerFactory
.
If your custom factory is doing some special logic, you will have to extend ZendPsrLog\LoggerFactory
on your own to
ensure it persists.
- Please don't. :) You should be using the
ServiceManager
. - Replace
new \Zend\Log\Logger
withnew \ZendPsrLog\Logger
.
The ZendPsrLog\Logger
is an extension of Zend\Log\Logger
, so any class you have in your application that is
presently using a Zend\Log\Logger
can use the ZendPsrLog\Logger
without any additional configuration.
Suppose you have a class that requires a Psr\Log\LoggerInterface
instance:
use Psr\Log\LoggerInterface;
class Foo
{
public function __construct(LoggerInterface $logger) { ... }
}
And you obtain an instance of the ZendPsrLog\Logger
:
/** @var \ZendPsrLog\Logger $logger */
$logger = $serviceManager->get('Zend\Log\Logger');
Just use the ->getPsrLogger()
method to obtain a Psr\Log\LoggerInterface
to your existing Zend\Log\Logger
:
$foo = new Foo($logger->getPsrLogger());