diff --git a/.gitignore b/.gitignore index b7f5a8c..bb73309 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ composer.phar composer.lock vendor .idea +*.code-workspace diff --git a/README.md b/README.md index c585195..dff9662 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,40 @@ -Wa72SimpleLogger (collection of PHP logger classes) -=================================================== +# SimpleLogger (collection of PHP logger classes) - Forked from/Credits to wasinger/simplelogger https://github.com/wasinger/simplelogger -Wa72SimpleLogger is a collection of very simple logger classes for PHP 5.4 implementing \Psr\Log\LoggerInterface (PSR-3), +SimpleLogger is a collection of very simple logger classes for PHP 5.4 implementing \Psr\Log\LoggerInterface (PSR-3), the common logger interface standardized by the PHP Framework Interop Group (www.php-fig.org). -Wa72SimpleLogger is intended for small projects or testing purposes if you don't need a full-featured logging solution +SimpleLogger is intended for small projects or testing purposes if you don't need a full-featured logging solution like Monolog. If you just need to output a few log messages in a small PHP project but want to stick to the PSR-3 standard this package is for you. When your project grows you can simply replace it by a more advanced logging solution like Monolog. -Loggers -------- +## Loggers -- \Wa72\SimpleLogger\EchoLogger: Just echo the log message +- \Midweste\SimpleLogger\EchoLogger: Just echo the log message -- \Wa72\SimpleLogger\FileLogger: Log to a file +- \Midweste\SimpleLogger\FileLogger: Log to a file -- \Wa72\SimpleLogger\ArrayLogger: Keep log messages in an array for later use (e.g. display it to the user) +- \Midweste\SimpleLogger\ArrayLogger: Keep log messages in an array for later use (e.g. display it to the user) -- \Wa72\SimpleLogger\ConsoleLogger: Log to the Symfony2 console => *DEPRECATED: use `Symfony\Component\Console\Logger\ConsoleLogger` instead* +- \Midweste\SimpleLogger\SessionLogger: Keep log messages in a session for later use (e.g. display it to the user on another page) +- \Midweste\SimpleLogger\ConsoleLogger: Log to the Symfony2 console => _DEPRECATED: use `Symfony\Component\Console\Logger\ConsoleLogger` instead_ -Installation ------------- +## Installation -- `composer require wa72/simplelogger` +- `composer require midweste/simplelogger` - -Usage ------ +## Usage ```php -$logger = new \Wa72\SimpleLogger\FileLogger('/path/to/logfile'); +$logger = new \Midweste\SimpleLogger\FileLogger('/path/to/logfile'); $logger->info('This is the first log message'); ``` **NEW**: it's now possible to set a minimum log level in the constructor of FileLogger, EchoLogger and ArrayLogger: ```php -$logger = new \Wa72\SimpleLogger\FileLogger('/path/to/logfile', \Psr\Log\LogLevel::ERROR); +$logger = new \Midweste\SimpleLogger\FileLogger('/path/to/logfile', \Psr\Log\LogLevel::ERROR); $logger->info('This is the first log message'); // this message will be discarded $logger->error('This is an error message'); // this message will be logged ``` @@ -52,4 +48,3 @@ In one of my projects there was a "fetcher" class that fetched some information - if called from the command line, it is given a ConsoleLogger - if called from the web interface, it is given an ArrayLogger. The output of this logger is then displayed to the user on the web page. - diff --git a/Wa72SimpleLogger.php b/Wa72SimpleLogger.php deleted file mode 100755 index bb3ae81..0000000 --- a/Wa72SimpleLogger.php +++ /dev/null @@ -1,14 +0,0 @@ -=5.4", - "psr/log":"^1.0.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "autoload":{ - "psr-0":{ - "Wa72\\SimpleLogger":"." - } + "name": "midweste/simplelogger", + "description": "SimpleLogger is a collection of very simple loggers implementing \\Psr\\Log\\LoggerInterface (PSR-3)", + "keywords": [ + "log", + "logger", + "PSR-3" + ], + "homepage": "http://github.com/midwest/simplelogger", + "type": "package", + "license": "MIT", + "authors": [ + { + "name": "midweste" } + ], + "require": { + "php": ">=5.4", + "psr/log": "^1.0.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "autoload": { + "psr-4": { + "Midweste\\SimpleLogger\\": "src/" + } + } } - diff --git a/Wa72/SimpleLogger/AbstractSimpleLogger.php b/src/AbstractSimpleLogger.php similarity index 91% rename from Wa72/SimpleLogger/AbstractSimpleLogger.php rename to src/AbstractSimpleLogger.php index 94aa943..f67e47d 100644 --- a/Wa72/SimpleLogger/AbstractSimpleLogger.php +++ b/src/AbstractSimpleLogger.php @@ -1,5 +1,6 @@ format(\DateTime::RFC3339); } elseif (\is_object($val)) { - $replacements["{{$key}}"] = '[object '.\get_class($val).']'; + $replacements["{{$key}}"] = '[object ' . \get_class($val) . ']'; } else { - $replacements["{{$key}}"] = '['.\gettype($val).']'; + $replacements["{{$key}}"] = '[' . \gettype($val) . ']'; } } @@ -71,4 +72,4 @@ protected function format($level, $message, $context, $timestamp = null) if ($timestamp === null) $timestamp = date('Y-m-d H:i:s'); return '[' . $timestamp . '] ' . strtoupper($level) . ': ' . $this->interpolate($message, $context) . "\n"; } -} \ No newline at end of file +} diff --git a/Wa72/SimpleLogger/ArrayLogger.php b/src/ArrayLogger.php similarity index 98% rename from Wa72/SimpleLogger/ArrayLogger.php rename to src/ArrayLogger.php index d7dda9a..9213ba1 100644 --- a/Wa72/SimpleLogger/ArrayLogger.php +++ b/src/ArrayLogger.php @@ -1,5 +1,7 @@ out = $out; } /** @@ -30,8 +34,7 @@ function __construct(OutputInterface $out) { public function log($level, $message, array $context = array()) { - $message = '<'. $level . '>' . $message . ''; + $message = '<' . $level . '>' . $message . ''; $this->out->writeln($message); } - } diff --git a/Wa72/SimpleLogger/EchoLogger.php b/src/EchoLogger.php similarity index 94% rename from Wa72/SimpleLogger/EchoLogger.php rename to src/EchoLogger.php index c79bb8e..1256ac4 100644 --- a/Wa72/SimpleLogger/EchoLogger.php +++ b/src/EchoLogger.php @@ -1,4 +1,5 @@ min_level = $min_level; + $this->name = (!empty($name) && is_string($name)) ? 'Midweste\SimpleLogger\\' . $name : 'Midweste\SimpleLogger\SessionLogger'; + } + + private function &getSession(): array + { + if (session_status() == PHP_SESSION_NONE) { + session_start(); + } + if (empty($_SESSION[$this->name])) { + $_SESSION[$this->name] = []; + } + return $_SESSION[$this->name]; + } + + public function log($level, $message, array $context = array()) + { + if (!$this->min_level_reached($level)) { + return; + } + $this->getSession()[] = array( + 'timestamp' => date('Y-m-d H:i:s'), + 'level' => $level, + 'message' => $message, + 'context' => $context + ); + } + + /** + * Get all log entries + * + * @param callable|null $formatter An optional formatting function called on every log entry. + * This formatting function gets an array parameter with keys 'timestamp', 'level', 'message', and 'context' + * and must return the new log entry. + * @return array Array of associative log entry arrays with keys 'timestamp', 'level', 'message', and 'context', + * unless the log entries are converted to something else by the $formatter parameter. + */ + public function get($formatter = null) + { + $r = $this->getSession(); + if (is_callable($formatter)) { + foreach ($r as $i => $a) { + $r[$i] = call_user_func($formatter, $a); + } + } + return $r; + } + + /** + * Get all log entries and clear the log + * + * @param callable|null $formatter An optional formatting function called on every log entry. + * This formatting function gets an array parameter with keys 'timestamp', 'level', 'message', and 'context' + * and must return the new log entry. + * @return array Array of associative log entry arrays with keys 'timestamp', 'level', 'message', and 'context' + * unless the log entries are converted to something else by the $formatter parameter. + */ + public function getClear($formatter = null) + { + $r = $this->getSession(); + $this->clear(); + if (is_callable($formatter)) { + foreach ($r as $i => $a) { + $r[$i] = call_user_func($formatter, $a); + } + } + return $r; + } + + /** + * Clear the log + * + */ + public function clear() + { + unset($_SESSION[$this->name]); + } + + /** + * Formatter function that can be used as parameter for the get() and getClear() methods + * + * @param array $a + * @return string + */ + public function formatter(array $a) + { + return $this->format($a['level'], $a['message'], $a['context'], $a['timestamp']); + } +}