diff --git a/composer.json b/composer.json index b71a24042c8a5b4c73209a3d01302c53037a076c..28174e95c7ac3a9955ecf94e9ff8165dc5c66b5c 100644 --- a/composer.json +++ b/composer.json @@ -9,14 +9,14 @@ "homepage": "http://library.wur.nl" } ], - "version": "0.1.2", + "version": "0.2.0", "require": { "php": ">=7.0.0", "guzzlehttp/guzzle": "^6.3" }, "autoload": { "psr-4": { - "Library\\": "src/library" + "Library\\": "src/Library" } }, "require-dev": { diff --git a/src/library/LoggerTrait.php b/src/Library/LoggerTrait.php similarity index 80% rename from src/library/LoggerTrait.php rename to 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/src/library/Webquery.php b/src/Library/Webquery.php similarity index 100% rename from src/library/Webquery.php rename to src/Library/Webquery.php diff --git a/tests/Library/LoggerTraitTest.php b/tests/Library/LoggerTraitTest.php new file mode 100644 index 0000000000000000000000000000000000000000..3ef99a2cfad99bb2e75fc84e6408f519f933b991 --- /dev/null +++ b/tests/Library/LoggerTraitTest.php @@ -0,0 +1,100 @@ +<?php +namespace Tests\Library; + + +class Logger { + use \Library\LoggerTrait; +} + +class LoggerTraitTest extends \PHPUnit_Framework_TestCase { + + + public function test_default_init_logger() { + + $testlog = new \Tests\Library\Logger(); + $this->assertNull($testlog->get_logger(), "no logger without init_logger()"); + + $testlog->init_logger([]); + $logger = $testlog->get_logger(); + $this->assertInstanceOf("\Monolog\Logger", $logger, 'get_logger() returns instance of \Monolog\Logger'); + $this->assertEquals("default", $logger->getName(), "default name"); + $handlers = $logger->getHandlers(); + $this->assertEquals(1, count($handlers), "default logger has 1 handler"); + $handler = $handlers[0]; + $this->assertInstanceOf("\Monolog\Handler\StreamHandler", $handler, 'default log handler is a StreamHandler'); + $this->assertEquals("php://stderr", $handler->getUrl(), "default log handler path (url)"); + $this->assertEquals(\Monolog\Logger::toMonologLevel("info"), $handler->getLevel(), "default log handler level is 'info'"); + $formatter = $handler->getFormatter(); + $this->assertInstanceOf("\Monolog\Formatter\LineFormatter", $formatter, 'default log handler formatter is a LineFormatter'); + } + + + public function test_init_logger_single_handler() { + + $settings = [ + "name" => "test-logger", + "path" => "log/test.log", + "level" => "debug", + "format" => "[%datetime%]%level_name% %extra% %context%: %message%", // not testable + ]; + + $testlog = new \Tests\Library\Logger(); + $testlog->init_logger($settings); + $logger = $testlog->get_logger(); + $this->assertEquals($settings["name"], $logger->getName(), "name"); + $handlers = $logger->getHandlers(); + $this->assertEquals(1, count($handlers), "logger has 1 handler"); + $handler = $handlers[0]; + $this->assertEquals("./" . $settings["path"], $handler->getUrl(), "log handler path (with default basedir)"); + $this->assertEquals(\Monolog\Logger::toMonologLevel($settings["level"]), $handler->getLevel(), "log handler level"); + + $basedir = "/var/log/local"; + $testlog = new \Tests\Library\Logger(); + $testlog->init_logger($settings, $basedir); + $logger = $testlog->get_logger(); + $this->assertEquals($settings["name"], $logger->getName(), "name"); + $handlers = $logger->getHandlers(); + $this->assertEquals(1, count($handlers), "logger has 1 handler"); + $handler = $handlers[0]; + $this->assertEquals("$basedir/" . $settings["path"], $handler->getUrl(), "log handler path (with passed basedir)"); + $this->assertEquals(\Monolog\Logger::toMonologLevel($settings["level"]), $handler->getLevel(), "log handler level"); + } + + + 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"); + } + } + +} diff --git a/tests/library/WebqueryTest.php b/tests/Library/WebqueryTest.php similarity index 100% rename from tests/library/WebqueryTest.php rename to tests/Library/WebqueryTest.php