2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Console\Logger ;
use Psr\Log\AbstractLogger ;
use Psr\Log\InvalidArgumentException ;
use Psr\Log\LogLevel ;
use Symfony\Component\Console\Output\OutputInterface ;
use Symfony\Component\Console\Output\ConsoleOutputInterface ;
/**
2015-10-08 11:40:12 -07:00
* PSR - 3 compliant console logger .
2015-08-17 17:00:26 -07:00
*
* @ author Kévin Dunglas < dunglas @ gmail . com >
2015-10-08 11:40:12 -07:00
*
2017-02-02 16:28:38 -08:00
* @ see http :// www . php - fig . org / psr / psr - 3 /
2015-08-17 17:00:26 -07:00
*/
class ConsoleLogger extends AbstractLogger
{
const INFO = 'info' ;
const ERROR = 'error' ;
/**
* @ var OutputInterface
*/
private $output ;
/**
* @ var array
*/
private $verbosityLevelMap = array (
LogLevel :: EMERGENCY => OutputInterface :: VERBOSITY_NORMAL ,
LogLevel :: ALERT => OutputInterface :: VERBOSITY_NORMAL ,
LogLevel :: CRITICAL => OutputInterface :: VERBOSITY_NORMAL ,
LogLevel :: ERROR => OutputInterface :: VERBOSITY_NORMAL ,
LogLevel :: WARNING => OutputInterface :: VERBOSITY_NORMAL ,
LogLevel :: NOTICE => OutputInterface :: VERBOSITY_VERBOSE ,
LogLevel :: INFO => OutputInterface :: VERBOSITY_VERY_VERBOSE ,
LogLevel :: DEBUG => OutputInterface :: VERBOSITY_DEBUG ,
);
/**
* @ var array
*/
private $formatLevelMap = array (
LogLevel :: EMERGENCY => self :: ERROR ,
LogLevel :: ALERT => self :: ERROR ,
LogLevel :: CRITICAL => self :: ERROR ,
LogLevel :: ERROR => self :: ERROR ,
LogLevel :: WARNING => self :: INFO ,
LogLevel :: NOTICE => self :: INFO ,
LogLevel :: INFO => self :: INFO ,
LogLevel :: DEBUG => self :: INFO ,
);
/**
* @ param OutputInterface $output
* @ param array $verbosityLevelMap
* @ param array $formatLevelMap
*/
public function __construct ( OutputInterface $output , array $verbosityLevelMap = array (), array $formatLevelMap = array ())
{
$this -> output = $output ;
$this -> verbosityLevelMap = $verbosityLevelMap + $this -> verbosityLevelMap ;
$this -> formatLevelMap = $formatLevelMap + $this -> formatLevelMap ;
}
/**
* { @ inheritdoc }
*/
public function log ( $level , $message , array $context = array ())
{
if ( ! isset ( $this -> verbosityLevelMap [ $level ])) {
throw new InvalidArgumentException ( sprintf ( 'The log level "%s" does not exist.' , $level ));
}
// Write to the error output if necessary and available
if ( $this -> formatLevelMap [ $level ] === self :: ERROR && $this -> output instanceof ConsoleOutputInterface ) {
$output = $this -> output -> getErrorOutput ();
} else {
$output = $this -> output ;
}
if ( $output -> getVerbosity () >= $this -> verbosityLevelMap [ $level ]) {
$output -> writeln ( sprintf ( '<%1$s>[%2$s] %3$s</%1$s>' , $this -> formatLevelMap [ $level ], $level , $this -> interpolate ( $message , $context )));
}
}
/**
2015-10-08 11:40:12 -07:00
* Interpolates context values into the message placeholders .
2015-08-17 17:00:26 -07:00
*
* @ author PHP Framework Interoperability Group
*
* @ param string $message
* @ param array $context
*
* @ return string
*/
private function interpolate ( $message , array $context )
{
// build a replacement array with braces around the context keys
$replace = array ();
foreach ( $context as $key => $val ) {
if ( ! is_array ( $val ) && ( ! is_object ( $val ) || method_exists ( $val , '__toString' ))) {
$replace [ sprintf ( '{%s}' , $key )] = $val ;
}
}
// interpolate replacement values into the message and return
return strtr ( $message , $replace );
}
}