diff --git a/src/Library/LoggerTrait.php b/src/Library/LoggerTrait.php index e1e62f08433b8d75815e48f588916cb02e584fb1..6a4f5ec8ebf8fd345cba6d55bac29896d18d9f98 100644 --- a/src/Library/LoggerTrait.php +++ b/src/Library/LoggerTrait.php @@ -30,14 +30,42 @@ trait LoggerTrait { /** * initialize logger * - * @param array $settings with (optional) keys: name, path, level and format - * @param string $base_dir base direcory for relative paths + * @param array $settings with (optional) keys: name, handler, path, level and format + * @param string $base_dir base directory for relative paths * @return $this */ public function init_logger(array $settings, string $base_dir = ".") { $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 // so only adjust relative paths if (strncmp($path, 'php:', 4) != 0 && strncmp($path, '/', 1)) { @@ -46,18 +74,13 @@ trait LoggerTrait { $level = isset($settings["level"]) ? $settings["level"] : "info"; $format = isset($settings["format"]) ? $settings["format"] : "[%datetime%] %channel% %level_name% %extra% %context%: %message%"; - // create the logger - $logger = new \Monolog\Logger($name); // add stream handler $stream = new \Monolog\Handler\StreamHandler($path, $level); $formatter = new \Monolog\Formatter\LineFormatter("$format\n"); $stream->setFormatter($formatter); $logger->pushHandler($stream); - - return $this->set_logger($logger); } - /** * get logger instance * @return \Psr\Log\LoggerInterface or null if not set diff --git a/tests/Library/LoggerTraitTest.php b/tests/Library/LoggerTraitTest.php index ac19cdaa3d446e8871d1d4b0645eedd9de84ba67..3ef99a2cfad99bb2e75fc84e6408f519f933b991 100644 --- a/tests/Library/LoggerTraitTest.php +++ b/tests/Library/LoggerTraitTest.php @@ -60,7 +60,41 @@ class LoggerTraitTest extends \PHPUnit_Framework_TestCase { $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"); + } + } +}