[Console] Display errors in quiet mode

This commit is contained in:
Olaf Klischat 2016-05-13 20:26:50 +02:00 committed by Fabien Potencier
parent bcdf568a19
commit 278c26f589
4 changed files with 65 additions and 4 deletions

View File

@ -49,6 +49,7 @@ class ConsoleHandler extends AbstractProcessingHandler implements EventSubscribe
* @var array
*/
private $verbosityLevelMap = array(
OutputInterface::VERBOSITY_QUIET => Logger::ERROR,
OutputInterface::VERBOSITY_NORMAL => Logger::WARNING,
OutputInterface::VERBOSITY_VERBOSE => Logger::NOTICE,
OutputInterface::VERBOSITY_VERY_VERBOSE => Logger::INFO,
@ -154,7 +155,8 @@ class ConsoleHandler extends AbstractProcessingHandler implements EventSubscribe
*/
protected function write(array $record)
{
$this->output->write((string) $record['formatted']);
// at this point we've determined for sure that we want to output the record, so use the output's own verbosity
$this->output->write((string) $record['formatted'], false, $this->output->getVerbosity());
}
/**
@ -172,10 +174,11 @@ class ConsoleHandler extends AbstractProcessingHandler implements EventSubscribe
*/
private function updateLevel()
{
if (null === $this->output || OutputInterface::VERBOSITY_QUIET === $verbosity = $this->output->getVerbosity()) {
if (null === $this->output) {
return false;
}
$verbosity = $this->output->getVerbosity();
if (isset($this->verbosityLevelMap[$verbosity])) {
$this->setLevel($this->verbosityLevelMap[$verbosity]);
} else {

View File

@ -55,12 +55,35 @@ class ConsoleHandlerTest extends \PHPUnit_Framework_TestCase
$this->assertSame($isHandling, $handler->isHandling(array('level' => $level)),
'->isHandling returns correct value depending on console verbosity and log level'
);
// check that the handler actually outputs the record if it handles it
$levelName = Logger::getLevelName($level);
$realOutput = $this->getMock('Symfony\Component\Console\Output\Output', array('doWrite'));
$realOutput->setVerbosity($verbosity);
$realOutput
->expects($isHandling ? $this->once() : $this->never())
->method('doWrite')
->with("[2013-05-29 16:21:54] app.$levelName: My info message \n", false);
$handler = new ConsoleHandler($realOutput, true, $map);
$infoRecord = array(
'message' => 'My info message',
'context' => array(),
'level' => $level,
'level_name' => Logger::getLevelName($level),
'channel' => 'app',
'datetime' => new \DateTime('2013-05-29 16:21:54'),
'extra' => array(),
);
$this->assertFalse($handler->handle($infoRecord), 'The handler finished handling the log.');
}
public function provideVerbosityMappingTests()
{
return array(
array(OutputInterface::VERBOSITY_QUIET, Logger::ERROR, false),
array(OutputInterface::VERBOSITY_QUIET, Logger::ERROR, true),
array(OutputInterface::VERBOSITY_QUIET, Logger::WARNING, false),
array(OutputInterface::VERBOSITY_NORMAL, Logger::WARNING, true),
array(OutputInterface::VERBOSITY_NORMAL, Logger::NOTICE, false),
array(OutputInterface::VERBOSITY_VERBOSE, Logger::NOTICE, true),

View File

@ -88,8 +88,10 @@ class ConsoleLogger extends AbstractLogger
$output = $this->output;
}
// the if condition check isn't necessary -- it's the same one that $output will do internally anyway.
// We only do it for efficiency here as the message formatting is relatively expensive.
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)));
$output->writeln(sprintf('<%1$s>[%2$s] %3$s</%1$s>', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]);
}
}

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Console\Tests\Logger;
use Psr\Log\Test\LoggerInterfaceTest;
use Psr\Log\LogLevel;
use Symfony\Component\Console\Logger\ConsoleLogger;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Tests\Fixtures\DummyOutput;
use Symfony\Component\Console\Output\OutputInterface;
@ -55,4 +56,36 @@ class ConsoleLoggerTest extends LoggerInterfaceTest
{
return $this->output->getLogs();
}
/**
* @dataProvider provideOutputMappingParams
*/
public function testOutputMapping($logLevel, $outputVerbosity, $isOutput, $addVerbosityLevelMap = array())
{
$out = new BufferedOutput($outputVerbosity);
$logger = new ConsoleLogger($out, $addVerbosityLevelMap);
$logger->log($logLevel, 'foo bar');
$logs = $out->fetch();
$this->assertEquals($isOutput ? "[$logLevel] foo bar\n" : '', $logs);
}
public function provideOutputMappingParams()
{
$quietMap = array(LogLevel::EMERGENCY => OutputInterface::VERBOSITY_QUIET);
return array(
array(LogLevel::EMERGENCY, OutputInterface::VERBOSITY_NORMAL, true),
array(LogLevel::WARNING, OutputInterface::VERBOSITY_NORMAL, true),
array(LogLevel::INFO, OutputInterface::VERBOSITY_NORMAL, false),
array(LogLevel::DEBUG, OutputInterface::VERBOSITY_NORMAL, false),
array(LogLevel::INFO, OutputInterface::VERBOSITY_VERBOSE, false),
array(LogLevel::INFO, OutputInterface::VERBOSITY_VERY_VERBOSE, true),
array(LogLevel::DEBUG, OutputInterface::VERBOSITY_VERY_VERBOSE, false),
array(LogLevel::DEBUG, OutputInterface::VERBOSITY_DEBUG, true),
array(LogLevel::ALERT, OutputInterface::VERBOSITY_QUIET, false),
array(LogLevel::EMERGENCY, OutputInterface::VERBOSITY_QUIET, false),
array(LogLevel::ALERT, OutputInterface::VERBOSITY_QUIET, false, $quietMap),
array(LogLevel::EMERGENCY, OutputInterface::VERBOSITY_QUIET, true, $quietMap),
);
}
}