phoole / logger
Slim, simple and full compatible PSR-3 Logger library for PHP
Installs: 16
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/phoole/logger
Requires
- php: >=7.2.0
- phoole/base: ^1.0.20
- psr/log: ^1.0.1
Requires (Dev)
- phpunit/phpunit: ^8
Provides
- psr/log-implementation: 1.0.0
README
Slim, simple and full compatible PSR-3 Logger library for PHP.
Installation
Install via the composer utility.
composer require "phoole/logger"
or add the following lines to your composer.json
{
    "require": {
       "phoole/logger": "1.*"
    }
}
Usage
Create the logger instance with a channel id,
use Psr\Log\LogLevel; use Phoole\Logger\Logger; use Phoole\Logger\Entry\MemoryInfo; use Phoole\Logger\Handler\SyslogHandler; use Phoole\Logger\Handler\TerminalHandler; // with channel id $logger = new Logger('MyApp'); // log every warning to syslog $logger->addHandler( LogLevel::WARNING, new SyslogHandler() ); // log to terminal for MemoryInfo entry $logger->addHandler( LogLevel::INFO, new TerminalHandler(), MemoryInfo::class // handle this log object only ); // log a text message $logger->warning('a warning message'); // log memory usage $logger->info(new MemoryInfo());
Concepts
- 
A log entry is a message in the form of an object. It solves the problem of 'WHAT TO BE SENT OUT'. It has a message template, and some processors to process its context. For example, Entry\MemoryInfois a predefined log entry with a message template of{memory_used}M memory used , peak usage is {memory_peak}Mand oneProcessor\MemoryProcessorprocessor.// with predefined template and processor $logger->warning(new MemoryInfo()); // use new template $logger->warning(new MemoryInfo('Peak memory usage is {memory_peak}M')); Entry\LogEntryis the log entry prototype used whenever text message is to be logged// using LogEntry $logger->info('test only'); To define your own log entry, use Phoole\Logger\Entry\LogEntry; class MyMessage extends LogEntry { // message template protected $message = 'your {template}'; } // add handler $logger->addHandler( 'warning', // level function(LogEntry $entry) { // a handler echo (string) $entry; }, MyMessage::class // handle this type of message only ); // output: 'your wow' $logger->error(new MyMessage(), ['template' => 'wow']); 
- 
Processors are associated with log entry classes. They solve the problem of 'WHAT EXTRA INFO TO SENT OUT'. They will inject information into entries' context. Processors are callable(LogEntryInterface $entry),use Phoole\Logger\Processor\ProcessorAbstract; // closure $processor1 = function(LogEntry $entry) { }; // invokable object $processor2 = new class() { public function __invoke(LogEntry $entry) { } } // extends class Processor3 extends ProcessorAbstract { protected function updateContext(array $context): array { $context['bingo'] = 'wow'; return $context; } } Processors are attached to log entries either in the entry class definition as follows, class MyMessage extends LogEntry { // message template protected $message = 'your {template}'; // define processors for this class protected static function classProcessors(): array { return [ function(LogEntry $entry) { $context = $entry->getContext(); $context['template'] = 'wow'; $entry->setContext($context); }, new myProcessor(), ]; } } or during the handler attachment use Phoole\Logger\Handler\SyslogHandler; // will also add 'Processor1' and 'Processor2' to 'MyMessage' class $logger->addHandler( 'info', new SyslogHandler(), MyMessage::addProcessor( new Processor1(), new Processor2(), ... ) ); 
- 
Handlers solve the problem of 'WHERE TO SEND MESSAGE'. They take a log entry object and send it to somewhere. Handlers takes the form of callable(LogEntryInterface $entry)as follows,use Phoole\Logger\Handler\HandlerAbstract; $handler1 = function(LogEntry $entry) { echo (string) $entry; } $handler2 = new class() { public function __invoke(LogEntry $entry) { } } class Handler3 extends HandlerAbstract { protected function write(LogEntryInterface $entry) { echo $this->>getFormatter()->format($entry); } } Handlers are added to the $loggerwith specific log level and type of log message they are going to handle (default isLogEntryInterface).$logger->addHandler( LogLevel::WARNING, new TerminalHandler(), LogEntryInterface::class // this is the default anyway ); 
- 
Formatters solve the problem of 'HOW MESSAGE WILL BE PRESENTED''. Each handler of the type Handler\HandlerAbstractmay have formatter specified during its initiation.use Phoole\Logger\Handler\TerminalHandler; use Phoole\Logger\Formatter\AnsiFormatter; // use ANSI Color formatter $handler = new TerminalHandler(new AnsiFormatter()); // add handler handles 'ConsoleMessage' ONLY $logger->addHandler('debug', $handler, ConsoleMessage::class); // log to console $logger->info(new ConsoleMessage('exited with error.')); // this will goes handlers handling 'LogEntry' $logger->info('exited with error'); 
APIs
- 
See PSR-3 for standard related APIs. 
- 
- 
__construct(string $channel)Create the logger with a channel id. 
- 
addHandler(string $level, callable $handler, string $entryClass, int $priority = 50): $thisAdd one handler to specified channel with the priority. 
 
- 
- 
Phoole\Logger\Entry\LogEntryrelated- 
static function addProcessor(callable ...$callables): stringThis method will returns called class name. 
 
- 
Testing
$ composer test
Dependencies
- 
PHP >= 7.2.0 
- 
phoole/base 1.*