mirror of
https://github.com/Seldaek/monolog.git
synced 2025-10-23 09:36:11 +02:00
Add a setter method to allow changing the timezone used when creating
new log records. This provides a means to correct a behavioral change
introduced by 6cbdc04
where use of the PHP runtime default timezone
provided by `date_default_timezone_get()` was introduced. In most
environments the new default behavior is preferable, but if an
application allows the default timezone to vary between requests it
causes confusing log output.
448 lines
13 KiB
PHP
448 lines
13 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Monolog package.
|
|
*
|
|
* (c) Jordi Boggiano <j.boggiano@seld.be>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Monolog;
|
|
|
|
use Monolog\Processor\WebProcessor;
|
|
use Monolog\Handler\TestHandler;
|
|
|
|
class LoggerTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* @covers Monolog\Logger::getName
|
|
*/
|
|
public function testGetName()
|
|
{
|
|
$logger = new Logger('foo');
|
|
$this->assertEquals('foo', $logger->getName());
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::getLevelName
|
|
*/
|
|
public function testGetLevelName()
|
|
{
|
|
$this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR));
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::toMonologLevel
|
|
*/
|
|
public function testConvertPSR3ToMonologLevel()
|
|
{
|
|
$this->assertEquals(Logger::toMonologLevel('debug'), 100);
|
|
$this->assertEquals(Logger::toMonologLevel('info'), 200);
|
|
$this->assertEquals(Logger::toMonologLevel('notice'), 250);
|
|
$this->assertEquals(Logger::toMonologLevel('warning'), 300);
|
|
$this->assertEquals(Logger::toMonologLevel('error'), 400);
|
|
$this->assertEquals(Logger::toMonologLevel('critical'), 500);
|
|
$this->assertEquals(Logger::toMonologLevel('alert'), 550);
|
|
$this->assertEquals(Logger::toMonologLevel('emergency'), 600);
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::getLevelName
|
|
* @expectedException InvalidArgumentException
|
|
*/
|
|
public function testGetLevelNameThrows()
|
|
{
|
|
Logger::getLevelName(5);
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::__construct
|
|
*/
|
|
public function testChannel()
|
|
{
|
|
$logger = new Logger('foo');
|
|
$handler = new TestHandler;
|
|
$logger->pushHandler($handler);
|
|
$logger->addWarning('test');
|
|
list($record) = $handler->getRecords();
|
|
$this->assertEquals('foo', $record['channel']);
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testLog()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
|
|
$handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'));
|
|
$handler->expects($this->once())
|
|
->method('handle');
|
|
$logger->pushHandler($handler);
|
|
|
|
$this->assertTrue($logger->addWarning('test'));
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testLogNotHandled()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
|
|
$handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR));
|
|
$handler->expects($this->never())
|
|
->method('handle');
|
|
$logger->pushHandler($handler);
|
|
|
|
$this->assertFalse($logger->addWarning('test'));
|
|
}
|
|
|
|
public function testHandlersInCtor()
|
|
{
|
|
$handler1 = new TestHandler;
|
|
$handler2 = new TestHandler;
|
|
$logger = new Logger(__METHOD__, array($handler1, $handler2));
|
|
|
|
$this->assertEquals($handler1, $logger->popHandler());
|
|
$this->assertEquals($handler2, $logger->popHandler());
|
|
}
|
|
|
|
public function testProcessorsInCtor()
|
|
{
|
|
$processor1 = new WebProcessor;
|
|
$processor2 = new WebProcessor;
|
|
$logger = new Logger(__METHOD__, array(), array($processor1, $processor2));
|
|
|
|
$this->assertEquals($processor1, $logger->popProcessor());
|
|
$this->assertEquals($processor2, $logger->popProcessor());
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::pushHandler
|
|
* @covers Monolog\Logger::popHandler
|
|
* @expectedException LogicException
|
|
*/
|
|
public function testPushPopHandler()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
$handler1 = new TestHandler;
|
|
$handler2 = new TestHandler;
|
|
|
|
$logger->pushHandler($handler1);
|
|
$logger->pushHandler($handler2);
|
|
|
|
$this->assertEquals($handler2, $logger->popHandler());
|
|
$this->assertEquals($handler1, $logger->popHandler());
|
|
$logger->popHandler();
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::pushProcessor
|
|
* @covers Monolog\Logger::popProcessor
|
|
* @expectedException LogicException
|
|
*/
|
|
public function testPushPopProcessor()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
$processor1 = new WebProcessor;
|
|
$processor2 = new WebProcessor;
|
|
|
|
$logger->pushProcessor($processor1);
|
|
$logger->pushProcessor($processor2);
|
|
|
|
$this->assertEquals($processor2, $logger->popProcessor());
|
|
$this->assertEquals($processor1, $logger->popProcessor());
|
|
$logger->popProcessor();
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::pushProcessor
|
|
* @expectedException InvalidArgumentException
|
|
*/
|
|
public function testPushProcessorWithNonCallable()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
|
|
$logger->pushProcessor(new \stdClass());
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testProcessorsAreExecuted()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
$handler = new TestHandler;
|
|
$logger->pushHandler($handler);
|
|
$logger->pushProcessor(function ($record) {
|
|
$record['extra']['win'] = true;
|
|
|
|
return $record;
|
|
});
|
|
$logger->addError('test');
|
|
list($record) = $handler->getRecords();
|
|
$this->assertTrue($record['extra']['win']);
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testProcessorsAreCalledOnlyOnce()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
$handler = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler->expects($this->any())
|
|
->method('isHandling')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$handler->expects($this->any())
|
|
->method('handle')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$logger->pushHandler($handler);
|
|
|
|
$processor = $this->getMockBuilder('Monolog\Processor\WebProcessor')
|
|
->disableOriginalConstructor()
|
|
->setMethods(array('__invoke'))
|
|
->getMock()
|
|
;
|
|
$processor->expects($this->once())
|
|
->method('__invoke')
|
|
->will($this->returnArgument(0))
|
|
;
|
|
$logger->pushProcessor($processor);
|
|
|
|
$logger->addError('test');
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testProcessorsNotCalledWhenNotHandled()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
$handler = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler->expects($this->once())
|
|
->method('isHandling')
|
|
->will($this->returnValue(false))
|
|
;
|
|
$logger->pushHandler($handler);
|
|
$that = $this;
|
|
$logger->pushProcessor(function ($record) use ($that) {
|
|
$that->fail('The processor should not be called');
|
|
});
|
|
$logger->addAlert('test');
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testHandlersNotCalledBeforeFirstHandling()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
|
|
$handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler1->expects($this->never())
|
|
->method('isHandling')
|
|
->will($this->returnValue(false))
|
|
;
|
|
$handler1->expects($this->once())
|
|
->method('handle')
|
|
->will($this->returnValue(false))
|
|
;
|
|
$logger->pushHandler($handler1);
|
|
|
|
$handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler2->expects($this->once())
|
|
->method('isHandling')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$handler2->expects($this->once())
|
|
->method('handle')
|
|
->will($this->returnValue(false))
|
|
;
|
|
$logger->pushHandler($handler2);
|
|
|
|
$handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler3->expects($this->once())
|
|
->method('isHandling')
|
|
->will($this->returnValue(false))
|
|
;
|
|
$handler3->expects($this->never())
|
|
->method('handle')
|
|
;
|
|
$logger->pushHandler($handler3);
|
|
|
|
$logger->debug('test');
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testBubblingWhenTheHandlerReturnsFalse()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
|
|
$handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler1->expects($this->any())
|
|
->method('isHandling')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$handler1->expects($this->once())
|
|
->method('handle')
|
|
->will($this->returnValue(false))
|
|
;
|
|
$logger->pushHandler($handler1);
|
|
|
|
$handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler2->expects($this->any())
|
|
->method('isHandling')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$handler2->expects($this->once())
|
|
->method('handle')
|
|
->will($this->returnValue(false))
|
|
;
|
|
$logger->pushHandler($handler2);
|
|
|
|
$logger->debug('test');
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::addRecord
|
|
*/
|
|
public function testNotBubblingWhenTheHandlerReturnsTrue()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
|
|
$handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler1->expects($this->any())
|
|
->method('isHandling')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$handler1->expects($this->never())
|
|
->method('handle')
|
|
;
|
|
$logger->pushHandler($handler1);
|
|
|
|
$handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler2->expects($this->any())
|
|
->method('isHandling')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$handler2->expects($this->once())
|
|
->method('handle')
|
|
->will($this->returnValue(true))
|
|
;
|
|
$logger->pushHandler($handler2);
|
|
|
|
$logger->debug('test');
|
|
}
|
|
|
|
/**
|
|
* @covers Monolog\Logger::isHandling
|
|
*/
|
|
public function testIsHandling()
|
|
{
|
|
$logger = new Logger(__METHOD__);
|
|
|
|
$handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler1->expects($this->any())
|
|
->method('isHandling')
|
|
->will($this->returnValue(false))
|
|
;
|
|
|
|
$logger->pushHandler($handler1);
|
|
$this->assertFalse($logger->isHandling(Logger::DEBUG));
|
|
|
|
$handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
|
|
$handler2->expects($this->any())
|
|
->method('isHandling')
|
|
->will($this->returnValue(true))
|
|
;
|
|
|
|
$logger->pushHandler($handler2);
|
|
$this->assertTrue($logger->isHandling(Logger::DEBUG));
|
|
}
|
|
|
|
/**
|
|
* @dataProvider logMethodProvider
|
|
* @covers Monolog\Logger::addDebug
|
|
* @covers Monolog\Logger::addInfo
|
|
* @covers Monolog\Logger::addNotice
|
|
* @covers Monolog\Logger::addWarning
|
|
* @covers Monolog\Logger::addError
|
|
* @covers Monolog\Logger::addCritical
|
|
* @covers Monolog\Logger::addAlert
|
|
* @covers Monolog\Logger::addEmergency
|
|
* @covers Monolog\Logger::debug
|
|
* @covers Monolog\Logger::info
|
|
* @covers Monolog\Logger::notice
|
|
* @covers Monolog\Logger::warn
|
|
* @covers Monolog\Logger::err
|
|
* @covers Monolog\Logger::crit
|
|
* @covers Monolog\Logger::alert
|
|
* @covers Monolog\Logger::emerg
|
|
*/
|
|
public function testLogMethods($method, $expectedLevel)
|
|
{
|
|
$logger = new Logger('foo');
|
|
$handler = new TestHandler;
|
|
$logger->pushHandler($handler);
|
|
$logger->{$method}('test');
|
|
list($record) = $handler->getRecords();
|
|
$this->assertEquals($expectedLevel, $record['level']);
|
|
}
|
|
|
|
public function logMethodProvider()
|
|
{
|
|
return array(
|
|
// monolog methods
|
|
array('addDebug', Logger::DEBUG),
|
|
array('addInfo', Logger::INFO),
|
|
array('addNotice', Logger::NOTICE),
|
|
array('addWarning', Logger::WARNING),
|
|
array('addError', Logger::ERROR),
|
|
array('addCritical', Logger::CRITICAL),
|
|
array('addAlert', Logger::ALERT),
|
|
array('addEmergency', Logger::EMERGENCY),
|
|
|
|
// ZF/Sf2 compat methods
|
|
array('debug', Logger::DEBUG),
|
|
array('info', Logger::INFO),
|
|
array('notice', Logger::NOTICE),
|
|
array('warn', Logger::WARNING),
|
|
array('err', Logger::ERROR),
|
|
array('crit', Logger::CRITICAL),
|
|
array('alert', Logger::ALERT),
|
|
array('emerg', Logger::EMERGENCY),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider setTimezoneProvider
|
|
* @covers Monolog\Logger::setTimezone
|
|
*/
|
|
public function testSetTimezone($tz)
|
|
{
|
|
Logger::setTimezone($tz);
|
|
$logger = new Logger('foo');
|
|
$handler = new TestHandler;
|
|
$logger->pushHandler($handler);
|
|
$logger->info('test');
|
|
list($record) = $handler->getRecords();
|
|
$this->assertEquals($tz, $record['datetime']->getTimezone()->getName());
|
|
}
|
|
|
|
public function setTimezoneProvider()
|
|
{
|
|
return array_map(
|
|
function ($tz) { return array($tz); },
|
|
\DateTimeZone::listIdentifiers()
|
|
);
|
|
}
|
|
}
|