/** * Logs with an arbitrary level. * * @param string $level * @param string|array $message a textual message, encoded JSON or array to encode into JSON * @param array $context context regarding the message, if this is included it will * added to the message as json or included in the json payload * @throws \InvalidArgumentException * @return null */ public function log($level, $message, array $context = array()) { $this->connectIfNotConnected(); if (is_array($message)) { $message = json_encode($message); } if (!is_string($message)) { throw new \InvalidArgumentException('the message argument needs to be a string or an array'); } else { $isJson = $this->isJSON($message); if ($isJson) { $json = json_decode($message, true); if ("" != $this->_hostname) { $json["hostname"] = $this->_hostname; } $json["level"] = $level; if (count($context) > 0) { $json["context"] = $context; } $message = json_encode($json); } else { $message = strtoupper($level) . " - " . $message; if ("" != $this->_hostname) { $message = "hostname={$this->_hostname} - " . $message; if (count($context) > 0) { $message .= " - " . json_encode($context); } } } $this->_writer_stack->rewind(); while ($this->_writer_stack->valid()) { /** @var LogEntriesWriter $writer */ $writer = $this->_writer_stack->current(); $message = $writer->log($message, $isJson); $this->_writer_stack->next(); } $this->writeToSocket($this->substituteNewline($message) . PHP_EOL); } }
/** * Skip null elements while validated the current one. * * @return bool */ public function valid() { while (true === parent::valid() && null === $this->current() && null === parent::next()) { } return parent::valid(); }