Skip to content
Snippets Groups Projects
Commit 8a35aa5f authored by Hoop, Bert Jan de's avatar Hoop, Bert Jan de
Browse files

L05DOCBST-38 add support for multiple handlers

parent 3255adc9
No related branches found
No related tags found
No related merge requests found
...@@ -30,14 +30,42 @@ trait LoggerTrait { ...@@ -30,14 +30,42 @@ trait LoggerTrait {
/** /**
* initialize logger * initialize logger
* *
* @param array $settings with (optional) keys: name, path, level and format * @param array $settings with (optional) keys: name, handler, path, level and format
* @param string $base_dir base direcory for relative paths * @param string $base_dir base directory for relative paths
* @return $this * @return $this
*/ */
public function init_logger(array $settings, string $base_dir = ".") { public function init_logger(array $settings, string $base_dir = ".") {
$name = isset($settings["name"]) ? $settings["name"] : "default"; $name = isset($settings["name"]) ? $settings["name"] : "default";
$path = isset($settings["path"]) ? $settings["path"] : "php://stderr"; // create the logger
$logger = new \Monolog\Logger($name);
// add handlers
if (isset($settings["handler"])) {
foreach ($settings["handler"] as $handler) {
$this->add_handler($logger, $handler, $base_dir);
}
} else {
// if no handler array the settings
// then the handler parameters are in the settings (backward compatibility)
$this->add_handler($logger, $settings, $base_dir);
}
return $this->set_logger($logger);
}
/**
* initialize logger
*
* @param Monolog\Logger $logger logger instance
* @param array $settings with (optional) keys: path, level and format
* @param string $base_dir base directory for relative paths
* @return $this
*/
protected function add_handler($logger, array $settings, string $base_dir) {
$path = isset($settings["path"]) ? $settings["path"] : "php://stderr";
// adjust log path if it is not a php i/o stream or absolute path // adjust log path if it is not a php i/o stream or absolute path
// so only adjust relative paths // so only adjust relative paths
if (strncmp($path, 'php:', 4) != 0 && strncmp($path, '/', 1)) { if (strncmp($path, 'php:', 4) != 0 && strncmp($path, '/', 1)) {
...@@ -46,18 +74,13 @@ trait LoggerTrait { ...@@ -46,18 +74,13 @@ trait LoggerTrait {
$level = isset($settings["level"]) ? $settings["level"] : "info"; $level = isset($settings["level"]) ? $settings["level"] : "info";
$format = isset($settings["format"]) ? $settings["format"] : "[%datetime%] %channel% %level_name% %extra% %context%: %message%"; $format = isset($settings["format"]) ? $settings["format"] : "[%datetime%] %channel% %level_name% %extra% %context%: %message%";
// create the logger
$logger = new \Monolog\Logger($name);
// add stream handler // add stream handler
$stream = new \Monolog\Handler\StreamHandler($path, $level); $stream = new \Monolog\Handler\StreamHandler($path, $level);
$formatter = new \Monolog\Formatter\LineFormatter("$format\n"); $formatter = new \Monolog\Formatter\LineFormatter("$format\n");
$stream->setFormatter($formatter); $stream->setFormatter($formatter);
$logger->pushHandler($stream); $logger->pushHandler($stream);
return $this->set_logger($logger);
} }
/** /**
* get logger instance * get logger instance
* @return \Psr\Log\LoggerInterface or null if not set * @return \Psr\Log\LoggerInterface or null if not set
......
...@@ -60,7 +60,41 @@ class LoggerTraitTest extends \PHPUnit_Framework_TestCase { ...@@ -60,7 +60,41 @@ class LoggerTraitTest extends \PHPUnit_Framework_TestCase {
$this->assertEquals(\Monolog\Logger::toMonologLevel($settings["level"]), $handler->getLevel(), "log handler level"); $this->assertEquals(\Monolog\Logger::toMonologLevel($settings["level"]), $handler->getLevel(), "log handler level");
} }
}
/*********** Helper Functions **************/ public function test_init_logger_two_handlers() {
$basedir = "/var/log/local";
$settings = [
"name" => "test-logger",
"handler" => [
[
"path" => "log/test.log",
"expectpath" => "$basedir/log/test.log", // expected path for testing
"level" => "debug",
"format" => "[%datetime%]%level_name% %extra% %context%: %message%", // not testable
],
[
"path" => "php://stdout",
"expectpath" => "php://stdout",
"level" => "warning",
"format" => "[%datetime%]%level_name% %extra% %context%: %message%", // not testable
],
],
];
$testlog = new \Tests\Library\Logger();
$testlog->init_logger($settings, $basedir);
$logger = $testlog->get_logger();
$this->assertEquals($settings["name"], $logger->getName(), "name");
$expects = $settings["handler"];
$handlers = $logger->getHandlers();
$this->assertEquals(count($expects), count($handlers), "number of handlers in settings");
for ($i = 0; $i < count($expects); $i++) {
$expect = $expects[$i];
$handler = array_pop($handlers); // handlers are in reverse order
$this->assertEquals($expect["expectpath"], $handler->getUrl(), "$i: log handler path");
$this->assertEquals(\Monolog\Logger::toMonologLevel($expect["level"]), $handler->getLevel(), "$i: log handler level");
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment