public function testOverringDefaultFunctionalityWithEvents()
 {
     $log = new Logger('emails');
     // should only have a database handler.
     $this->assertEquals(count($log->getHandlers()), 1);
     $this->assertEquals(count(Log::getHandlers()), 2);
     // this should still have the same stream handler from last test.
     $handler = new \Monolog\Handler\TestHandler(Logger::CRITICAL, false);
     $listener = Events::addListener('on_logger_create', function ($event) use($handler) {
         $logger = $event->getLogger();
         $formatter = new \Monolog\Formatter\LineFormatter();
         $handler->setFormatter($formatter);
         $logger->pushHandler($handler);
         return $logger;
     });
     $log2 = new Logger('transactions');
     $log3 = new Logger('testing');
     $this->assertEquals(count($log2->getHandlers()), 2);
     $this->assertEquals(count($log3->getHandlers()), 2);
     $log2->info('This is a test.');
     $log2->debug('This is a test.');
     $log3->debug('This is a test.');
     $log3->critical("oh boy this is big.");
     $log3->alert("Everything is broken.");
     $log3->emergency("Get out of bed.");
     $db = Database::get();
     $r = $db->GetAll('select * from Logs');
     $this->assertEquals(count($r), 3);
     // only the non-critical, non-alert, non-emergency items.
     $this->assertEquals(count($handler->getRecords()), 3);
     $records = $handler->getRecords();
     $this->assertEquals($records[0]['level'], Logger::CRITICAL);
     $this->assertEquals($records[1]['level'], Logger::ALERT);
     $this->assertEquals($records[2]['level'], Logger::EMERGENCY);
     $this->assertEquals($records[2]['message'], 'Get out of bed.');
     $listeners = Events::getListeners('on_logger_create');
     Events::removeListener('on_logger_create', $listeners[0]);
     // AND we pop the stream handler from the previous test
     Log::popHandler();
 }