/** * @covers ::getDefaultFormatter */ public function testHandlerUsesLineFormatterWhichIgnoresEmptyArrays() { $record = array('message' => 'msg', 'context' => array(), 'level' => Logger::DEBUG, 'level_name' => Logger::getLevelName(Logger::DEBUG), 'channel' => 'channel', 'datetime' => new \DateTime(), 'extra' => array()); $expectedFormatter = new LineFormatter(null, null, true, true); $expected = $expectedFormatter->format($record); $handlerFormatter = $this->handler->getFormatter(); $actual = $handlerFormatter->format($record); $this->assertEquals($expected, $actual, 'Empty context and extra arrays should not be rendered'); }
/** * {@inheritDoc} */ protected function write(array $record) { $data = $record['context']; $data['level'] = Logger::getLevelName($record['level']); $data['message'] = $record['message']; $this->logger->post($record['channel'], $data); }
public function testWrite() { $data = $this->record; $data['level'] = Logger::getLevelName($data['level']); $tag = $data['channel'] . '.' . $data['message']; $loggerMock = $this->getMockBuilder('Fluent\\Logger\\FluentLogger')->disableOriginalConstructor()->getMock(); $loggerMock->expects($this->once())->method('post')->with('debug.monolog.fluent', $data); $handler = new FluentHandler($loggerMock); $handler->write($this->record); }
public function testWritingAndFormatting() { $output = $this->getMock('Symfony\\Component\\Console\\Output\\OutputInterface'); $output->expects($this->any())->method('getVerbosity')->will($this->returnValue(OutputInterface::VERBOSITY_DEBUG)); $output->expects($this->once())->method('write')->with('<info>[2013-05-29 16:21:54] app.INFO:</info> My info message ' . "\n"); $handler = new ConsoleHandler(null, false); $handler->setOutput($output); $infoRecord = array('message' => 'My info message', 'context' => array(), 'level' => Logger::INFO, 'level_name' => Logger::getLevelName(Logger::INFO), 'channel' => 'app', 'datetime' => new \DateTime('2013-05-29 16:21:54'), 'extra' => array()); $this->assertTrue($handler->handle($infoRecord), 'The handler finished handling the log as bubble is false.'); }
public function testWrite() { $fluentLogger = $this->getMock('Fluent\\Logger\\FluentLogger', array(), array(), '', false); $record = $this->getRecord(); $expectedContext = $record['context']; $expectedContext['level'] = Logger::getLevelName($record['level']); $expectedContext['message'] = $record['message']; $fluentLogger->expects($this->once())->method('post')->with($record['channel'], $expectedContext); $handler = new FluentdHandler($fluentLogger); $handler->handle($record); }
/** * @return array Record */ protected function getRecord($level = Logger::WARNING, $message = 'test') { return array( 'message' => $message, 'context' => array(), 'level' => $level, 'level_name' => Logger::getLevelName($level), 'channel' => 'test', 'datetime' => new \DateTime(), 'extra' => array(), ); }
/** * {@inheritdoc} */ protected function write(array $record) { if (isset($record['context']) && isset($record['context']['tag'])) { $tag = $record['context']['tag']; } else { $tag = $this->tag; } $tag = $tag . '.' . $this->env; $data = $record; $data['level'] = Logger::getLevelName($record['level']); $this->logger->post($tag, $data); }
/** * Save records into database in batch * * @param array $records * * @throws \Exception */ protected function save(array $records) { if ($this->hasError === true) { $this->fallback->handleBatch($records); return; } $data = []; foreach ($records as $record) { // ['message', 'context', 'level', 'channel', 'created_at', 'extra'] <= Single row format $data[] = [Log::FIELD_MESSAGE => $record['message'], Log::FIELD_CONTEXT => serialize((array) $record['context']), Log::FIELD_LEVEL => Logger::getLevelName($record['level']), Log::FIELD_CHANNEL => $record['channel'], Log::FIELD_CREATED_AT => $record['datetime'] instanceof \DateTime ? Carbon::instance($record['datetime']) : Carbon::now(), Log::FIELD_EXTRA => serialize((array) $record['extra'])]; } try { $this->container->make('db')->connection()->table((new Log())->getTable())->insert($data); } catch (\Exception $ex) { $this->hasError = true; $this->fallback->handleBatch($records); throw $ex; } }
public function testProvidingNullLineFormatToGetMonologDefault() { $logfileName = 'nullFormatterTest.log'; $this->cleanUpLogFile($logfileName); $command = $this->registerCommand(new LoggingCommand()); EncapsulationViolator::invokeMethod($command, 'setLogFilename', array($logfileName)); EncapsulationViolator::invokeMethod($command, 'setConsoleLogLineFormat', array(null)); EncapsulationViolator::invokeMethod($command, 'setFileLogLineFormat', array(null)); $commandTester = $this->executeCommand($command); // Generate what the default format looks like $lineFormatter = new \Monolog\Formatter\LineFormatter(null); $record = array('message' => 'The quick brown fox jumps over the lazy dog', 'context' => array(), 'level' => Logger::EMERGENCY, 'level_name' => Logger::getLevelName(Logger::EMERGENCY), 'channel' => $command->getLogger()->getName(), 'datetime' => new \DateTime('1970-01-01 00:00:00'), 'extra' => array()); $exampleLine = $lineFormatter->format($record); $exampleLine = trim(str_replace('[1970-01-01 00:00:00]', '', $exampleLine)); // strip out date as this wont match // Test console format $this->assertRegExp('/' . $exampleLine . '/', $commandTester->getDisplay(), 'Console log line format does not seem to match the Monolog default'); // Test default logfile format $this->assertRegExp('/' . $exampleLine . '/', $this->getLogfileContents($logfileName), 'File log line format does not seem to match the Monolog default'); $this->cleanUpLogFile($logfileName); }
/** * Converts a given log level string to a log level integer. * * @param string $logLevelStr Values could be DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY * @return int * @throws \Exception */ public static function parseLogLevel($logLevelStr) { if (is_numeric($logLevelStr)) { return (int) $logLevelStr; } else { switch (strtoupper($logLevelStr)) { case Logger::getLevelName(Logger::DEBUG): $logLevel = Logger::DEBUG; break; case Logger::getLevelName(Logger::INFO): $logLevel = Logger::INFO; break; case Logger::getLevelName(Logger::NOTICE): $logLevel = Logger::NOTICE; break; case Logger::getLevelName(Logger::WARNING): $logLevel = Logger::WARNING; break; case Logger::getLevelName(Logger::ERROR): $logLevel = Logger::ERROR; break; case Logger::getLevelName(Logger::CRITICAL): $logLevel = Logger::CRITICAL; break; case Logger::getLevelName(Logger::ALERT): $logLevel = Logger::ALERT; break; case Logger::getLevelName(Logger::EMERGENCY): $logLevel = Logger::EMERGENCY; break; default: throw new \Exception("Log level '{$logLevelStr}' is not supported!'"); } return $logLevel; } }
/** * @return array Record */ protected function getRecord($level = Logger::WARNING, $message = 'test', $context = array()) { return array('message' => $message, 'context' => $context, 'level' => $level, 'level_name' => Logger::getLevelName($level), 'channel' => 'test', 'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))), 'extra' => array()); }
/** * Convert a Monolog log level to textual equivalent. * * @param integer $level * * @return string */ public function logLevel($level) { if (!is_numeric($level)) { return $level; } try { return ucfirst(strtolower(\Monolog\Logger::getLevelName($level))); } catch (\Exception $e) { return $level; } }
protected function getRecord($level = Logger::WARNING) { return array('level' => $level, 'level_name' => Logger::getLevelName($level), 'channel' => 'log', 'Record' => 'foo', 'datetime' => new \DateTime(), 'extra' => array()); }
public static function getLevelName($level) { return Logger::getLevelName($level); }
/** * @return array Record */ protected function getRecord($level = Logger::WARNING, $message = 'test', $context = []) { return ['message' => $message, 'context' => $context, 'level' => $level, 'level_name' => Logger::getLevelName($level), 'channel' => 'test', 'datetime' => new DateTimeImmutable(true), 'extra' => []]; }
/** * Sends the log header * * @see sendHeader() */ protected function send() { if (self::$overflowed || !self::$sendHeaders) { return; } if (!self::$initialized) { self::$initialized = true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; } $json = @json_encode(self::$json); $data = base64_encode(utf8_encode($json)); if (strlen($data) > 240 * 1024) { self::$overflowed = true; $record = array('message' => 'Incomplete logs, chrome header size limit reached', 'context' => array(), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'monolog', 'datetime' => new \DateTime(), 'extra' => array()); self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); $json = @json_encode(self::$json); $data = base64_encode(utf8_encode($json)); } if (trim($data) !== '') { $this->sendHeader(self::HEADER_NAME, $data); } }
/** * @return array */ private function getRecord() { return array('message' => 'Test', 'context' => array('someContextVar' => 'val'), 'level' => Logger::DEBUG, 'level_name' => Logger::getLevelName(Logger::DEBUG), 'channel' => 'test', 'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))), 'extra' => array()); }
/** * Set (new) log level. * * @param $level * * @return $this */ public function setLevel($level) { // Check if specified level is a valid Monolog level Logger::getLevelName($level); $this->level = $level; return $this; }
public function recordProvider() { return [[['channel' => 'unittest', 'message' => 'This is it.', 'context' => [], 'formatted' => 'This is formatted.', 'level' => Logger::DEBUG], 'unittest', ['message' => 'This is it.', 'level' => Logger::getLevelName(Logger::DEBUG)]], [['channel' => 'unittest', 'message' => 'This is it.', 'context' => ['Here' => 'Comes the sun.'], 'formatted' => 'This is formatted.', 'level' => Logger::DEBUG], 'unittest', ['Here' => 'Comes the sun.', 'message' => 'This is it.', 'level' => Logger::getLevelName(Logger::DEBUG)]]]; }
/** * @param \DateTime $dateTime * @param string $message * @param array $context * @param array $extra * @return array Record */ private function getRecord(\DateTime $dateTime, $message = 'test', $context = array(), $extra = array()) { return array('message' => $message, 'context' => $context, 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => $dateTime, 'extra' => $extra); }
/** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context */ public function log($level, $message, array $context = array()) { $this->logger->{$this->logger->getLevelName($level)}($message, $context); }
/** * {@inheritDoc} */ public function write(array $record) { $tag = $record['channel']; $this->logger->post($tag, array_merge($record['context'], ['level' => Logger::getLevelName($record['level']), 'message' => $record['message']])); }
public function testAddsLongAttachmentWithContextAndExtra() { $level = Logger::ERROR; $levelName = Logger::getLevelName($level); $record = new SlackRecord($this->channel, 'Monolog', true, null, false, true); $loggerRecord = $this->getRecord($level, 'test', array('test' => 1)); $loggerRecord['extra'] = array('tags' => array('web')); $data = $record->getSlackData($loggerRecord); $expectedFields = array(array('title' => 'Level', 'value' => $levelName, 'short' => true), array('title' => 'tags', 'value' => '["web"]', 'short' => false), array('title' => 'test', 'value' => 1, 'short' => false)); $attachment = $data['attachments'][0]; $this->assertArrayHasKey('title', $attachment); $this->assertArrayHasKey('fields', $attachment); $this->assertCount(3, $attachment['fields']); $this->assertSame('Message', $attachment['title']); $this->assertSame($expectedFields, $attachment['fields']); }
/** * Returns the RFC 5424 string name of the current log level * * @return string */ public function getLevelName() { return Logger::getLevelName($this->getLogLevel()); }
/** * @param array $record * * @return bool * * @throws \Joli\JoliNotif\Exception\InvalidNotificationException */ protected function write(array $record) { $this->notification->setTitle(sprintf('[%s] %s', Logger::getLevelName($this->level), $this->name))->setBody(addslashes($record['formatted'])); return $this->notifier && $this->notifier->send($this->notification); }
/** * @author LAHAXE Arnaud * * @param $id * * @return \Symfony\Component\HttpFoundation\Response */ public function show($id) { $filename = storage_path('clockwork/' . $id . '.json'); if (!is_file($filename)) { return response()->json([], 404); } $profile = json_decode(file_get_contents($filename)); if (is_bool($profile)) { return response()->json([], 503); } $profile->id = $id; $profile->timestamp = Carbon::createFromTimestamp($profile->time)->timestamp; $profile->datetime = Carbon::createFromTimestamp($profile->time)->toIso8601String(); $profile->duration = floor($profile->responseDuration); $profile->nbSqlQueries = count($profile->databaseQueries); $start = $profile->timelineData->total->start; foreach ($profile->timelineData as $key => $item) { $profile->timelineData->{$key}->start = floor(($item->start - $start) * 1000); $profile->timelineData->{$key}->end = floor(($item->end - $start) * 1000); $profile->timelineData->{$key}->duration = floor($item->duration); } foreach ($profile->log as $key => $item) { $profile->log[$key]->time = floor(($profile->log[$key]->time - $start) * 1000); // log from monolog use number instread of string if (is_numeric($profile->log[$key]->level)) { $profile->log[$key]->level = Logger::getLevelName($profile->log[$key]->level); } $profile->log[$key]->level = strtoupper($profile->log[$key]->level); } return response()->json($profile); }
/** * @covers Monolog\Logger::getLevelName * @expectedException InvalidArgumentException */ public function testGetLevelNameThrows() { Logger::getLevelName(5); }
public function levelsProvider() { return array(array(Logger::DEBUG, Logger::getLevelName(Logger::DEBUG), ':pencil2:'), array(Logger::INFO, Logger::getLevelName(Logger::INFO), ':white_check_mark:'), array(Logger::NOTICE, Logger::getLevelName(Logger::NOTICE), ':loudspeaker:'), array(Logger::WARNING, Logger::getLevelName(Logger::WARNING), ':warning:'), array(Logger::ERROR, Logger::getLevelName(Logger::ERROR), ':bangbang:'), array(Logger::CRITICAL, Logger::getLevelName(Logger::CRITICAL), ':fire:'), array(Logger::ALERT, Logger::getLevelName(Logger::ALERT), ':no_entry:'), array(Logger::EMERGENCY, Logger::getLevelName(Logger::EMERGENCY), ':boom:')); }
/** * The loglevel may be changed after the log handlers are initialised. If this is the case, this function will * update the handlers and note the chance in the log * * @param int $logLevel * * @return RuntimeConfig * @throws BaseCommandException */ public function setLogLevel($logLevel) { if (!in_array($logLevel, Logger::getLevels())) { $message = "'" . $logLevel . "' is not a valid LOGLEVEL. " . "Valid values as command line parameters are: " . implode(',', array_keys(Logger::getLevels())) . " and valid values when updating the log level in code are: " . implode(',', Logger::getLevels()); throw new BaseCommandException($message); } $this->logLevel = $logLevel; if ($this->getExecutionPhase() == self::PHASE_LOAD_PARAMETERS) { // LogLevel changed at RunTime via parameter $this->logConfigDebug('LOG LEVEL CHANGED VIA PARAMETER: ' . Logger::getLevelName($logLevel)); } elseif ($this->getExecutionPhase() >= self::PHASE_INITIALISE) { // LogLevel changed after the log handlers have been initialised /* @var $handler AbstractHandler */ foreach ($this->getCommand()->getLogger()->getHandlers() as $handler) { $handler->setLevel($logLevel); } // Note in log that log level has been changed so that the new verbosity in the log is understood $this->logConfigDebug('LOG LEVEL CHANGED: ' . Logger::getLevelName($logLevel)); } return $this; }
public function testFormatDepthException() { $record = array('message' => 'some log message', 'context' => array('nest2' => new \Exception('exception message', 987)), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => new \DateTime('2014-02-01 00:00:00'), 'extra' => array()); $formatter = new MongoDBFormatter(2, false); $formattedRecord = $formatter->format($record); $this->assertEquals('exception message', $formattedRecord['context']['nest2']['message']); $this->assertEquals(987, $formattedRecord['context']['nest2']['code']); $this->assertEquals('[...]', $formattedRecord['context']['nest2']['trace']); }