/** * {@inheritDoc} */ public function register(Container $container) { // Append custom settings with missing params from default settings $container['settings']['logger'] = self::mergeWithDefaultSettings($container['settings']['logger']); /** * Add dependency (DI). * * @param Container $c * * @return Logger */ $container['logger'] = function (Container $c) { $settings = $c['settings']['logger']; $loggerFormat = "[%datetime%] %level_name% %message% %context% %extra%\n"; $loggerTimeFormat = "Y-m-d H:i:s"; $loggerTimeZone = new DateTimeZone('Europe/Berlin'); $logger = new Logger($settings['name']); if ($settings['color']) { $logger->pushProcessor(new ConsoleColorProcessor()); } $logger->pushProcessor(new CleanupProcessor($settings['trimPaths'])); $logger->pushProcessor(new IntrospectionProcessor(Logger::WARNING)); $logger->pushProcessor(new ProcessIdProcessor()); $logger->pushProcessor(new PsrLogMessageProcessor()); $logger->setTimezone($loggerTimeZone); $logger->useMicrosecondTimestamps(false); // Using microseconds is buggy (2016-08-04) $formatter = new LineFormatter($loggerFormat, $loggerTimeFormat); $formatter->ignoreEmptyContextAndExtra(true); $defaultHandler = new StreamHandler('php://stdout', $settings['level'], $bubble = false); $defaultHandler->setFormatter($formatter); $logger->pushHandler($defaultHandler); $errorHandler = new StreamHandler('php://stderr', Logger::ERROR, $bubble = false); $errorHandler->setFormatter($formatter); $logger->pushHandler($errorHandler); // Register logger as default PHP error, exception and shutdown handler // Note: Make sure only this handler handles errors (set $callPrevious to false) $errorHandler = ErrorHandler::register($logger, $errorLevelMap = false, $exceptionLevelMap = false); $errorHandler->registerErrorHandler($levelMap = [], $callPrevious = false); $errorHandler->registerExceptionHandler($levelMap = [], $callPrevious = false); return $logger; }; }
public function addDebugLogger(Logger $logger, SymfonyStyle $output) { $lineFormatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message%\n"); $lineFormatter->allowInlineLineBreaks(true); $lineFormatter->ignoreEmptyContextAndExtra(true); $stdoutHandler = new PsrHandler(new ConsoleLogger($output)); $stdoutHandler->setFormatter($lineFormatter); $logger->pushHandler($stdoutHandler); }
/** * @param FormatterInterface $formatter * * @return array */ public function getFormattedLogArray($formatter = null) { $res = []; if ($formatter === null) { $formatter = new LineFormatter(); } foreach ($this->buffer as $record) { $res[] = trim($formatter->format($record)); } return $res; }
/** * @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'); }
protected function setLogger(&$c) { $c['Logger'] = function () { $log = new Logger('ErrorLogger'); $handler = new ErrorLogHandler(); $formatter = new LineFormatter(); $formatter->includeStacktraces(); $handler->setFormatter($formatter); $log->pushHandler($handler); return $log; }; }
/** * {@inheritdoc} */ public function format(array $record) { $record['start_tag'] = ''; $record['end_tag'] = ''; if ($record['level'] >= Logger::ERROR) { $record['start_tag'] = '<error>'; $record['end_tag'] = '</error>'; } elseif ($record['level'] == Logger::FAIL) { $record['start_tag'] = '<fail>'; $record['end_tag'] = '</fail>'; } elseif ($record['level'] >= Logger::WARNING) { $record['start_tag'] = '<info>'; $record['end_tag'] = '</info>'; } elseif ($record['level'] >= Logger::NOTICE) { $record['start_tag'] = '<comment>'; $record['end_tag'] = '</comment>'; } elseif ($record['level'] >= Logger::INFO) { $record['start_tag'] = '<info>'; $record['end_tag'] = '</info>'; } elseif ($record['level'] >= Logger::DEBUG) { $record['start_tag'] = '<comment>'; $record['end_tag'] = '</comment>'; } return parent::format($record); }
/** * {@inheritdoc} */ public function format(array $record) { // Retrieve the line and file if set and remove them from the formatted extra $file = $line = ''; if (isset($record['extra']['file'])) { $file = $record['extra']['file']; unset($record['extra']['file']); } if (isset($record['extra']['line'])) { $line = $record['extra']['line']; unset($record['extra']['line']); } // Format record according with LineFormatter $message = parent::format($record); // Create JSON object describing the appearance of the message in the console $json = json_encode(array( array( 'Type' => $this->logLevels[$record['level']], 'File' => $file, 'Line' => $line, 'Label' => $record['channel'], ), $message, )); // The message itself is a serialization of the above JSON object + it's length return sprintf( '%s|%s|', strlen($json), $json ); }
/** * {@inheritdoc} */ public function format(array $record) { $str = parent::format($record); $str = str_replace('%time%', $record['datetime']->format('H:i:s'), $str); $str = str_replace('%csv%', $this->csvify($record['context']), $str); return rtrim($str, $this->delimiter); }
/** * {@inheritdoc} */ protected function normalize($data) { if ($data instanceof Exception) { return $this->normalizeException($data); } return parent::normalize($data); }
protected function normalize($data) { if (is_object($data) && !$data instanceof \DateTime) { $data = ["[object] (" . get_class($data) . ")" => get_object_vars($data)]; } return parent::normalize($data); }
/** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { $dataArray = array('token' => $this->token, 'channel' => $this->channel, 'username' => $this->username, 'text' => '', 'attachments' => array()); if ($this->useAttachment) { $attachment = array('fallback' => $record['message'], 'color' => $this->getAttachmentColor($record['level'])); if ($this->useShortAttachment) { $attachment['fields'] = array(array('title' => $record['level_name'], 'value' => $record['message'], 'short' => false)); } else { $attachment['fields'] = array(array('title' => 'Message', 'value' => $record['message'], 'short' => false), array('title' => 'Level', 'value' => $record['level_name'], 'short' => true)); } if ($this->includeExtra) { $extra = ''; foreach ($record['extra'] as $var => $val) { $extra .= $var . ': ' . $this->lineFormatter->stringify($val) . " | "; } $extra = rtrim($extra, " |"); $attachment['fields'][] = array('title' => "Extra", 'value' => $extra, 'short' => false); } $dataArray['attachments'] = json_encode(array($attachment)); } else { $dataArray['text'] = $record['message']; } if ($this->iconEmoji) { $dataArray['icon_emoji'] = ":{$this->iconEmoji}:"; } return http_build_query($dataArray); }
/** * {@inheritdoc} */ public function format(array $record) { // Get the Color Scheme $colorScheme = $this->getColorScheme(); // Let the parent class to the formatting, yet wrap it in the color linked to the level return $colorScheme->getColorizeString($record['level']) . trim(parent::format($record)) . $colorScheme->getResetString() . "\n"; }
/** * {@inheritdoc} */ public function format(array $record) { $tag = strtolower($record['level_name']); $record['start_tag'] = '<' . $tag . '>'; $record['end_tag'] = '</' . $tag . '>'; return parent::format($record); }
/** * @param mixed $data * * @return mixed * @throws \InvalidArgumentException * @throws \RuntimeException */ protected function normalize($data) { if ($data instanceof \DateTime) { return substr($data->format($this->dateFormat), 0, 14); } return parent::normalize($data); }
/** * @param array $record * @return array|mixed|string */ public function format(array $record) { $output = parent::format($record); if ($this->editFormatted) { $output = $this->editFormatted($output); } return $output; }
/** * {@inheritdoc} */ public function format(array $record) { $output = parent::format($record); $output .= PHP_EOL . print_r($_SERVER, true); $output .= PHP_EOL . print_r($_SESSION, true); return $output; //return str_replace('\n', '<br>', $output); }
protected function normalize($data) { if ($data instanceof CsvFile) { return "csv file: " . $data->getFilename(); } else { return parent::normalize($data); } }
/** * @param string $format The format of the message * @param Boolean $logContext If true add multiple rows containing Context information * @param Boolean $logExtra If true add multiple rows containing Extra information * @param integer $numberOfWords The number of words to show. */ public function __construct($format = null, $logContext = true, $logExtra = true, $numberOfWords = 2) { $this->format = $format ?: static::SIMPLE_FORMAT; $this->numberOfWords = $numberOfWords; $this->logContext = $logContext; $this->logExtra = $logExtra; parent::__construct(); }
/** * {@inheritdoc} */ public function format(array $record) { $output = trim(parent::format($record)); if ($this->maxLength !== null && strlen($output) > $this->maxLength) { $output = substr($output, 0, $this->maxLength - 3) . '...'; } return $output; }
/** * @param array $record * @return mixed|string */ public function format(array $record) { $this->logCounter++; $output = parent::format($record); $output = str_replace('%counter%', $this->logCounter, $output); $output = str_replace('%req-id%', $this->reqId, $output); return $output; }
/** * Formats a log record. * * @param array $record A record to format * @return mixed The formatted record */ public function format(array $record) { $formatted = parent::format($record); $levelName = strtolower($record['level_name']); $wrapped = sprintf('<%1$s>%2$s</%1$s>', $levelName, $formatted); $result = $this->getOutputFormatter()->format($wrapped); return $result; }
/** * Stringifies an array of key/value pairs to be used in attachment fields * * @param array $fields * @access protected * @return string */ protected function stringify($fields) { $string = ''; foreach ($fields as $var => $val) { $string .= $var . ': ' . $this->lineFormatter->stringify($val) . " | "; } $string = rtrim($string, " |"); return $string; }
/** * {@inheritdoc} */ public function format(array $record) { // Format record according with LineFormatter $message = parent::format($record); // Create JSON object describing the appearance of the message in the console $json = json_encode(array(array('Type' => $this->logLevels[$record['level']], 'File' => '', 'Line' => ''), $message)); // The message itself is a serialization of the above JSON object + it's length return sprintf('%s|%s|', strlen($json), $json); }
public function format(array $record) { $record['codeInfo'] = ''; if (isset($record['extra']['class']) && isset($record['extra']['function']) && isset($record['extra']['line'])) { $record['codeInfo'] = $record['extra']['class'] . '::' . $record['extra']['function'] . ':' . $record['extra']['line']; } //return parent return parent::format($record); }
/** * @inheritdoc */ public function stringify($value) { if (is_array($value)) { $result = []; foreach ($value as $k => $v) { $result[] = "{$k}={$v}"; } return '[' . implode(', ', $result) . ']'; } return parent::stringify($value); }
/** * Creates instance of Swift_Message to be sent * * @param string $content formatted email body to be sent * @param array $records Log records that formed the content * @return \Swift_Message */ protected function buildMessage($content, array $records) { $message = null; if ($this->messageTemplate instanceof \Swift_Message) { $message = clone $this->messageTemplate; $message->generateId(); } elseif (is_callable($this->messageTemplate)) { $message = call_user_func($this->messageTemplate, $content, $records); } if (!$message instanceof \Swift_Message) { throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); } if ($records) { $subjectFormatter = new LineFormatter($message->getSubject()); $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); } $message->setBody($content); $message->setDate(time()); return $message; }
public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false) { parent::__construct($format, $dateFormat, $allowInlineLineBreaks, $ignoreEmptyContextAndExtra); if (empty($format)) { if (php_sapi_name() == "cli") { $this->format = "[%datetime%] (cli) %level_name%: %message% %extra%\n"; } else { $this->format = "[%datetime%] (%extra.ip%:%user%) %extra.http_method% %extra.url%[%extra.referrer%]\n%message%\n%context%\n\n"; } } }
/** * {@inheritdoc} */ public function format(array $record) { $vars = $this->normalizerFormatter->format($record); $output = $this->format; foreach ($vars['extra'] as $var => $val) { if (false !== strpos($output, '%extra.' . $var . '%')) { $output = str_replace('%extra.' . $var . '%', var_export($val, true), $output); unset($vars['extra'][$var]); } } foreach ($vars as $var => $val) { if (false !== strpos($output, '%' . $var . '%')) { $val_output = ''; if (is_array($val) && count($val) > 0 || is_array($val) === false) { $val_output = var_export($val, true); } $output = str_replace('%' . $var . '%', $val_output, $output); } } return $output; }
/** * Get the plain text message with LineFormatter's format method and add * metadata including the trace id then return the json string. * * @param array $record A record to format * @return mixed The formatted record */ public function format(array $record) { $message = parent::format($record); list($usec, $sec) = explode(" ", microtime()); $usec = (int) ((double) $usec * 1000000000); $sec = (int) $sec; $payload = ['message' => $message, 'timestamp' => ['seconds' => $sec, 'nanos' => $usec], 'thread' => '', 'severity' => $record['level_name']]; if (isset($_SERVER['HTTP_X_CLOUD_TRACE_CONTEXT'])) { $payload['traceId'] = explode("/", $_SERVER['HTTP_X_CLOUD_TRACE_CONTEXT'])[0]; } return "\n" . json_encode($payload); }
/** * Set up test environment. */ public function setUp() { parent::setUp(); $this->link = new \MySQLi('localhost', 'root', ''); if ($this->link->connect_error) { throw new \RuntimeException('Failed to connect to database. MySQL said: ' . $this->link->connect_error); } if (!$this->link->select_db('activecollab_jobs_queue_test')) { throw new \RuntimeException('Failed to select database.'); } $this->connection = new MysqliConnection($this->link); $this->queue = new MySqlQueue($this->connection); $this->dispatcher = new Dispatcher($this->queue); $this->log_file_path = dirname(__DIR__) . '/logs/' . date('Y-m-d') . '.txt'; if (is_file($this->log_file_path)) { unlink($this->log_file_path); } $this->log = new Logger('cli'); $handler = new StreamHandler($this->log_file_path, Logger::DEBUG); $formatter = new LineFormatter(); $formatter->includeStacktraces(true); $handler->setFormatter($formatter); $this->log->pushHandler($handler); $this->container = new Container(['dispatcher' => $this->dispatcher, 'log' => $this->log]); }