"require" : {
"eddiejaoude/zf2-logger" : "0.*"
}
Update your dependencies php composer.phar update eddiejaoude/zf2-logger
config/module.config.php.dist
to config/autoload/zf2Logger.global.php
//...
'modules' => array(
'EddieJaoude\Zf2Logger',
),
//...
Then you are good to go. Logging READY! All requests & responses will be logged automatically as DEBUG
As the Zend\Log\Logger
is returned from the Service call, one can use the methods:
//...
$serviceLocator->get('EddieJaoude\Zf2Logger')->emerg('Emergency message');
//...
Instead of using EddieJaoude\Zf2Logger
in your code, put an Alias
in your service manager, therefore allowing you to swap out different logger libraries later on without modifying your code & usage.
i.e.
//...
'aliases' => array(
// alias used, so can be swapped out later without changing any code
'Logger' => 'EddieJaoude\Zf2Logger'
),
//...
Then your usage in your code becomes...
//...
$serviceLocator->get('Logger')->emerg('Emergency message');
//...
Additional default logging information includes:
To log more additional default information, use $logger->addCustomExtra($extraArray)
. Full example below.
alias
to your new service (point 2 below)
i.e. 'aliases' => array(
// ...
'Logger' => 'Zf2Logger',
// ...
),
// ...
'Zf2Logger' => function($sm) {
$logger = $sm->get('EddieJaoude\Zf2Logger');
$logger->addCustomExtra(
array(
'host' => !empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI',
)
);
return $logger;
},
// ...
Each output includes & is prepended with the host - this is especially useful when working with multi layer/tier architecture, i.e. F/E (UI) -> B/E (API). As these can all write to the same output in the stack execution order or alternatively to different outputs.
2014-01-09T16:28:23+00:00 DEBUG (7): Array
(
[zf2.local] => Array
(
[Request] => Zend\Uri\Http Object
(
[validHostTypes:protected] => 19
[user:protected] =>
[password:protected] =>
[scheme:protected] => http
[userInfo:protected] =>
[host:protected] => zf2.local
[port:protected] =>
[path:protected] => /api/user
[query:protected] =>
[fragment:protected] =>
)
)
)
2014-01-09T16:28:24+00:00 DEBUG (7): Array
(
[zf2.local] => Array
(
[Response] => Array
(
[statusCode] => 200
[content] => {"total":2,"data":[{"id":"12345 ...
...
)
)
)
return array(
'EddieJaoude\Zf2Logger' => array(
// will add the $logger object before the current PHP error handler
'registerErrorHandler' => 'true', // errors logged to your writers
'registerExceptionHandler' => 'true', // exceptions logged to your writers
// do not log binary responses
// mime types reference http://www.sitepoint.com/web-foundations/mime-types-complete-list/
'doNotLog' => array(
'mediaTypes' => array(
'application/octet-stream',
'image/png',
'image/jpeg',
'application/pdf'
),
),
// multiple zend writer output & zend priority filters
'writers' => array(
'standard-file' => array(
'adapter' => '\Zend\Log\Writer\Stream',
'options' => array(
'output' => 'data/application.log', // path to file
),
// options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
'filter' => \Zend\Log\Logger::DEBUG,
'enabled' => true
),
'tmp-file' => array(
'adapter' => '\Zend\Log\Writer\Stream',
'options' => array(
'output' => '/tmp/application-' . $_SERVER['SERVER_NAME'] . '.log', // path to file
),
// options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
'filter' => \Zend\Log\Logger::DEBUG,
'enabled' => false
),
'standard-output' => array(
'adapter' => '\Zend\Log\Writer\Stream',
'options' => array(
'output' => 'php://output'
),
// options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
'filter' => \Zend\Log\Logger::NOTICE,
'enabled' => $_SERVER['APPLICATION_ENV'] == 'development' ? true : false
),
'standard-error' => array(
'adapter' => '\Zend\Log\Writer\Stream',
'options' => array(
'output' => 'php://stderr'
),
// options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
'filter' => \Zend\Log\Logger::NOTICE,
'enabled' => true
)
)
)
);
To run unit tests (from root diectory)
curl -sS https://getcomposer.org/installer | php
php composer.phar install
vendor/bin/phpunit -c tests/phpunit.xml
2014-05-08T19:46:43+01:00 DEBUG (7): Array
(
[zf2.be.local] => Array
(
[Request] => Zend\Uri\Http Object
(
[validHostTypes:protected] => 19
[user:protected] =>
[password:protected] =>
[scheme:protected] => http
[userInfo:protected] =>
[host:protected] => zf2.local
[port:protected] => 8080
[path:protected] => /api/ddc
[query:protected] =>
[fragment:protected] =>
)
)
)
2014-05-08T19:46:43+01:00 DEBUG (7): Authorisation Check
Role: System Admin
Resource: api-ddc
Method: post
IsAllowed: 1
2014-05-08T19:46:43+01:00 DEBUG (7): Authorisation Check
Role: OPG User
Resource: api-ddc
Method: post
IsAllowed:
2014-05-08T19:46:43+01:00 INFO (6): Import: Starting...
2014-05-08T19:46:43+01:00 INFO (6): Import: Loaded XML (SET.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Found XSD SET.xsd (module/Ddc/src/Ddc/Validator/SET.xsd)
2014-05-08T19:46:43+01:00 INFO (6): Import: Validated XML (SET.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Loaded XML (LPA002.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Found XSD LPA002.xsd (module/Ddc/src/Ddc/Validator/LPA002.xsd)
2014-05-08T19:46:43+01:00 INFO (6): Import: Validated XML (LPA002.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Failed. 'P1 DOB' was not in the expected format d/m/Y H:i:s
2014-05-08T19:46:43+01:00 DEBUG (7): Array
(
[zf2.local] => Array
(
[Response] => Array
(
[statusCode] => 400
[content] => {"data":{"success":false},"additionalData":null}
)
)
)
Ideas & requirements welcome.