summaryrefslogtreecommitdiff
path: root/vendor/monolog/monolog/src/Monolog
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/monolog/monolog/src/Monolog')
-rw-r--r--vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php22
-rw-r--r--vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php2
-rw-r--r--vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php2
-rw-r--r--vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php19
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php4
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php10
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php5
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php11
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php79
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php4
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php20
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php2
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php4
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php27
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php44
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php243
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php15
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php13
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php9
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php1
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php120
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php53
-rw-r--r--vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php55
-rw-r--r--vendor/monolog/monolog/src/Monolog/Logger.php20
-rw-r--r--vendor/monolog/monolog/src/Monolog/Registry.php18
25 files changed, 687 insertions, 115 deletions
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
index 8d01c64c..1e431750 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
@@ -67,19 +67,29 @@ class GelfMessageFormatter extends NormalizerFormatter
public function format(array $record)
{
$record = parent::format($record);
+
+ if (!isset($record['datetime'], $record['message'], $record['level'])) {
+ throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given');
+ }
+
$message = new Message();
$message
->setTimestamp($record['datetime'])
->setShortMessage((string) $record['message'])
- ->setFacility($record['channel'])
->setHost($this->systemName)
- ->setLine(isset($record['extra']['line']) ? $record['extra']['line'] : null)
- ->setFile(isset($record['extra']['file']) ? $record['extra']['file'] : null)
->setLevel($this->logLevels[$record['level']]);
- // Do not duplicate these values in the additional fields
- unset($record['extra']['line']);
- unset($record['extra']['file']);
+ if (isset($record['channel'])) {
+ $message->setFacility($record['channel']);
+ }
+ if (isset($record['extra']['line'])) {
+ $message->setLine($record['extra']['line']);
+ unset($record['extra']['line']);
+ }
+ if (isset($record['extra']['file'])) {
+ $message->setFile($record['extra']['file']);
+ unset($record['extra']['file']);
+ }
foreach ($record['extra'] as $key => $val) {
$message->setAdditional($this->extraPrefix . $key, is_scalar($val) ? $val : $this->toJson($val));
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
index 7963dbf1..e5a1d2c4 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
@@ -39,7 +39,7 @@ class JsonFormatter implements FormatterInterface
* The batch mode option configures the formatting style for
* multiple records. By default, multiple records will be
* formatted as a JSON-encoded array. However, for
- * compatibility with some API endpoints, alternive styles
+ * compatibility with some API endpoints, alternative styles
* are available.
*
* @return int
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
index 6983d1a5..388e2266 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
@@ -154,6 +154,6 @@ class LineFormatter extends NormalizerFormatter
return $str;
}
- return strtr($str, array("\r\n" => ' ', "\r" => ' ', "\n" => ' '));
+ return str_replace(array("\r\n", "\r", "\n"), ' ', $str);
}
}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
index beafea64..46bf41b3 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
@@ -58,6 +58,15 @@ class NormalizerFormatter implements FormatterInterface
protected function normalize($data)
{
if (null === $data || is_scalar($data)) {
+ if (is_float($data)) {
+ if (is_infinite($data)) {
+ return ($data > 0 ? '' : '-') . 'INF';
+ }
+ if (is_nan($data)) {
+ return 'NaN';
+ }
+ }
+
return $data;
}
@@ -85,7 +94,15 @@ class NormalizerFormatter implements FormatterInterface
return $this->normalizeException($data);
}
- return sprintf("[object] (%s: %s)", get_class($data), $this->toJson($data, true));
+ // non-serializable objects that implement __toString stringified
+ if (method_exists($data, '__toString') && !$data instanceof \JsonSerializable) {
+ $value = (string) $data;
+ } else {
+ // the rest is json-serialized in some way
+ $value = $this->toJson($data, true);
+ }
+
+ return sprintf("[object] (%s: %s)", get_class($data), $value);
}
if (is_resource($data)) {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
index 43190b92..589ff779 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
@@ -26,7 +26,7 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
/**
* {@inheritDoc}
*
- * Formatted output may contain some formatting markers to be transfered to `console.log` using the %c format.
+ * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format.
*
* Example of formatted string:
*
@@ -71,7 +71,7 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
}
if (count(self::$records)) {
- echo '<script>' . self::generateScript() . '</script>';
+ echo '<script>' , self::generateScript() , '</script>';
self::reset();
}
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
index d968720c..db8e6552 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
@@ -116,7 +116,11 @@ class CubeHandler extends AbstractProcessingHandler
$data['data'] = $record['context'];
$data['data']['level'] = $record['level'];
- $this->{'write'.$this->scheme}(json_encode($data));
+ if ($this->scheme === 'http') {
+ $this->writeHttp(json_encode($data));
+ } else {
+ $this->writeUdp(json_encode($data));
+ }
}
private function writeUdp($data)
@@ -140,6 +144,8 @@ class CubeHandler extends AbstractProcessingHandler
'Content-Length: ' . strlen('['.$data.']'))
);
- return curl_exec($this->httpConnection);
+ if (curl_exec($this->httpConnection) === false) {
+ throw new \RuntimeException(sprintf('Curl error (code %s): %s', curl_errno($ch), curl_error($ch)));
+ }
}
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
index a81c9e64..30a85dd6 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
@@ -61,7 +61,10 @@ class FingersCrossedHandler extends AbstractHandler
$this->bufferSize = $bufferSize;
$this->bubble = $bubble;
$this->stopBuffering = $stopBuffering;
- $this->passthruLevel = $passthruLevel;
+
+ if ($passthruLevel !== null) {
+ $this->passthruLevel = Logger::toMonologLevel($passthruLevel);
+ }
if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {
throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object");
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
index 790f6364..28c7b55f 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
@@ -13,6 +13,7 @@ namespace Monolog\Handler;
use Gelf\IMessagePublisher;
use Gelf\PublisherInterface;
+use Gelf\Publisher;
use InvalidArgumentException;
use Monolog\Logger;
use Monolog\Formatter\GelfMessageFormatter;
@@ -31,16 +32,16 @@ class GelfHandler extends AbstractProcessingHandler
protected $publisher;
/**
- * @param PublisherInterface|IMessagePublisher $publisher a publisher object
- * @param integer $level The minimum logging level at which this handler will be triggered
- * @param boolean $bubble Whether the messages that are handled can bubble up the stack or not
+ * @param PublisherInterface|IMessagePublisher|Publisher $publisher a publisher object
+ * @param integer $level The minimum logging level at which this handler will be triggered
+ * @param boolean $bubble Whether the messages that are handled can bubble up the stack or not
*/
public function __construct($publisher, $level = Logger::DEBUG, $bubble = true)
{
parent::__construct($level, $bubble);
- if (!$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) {
- throw new InvalidArgumentException("Invalid publisher, expected a Gelf\IMessagePublisher or Gelf\PublisherInterface instance");
+ if (!$publisher instanceof Publisher && !$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) {
+ throw new InvalidArgumentException("Invalid publisher, expected a Gelf\Publisher, Gelf\IMessagePublisher or Gelf\PublisherInterface instance");
}
$this->publisher = $publisher;
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
index 29614d31..34d3437f 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
@@ -21,6 +21,7 @@ use Monolog\Logger;
* Room - HipChat Room Id or name, where messages are sent
* Name - Name used to send the message (from)
* notify - Should the message trigger a notification in the clients
+ * version - The API version to use (HipChatHandler::API_V1 | HipChatHandler::API_V2)
*
* @author Rafael Dohms <rafael@doh.ms>
* @see https://www.hipchat.com/docs/api
@@ -28,6 +29,16 @@ use Monolog\Logger;
class HipChatHandler extends SocketHandler
{
/**
+ * Use API version 1
+ */
+ const API_V1 = 'v1';
+
+ /**
+ * Use API version v2
+ */
+ const API_V2 = 'v2';
+
+ /**
* The maximum allowed length for the name used in the "from" field.
*/
const MAXIMUM_NAME_LENGTH = 15;
@@ -43,7 +54,7 @@ class HipChatHandler extends SocketHandler
private $token;
/**
- * @var array
+ * @var string
*/
private $room;
@@ -53,7 +64,7 @@ class HipChatHandler extends SocketHandler
private $name;
/**
- * @var boolean
+ * @var bool
*/
private $notify;
@@ -63,19 +74,30 @@ class HipChatHandler extends SocketHandler
private $format;
/**
- * @param string $token HipChat API Token
- * @param string $room The room that should be alerted of the message (Id or Name)
- * @param string $name Name used in the "from" field
- * @param bool $notify Trigger a notification in clients or not
- * @param int $level The minimum logging level at which this handler will be triggered
- * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
- * @param Boolean $useSSL Whether to connect via SSL.
- * @param string $format The format of the messages (default to text, can be set to html if you have html in the messages)
- * @param string $host The HipChat server hostname.
+ * @var string
*/
- public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $format = 'text', $host = 'api.hipchat.com')
+ private $host;
+
+ /**
+ * @var string
+ */
+ private $version;
+
+ /**
+ * @param string $token HipChat API Token
+ * @param string $room The room that should be alerted of the message (Id or Name)
+ * @param string $name Name used in the "from" field. Not used for v2
+ * @param bool $notify Trigger a notification in clients or not
+ * @param int $level The minimum logging level at which this handler will be triggered
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
+ * @param bool $useSSL Whether to connect via SSL.
+ * @param string $format The format of the messages (default to text, can be set to html if you have html in the messages)
+ * @param string $host The HipChat server hostname.
+ * @param string $version The HipChat API version (default HipChatHandler::API_V1)
+ */
+ public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $format = 'text', $host = 'api.hipchat.com', $version = self::API_V1)
{
- if (!$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) {
+ if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) {
throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.');
}
@@ -87,6 +109,8 @@ class HipChatHandler extends SocketHandler
$this->notify = $notify;
$this->room = $room;
$this->format = $format;
+ $this->host = $host;
+ $this->version = $version;
}
/**
@@ -111,14 +135,20 @@ class HipChatHandler extends SocketHandler
private function buildContent($record)
{
$dataArray = array(
- 'from' => $this->name,
- 'room_id' => $this->room,
- 'notify' => $this->notify,
+ 'notify' => $this->version == self::API_V1 ?
+ ($this->notify ? 1 : 0) :
+ ($this->notify ? 'true' : 'false'),
'message' => $record['formatted'],
'message_format' => $this->format,
'color' => $this->getAlertColor($record['level']),
);
+ // if we are using the legacy API then we need to send some additional information
+ if ($this->version == self::API_V1) {
+ $dataArray['room_id'] = $this->room;
+ $dataArray['from'] = $this->name;
+ }
+
return http_build_query($dataArray);
}
@@ -130,8 +160,15 @@ class HipChatHandler extends SocketHandler
*/
private function buildHeader($content)
{
- $header = "POST /v1/rooms/message?format=json&auth_token=".$this->token." HTTP/1.1\r\n";
- $header .= "Host: api.hipchat.com\r\n";
+ if ($this->version == self::API_V1) {
+ $header = "POST /v1/rooms/message?format=json&auth_token={$this->token} HTTP/1.1\r\n";
+ } else {
+ // needed for rooms with special (spaces, etc) characters in the name
+ $room = rawurlencode($this->room);
+ $header = "POST /v2/room/{$room}/notification?auth_token={$this->token} HTTP/1.1\r\n";
+ }
+
+ $header .= "Host: {$this->host}\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($content) . "\r\n";
$header .= "\r\n";
@@ -229,19 +266,19 @@ class HipChatHandler extends SocketHandler
}
$messages[] = $record['message'];
- $messgeStr = implode(PHP_EOL, $messages);
+ $messageStr = implode(PHP_EOL, $messages);
$formattedMessages[] = $this->getFormatter()->format($record);
$formattedMessageStr = implode('', $formattedMessages);
$batchRecord = array(
- 'message' => $messgeStr,
+ 'message' => $messageStr,
'formatted' => $formattedMessageStr,
'context' => array(),
'extra' => array(),
);
if (!$this->validateStringLength($batchRecord['formatted'], static::MAXIMUM_MESSAGE_LENGTH)) {
- // Pop the last message and implode the remainging messages
+ // Pop the last message and implode the remaining messages
$lastMessage = array_pop($messages);
$lastFormattedMessage = array_pop($formattedMessages);
$batchRecord['message'] = implode(PHP_EOL, $messages);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
index 8bf388b3..bd56230f 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
@@ -29,7 +29,7 @@ class LogEntriesHandler extends SocketHandler
* @param int $level The minimum logging level to trigger this handler
* @param boolean $bubble Whether or not messages that are handled should bubble up the stack.
*
- * @throws MissingExtensionExcpetion If SSL encryption is set to true and OpenSSL is missing
+ * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
*/
public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true)
{
@@ -37,7 +37,7 @@ class LogEntriesHandler extends SocketHandler
throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');
}
- $endpoint = $useSSL ? 'ssl://api.logentries.com:20000' : 'data.logentries.com:80';
+ $endpoint = $useSSL ? 'ssl://data.logentries.com:443' : 'data.logentries.com:80';
parent::__construct($endpoint, $level, $bubble);
$this->logToken = $token;
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php
index efd94d30..9785cec0 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php
@@ -19,6 +19,7 @@ use Monolog\Formatter\LogglyFormatter;
*
* @author Przemek Sobstel <przemek@sobstel.org>
* @author Adam Pancutt <adam@pancutt.com>
+ * @author Gregory Barchard <gregory@barchard.net>
*/
class LogglyHandler extends AbstractProcessingHandler
{
@@ -28,7 +29,7 @@ class LogglyHandler extends AbstractProcessingHandler
protected $token;
- protected $tag;
+ protected $tag = array();
public function __construct($token, $level = Logger::DEBUG, $bubble = true)
{
@@ -43,12 +44,16 @@ class LogglyHandler extends AbstractProcessingHandler
public function setTag($tag)
{
- $this->tag = $tag;
+ $tag = !empty($tag) ? $tag : array();
+ $this->tag = is_array($tag) ? $tag : array($tag);
}
public function addTag($tag)
{
- $this->tag = (strlen($this->tag) > 0) ? $this->tag .','. $tag : $tag;
+ if (!empty($tag)) {
+ $tag = is_array($tag) ? $tag : array($tag);
+ $this->tag = array_unique(array_merge($this->tag, $tag));
+ }
}
protected function write(array $record)
@@ -75,8 +80,8 @@ class LogglyHandler extends AbstractProcessingHandler
$headers = array('Content-Type: application/json');
- if ($this->tag) {
- $headers[] = "X-LOGGLY-TAG: {$this->tag}";
+ if (!empty($this->tag)) {
+ $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag);
}
$ch = curl_init();
@@ -87,7 +92,10 @@ class LogglyHandler extends AbstractProcessingHandler
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_exec($ch);
+ if (curl_exec($ch) === false) {
+ throw new \RuntimeException(sprintf('Curl error (code %s): %s', curl_errno($ch), curl_error($ch)));
+ }
+
curl_close($ch);
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
index 86292727..50ed6380 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
@@ -40,7 +40,7 @@ abstract class MailHandler extends AbstractProcessingHandler
/**
* Send a mail with the given content
*
- * @param string $content
+ * @param string $content formatted email body to be sent
* @param array $records the array of log records that formed this content
*/
abstract protected function send($content, array $records);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
index 60a2901e..6726e1e4 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
@@ -63,7 +63,9 @@ class MandrillHandler extends MailHandler
'async' => false,
)));
- curl_exec($ch);
+ if (curl_exec($ch) === false) {
+ throw new \RuntimeException(sprintf('Curl error (code %s): %s', curl_errno($ch), curl_error($ch)));
+ }
curl_close($ch);
}
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
index 0fe6b642..5118a0e2 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
@@ -40,6 +40,12 @@ class NativeMailerHandler extends MailHandler
protected $headers = array();
/**
+ * Optional parameters for the message
+ * @var array
+ */
+ protected $parameters = array();
+
+ /**
* The wordwrap length for the message
* @var integer
*/
@@ -78,7 +84,7 @@ class NativeMailerHandler extends MailHandler
* Add headers to the message
*
* @param string|array $headers Custom added headers
- * @return null
+ * @return self
*/
public function addHeader($headers)
{
@@ -88,6 +94,21 @@ class NativeMailerHandler extends MailHandler
}
$this->headers[] = $header;
}
+
+ return $this;
+ }
+
+ /**
+ * Add parameters to the message
+ *
+ * @param string|array $parameters Custom added parameters
+ * @return self
+ */
+ public function addParameter($parameters)
+ {
+ $this->parameters = array_merge($this->parameters, (array) $parameters);
+
+ return $this;
}
/**
@@ -102,7 +123,7 @@ class NativeMailerHandler extends MailHandler
$headers .= 'MIME-Version: 1.0' . "\r\n";
}
foreach ($this->to as $to) {
- mail($to, $this->subject, $content, $headers);
+ mail($to, $this->subject, $content, $headers, implode(' ', $this->parameters));
}
}
@@ -145,7 +166,7 @@ class NativeMailerHandler extends MailHandler
public function setEncoding($encoding)
{
if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) {
- throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection');
+ throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection');
}
$this->encoding = $encoding;
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
index 9807410d..8cb4ab38 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
@@ -12,11 +12,14 @@
namespace Monolog\Handler;
use Monolog\Logger;
+use Monolog\Formatter\NormalizerFormatter;
/**
- * Class to record a log on a NewRelic application
+ * Class to record a log on a NewRelic application.
+ * Enabling New Relic High Security mode may prevent capture of useful information.
*
* @see https://docs.newrelic.com/docs/agents/php-agent
+ * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security
*/
class NewRelicHandler extends AbstractProcessingHandler
{
@@ -78,33 +81,33 @@ class NewRelicHandler extends AbstractProcessingHandler
if ($transactionName = $this->getTransactionName($record['context'])) {
$this->setNewRelicTransactionName($transactionName);
- unset($record['context']['transaction_name']);
+ unset($record['formatted']['context']['transaction_name']);
}
if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) {
newrelic_notice_error($record['message'], $record['context']['exception']);
- unset($record['context']['exception']);
+ unset($record['formatted']['context']['exception']);
} else {
newrelic_notice_error($record['message']);
}
- foreach ($record['context'] as $key => $parameter) {
+ foreach ($record['formatted']['context'] as $key => $parameter) {
if (is_array($parameter) && $this->explodeArrays) {
foreach ($parameter as $paramKey => $paramValue) {
- newrelic_add_custom_parameter('context_' . $key . '_' . $paramKey, $paramValue);
+ $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue);
}
} else {
- newrelic_add_custom_parameter('context_' . $key, $parameter);
+ $this->setNewRelicParameter('context_' . $key, $parameter);
}
}
- foreach ($record['extra'] as $key => $parameter) {
+ foreach ($record['formatted']['extra'] as $key => $parameter) {
if (is_array($parameter) && $this->explodeArrays) {
foreach ($parameter as $paramKey => $paramValue) {
- newrelic_add_custom_parameter('extra_' . $key . '_' . $paramKey, $paramValue);
+ $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue);
}
} else {
- newrelic_add_custom_parameter('extra_' . $key, $parameter);
+ $this->setNewRelicParameter('extra_' . $key, $parameter);
}
}
}
@@ -165,10 +168,31 @@ class NewRelicHandler extends AbstractProcessingHandler
/**
* Overwrites the name of the current transaction
*
- * @param $transactionName
+ * @param string $transactionName
*/
protected function setNewRelicTransactionName($transactionName)
{
newrelic_name_transaction($transactionName);
}
+
+ /**
+ * @param string $key
+ * @param mixed $value
+ */
+ protected function setNewRelicParameter($key, $value)
+ {
+ if (null === $value || is_scalar($value)) {
+ newrelic_add_custom_parameter($key, $value);
+ } else {
+ newrelic_add_custom_parameter($key, @json_encode($value));
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function getDefaultFormatter()
+ {
+ return new NormalizerFormatter();
+ }
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php
new file mode 100644
index 00000000..169bea0e
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php
@@ -0,0 +1,243 @@
+<?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\Handler;
+
+use Exception;
+use Monolog\Formatter\LineFormatter;
+use Monolog\Logger;
+use PhpConsole\Connector;
+use PhpConsole\Handler;
+use PhpConsole\Helper;
+
+/**
+ * Monolog handler for Google Chrome extension "PHP Console"
+ *
+ * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely
+ *
+ * Usage:
+ * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef
+ * 2. See overview https://github.com/barbushin/php-console#overview
+ * 3. Install PHP Console library https://github.com/barbushin/php-console#installation
+ * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png)
+ *
+ * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler()));
+ * \Monolog\ErrorHandler::register($logger);
+ * echo $undefinedVar;
+ * $logger->addDebug('SELECT * FROM users', array('db', 'time' => 0.012));
+ * PC::debug($_SERVER); // PHP Console debugger for any type of vars
+ *
+ * @author Sergey Barbushin https://www.linkedin.com/in/barbushin
+ */
+class PHPConsoleHandler extends AbstractProcessingHandler
+{
+ private $options = array(
+ 'enabled' => true, // bool Is PHP Console server enabled
+ 'classesPartialsTraceIgnore' => array('Monolog\\'), // array Hide calls of classes started with...
+ 'debugTagsKeysInContext' => array(0, 'tag'), // bool Is PHP Console server enabled
+ 'useOwnErrorsHandler' => false, // bool Enable errors handling
+ 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling
+ 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths
+ 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s')
+ 'serverEncoding' => null, // string|null Server internal encoding
+ 'headersLimit' => null, // int|null Set headers size limit for your web-server
+ 'password' => null, // string|null Protect PHP Console connection by password
+ 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed
+ 'ipMasks' => array(), // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1')
+ 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required)
+ 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings
+ 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level
+ 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number
+ 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item
+ 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON
+ 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug
+ 'dataStorage' => null, // PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ)
+ );
+
+ /** @var Connector */
+ private $connector;
+
+ /**
+ * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details
+ * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional)
+ * @param int $level
+ * @param bool $bubble
+ * @throws Exception
+ */
+ public function __construct(array $options = array(), Connector $connector = null, $level = Logger::DEBUG, $bubble = true)
+ {
+ if (!class_exists('PhpConsole\Connector')) {
+ throw new Exception('PHP Console library not found. See https://github.com/barbushin/php-console#installation');
+ }
+ parent::__construct($level, $bubble);
+ $this->options = $this->initOptions($options);
+ $this->connector = $this->initConnector($connector);
+ }
+
+ private function initOptions(array $options)
+ {
+ $wrongOptions = array_diff(array_keys($options), array_keys($this->options));
+ if ($wrongOptions) {
+ throw new Exception('Unknown options: ' . implode(', ', $wrongOptions));
+ }
+
+ return array_replace($this->options, $options);
+ }
+
+ private function initConnector(Connector $connector = null)
+ {
+ if (!$connector) {
+ if ($this->options['dataStorage']) {
+ Connector::setPostponeStorage($this->options['dataStorage']);
+ }
+ $connector = Connector::getInstance();
+ }
+
+ if ($this->options['registerHelper'] && !Helper::isRegistered()) {
+ Helper::register();
+ }
+
+ if ($this->options['enabled'] && $connector->isActiveClient()) {
+ if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) {
+ $handler = Handler::getInstance();
+ $handler->setHandleErrors($this->options['useOwnErrorsHandler']);
+ $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']);
+ $handler->start();
+ }
+ if ($this->options['sourcesBasePath']) {
+ $connector->setSourcesBasePath($this->options['sourcesBasePath']);
+ }
+ if ($this->options['serverEncoding']) {
+ $connector->setServerEncoding($this->options['serverEncoding']);
+ }
+ if ($this->options['password']) {
+ $connector->setPassword($this->options['password']);
+ }
+ if ($this->options['enableSslOnlyMode']) {
+ $connector->enableSslOnlyMode();
+ }
+ if ($this->options['ipMasks']) {
+ $connector->setAllowedIpMasks($this->options['ipMasks']);
+ }
+ if ($this->options['headersLimit']) {
+ $connector->setHeadersLimit($this->options['headersLimit']);
+ }
+ if ($this->options['detectDumpTraceAndSource']) {
+ $connector->getDebugDispatcher()->detectTraceAndSource = true;
+ }
+ $dumper = $connector->getDumper();
+ $dumper->levelLimit = $this->options['dumperLevelLimit'];
+ $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit'];
+ $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit'];
+ $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit'];
+ $dumper->detectCallbacks = $this->options['dumperDetectCallbacks'];
+ if ($this->options['enableEvalListener']) {
+ $connector->startEvalRequestsListener();
+ }
+ }
+
+ return $connector;
+ }
+
+ public function getConnector()
+ {
+ return $this->connector;
+ }
+
+ public function getOptions()
+ {
+ return $this->options;
+ }
+
+ public function handle(array $record)
+ {
+ if ($this->options['enabled'] && $this->connector->isActiveClient()) {
+ return parent::handle($record);
+ }
+
+ return !$this->bubble;
+ }
+
+ /**
+ * Writes the record down to the log of the implementing handler
+ *
+ * @param array $record
+ * @return void
+ */
+ protected function write(array $record)
+ {
+ if ($record['level'] < Logger::NOTICE) {
+ $this->handleDebugRecord($record);
+ } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof Exception) {
+ $this->handleExceptionRecord($record);
+ } else {
+ $this->handleErrorRecord($record);
+ }
+ }
+
+ private function handleDebugRecord(array $record)
+ {
+ $tags = $this->getRecordTags($record);
+ $message = $record['message'];
+ if ($record['context']) {
+ $message .= ' ' . json_encode($this->connector->getDumper()->dump(array_filter($record['context'])));
+ }
+ $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']);
+ }
+
+ private function handleExceptionRecord(array $record)
+ {
+ $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']);
+ }
+
+ private function handleErrorRecord(array $record)
+ {
+ $context = $record['context'];
+
+ $this->connector->getErrorsDispatcher()->dispatchError(
+ isset($context['code']) ? $context['code'] : null,
+ isset($context['message']) ? $context['message'] : $record['message'],
+ isset($context['file']) ? $context['file'] : null,
+ isset($context['line']) ? $context['line'] : null,
+ $this->options['classesPartialsTraceIgnore']
+ );
+ }
+
+ private function getRecordTags(array &$record)
+ {
+ $tags = null;
+ if (!empty($record['context'])) {
+ $context =& $record['context'];
+ foreach ($this->options['debugTagsKeysInContext'] as $key) {
+ if (!empty($context[$key])) {
+ $tags = $context[$key];
+ if ($key === 0) {
+ array_shift($context);
+ } else {
+ unset($context[$key]);
+ }
+ break;
+ }
+ }
+ }
+
+ return $tags ?: strtolower($record['level_name']);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function getDefaultFormatter()
+ {
+ return new LineFormatter('%message%');
+ }
+}
+
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
index cd2fcfa3..9917b649 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
@@ -30,6 +30,7 @@ class PushoverHandler extends SocketHandler
private $highPriorityLevel;
private $emergencyLevel;
+ private $useFormattedMessage = false;
/**
* All parameters that can be sent to Pushover
@@ -103,7 +104,10 @@ class PushoverHandler extends SocketHandler
{
// Pushover has a limit of 512 characters on title and message combined.
$maxMessageLength = 512 - strlen($this->title);
- $message = substr($record['message'], 0, $maxMessageLength);
+
+ $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message'];
+ $message = substr($message, 0, $maxMessageLength);
+
$timestamp = $record['datetime']->getTimestamp();
$dataArray = array(
@@ -169,4 +173,13 @@ class PushoverHandler extends SocketHandler
{
$this->emergencyLevel = $value;
}
+
+ /**
+ * Use the formatted message?
+ * @param boolean $value
+ */
+ public function useFormattedMessage($value)
+ {
+ $this->useFormattedMessage = (boolean) $value;
+ }
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
index f5743cd6..7fedc16f 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
@@ -127,6 +127,7 @@ class RavenHandler extends AbstractProcessingHandler
*/
protected function write(array $record)
{
+ $previousUserContext = false;
$options = array();
$options['level'] = $this->logLevels[$record['level']];
$options['tags'] = array();
@@ -146,6 +147,11 @@ class RavenHandler extends AbstractProcessingHandler
}
if (!empty($record['context'])) {
$options['extra']['context'] = $record['context'];
+ if (!empty($record['context']['user'])) {
+ $previousUserContext = $this->ravenClient->context->user;
+ $this->ravenClient->user_context($record['context']['user']);
+ unset($options['extra']['context']['user']);
+ }
}
if (!empty($record['extra'])) {
$options['extra']['extra'] = $record['extra'];
@@ -154,11 +160,14 @@ class RavenHandler extends AbstractProcessingHandler
if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) {
$options['extra']['message'] = $record['formatted'];
$this->ravenClient->captureException($record['context']['exception'], $options);
+ } else {
+ $this->ravenClient->captureMessage($record['formatted'], array(), $options);
+ }
- return;
+ if ($previousUserContext !== false) {
+ $this->ravenClient->user_context($previousUserContext);
}
- $this->ravenClient->captureMessage($record['formatted'], array(), $options);
}
/**
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
index 3fc7f34b..ee8c2363 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
@@ -11,8 +11,8 @@
namespace Monolog\Handler;
-use Monolog\Logger;
use Monolog\Formatter\LineFormatter;
+use Monolog\Logger;
/**
* Logs to a Redis key using rpush
@@ -30,7 +30,12 @@ class RedisHandler extends AbstractProcessingHandler
private $redisClient;
private $redisKey;
- # redis instance, key to use
+ /**
+ * @param \Predis\Client|\Redis $redis The redis instance
+ * @param string $key The key name to push records to
+ * @param integer $level The minimum logging level at which this handler will be triggered
+ * @param boolean $bubble Whether the messages that are handled can bubble up the stack or not
+ */
public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = true)
{
if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php
index 487e26f6..9509ae37 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php
@@ -11,7 +11,6 @@
namespace Monolog\Handler;
-
/**
* Sampling handler
*
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
index e3c8e11b..c7a1c7e9 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
@@ -53,16 +53,16 @@ class SlackHandler extends SocketHandler
private $useAttachment;
/**
- * Whether the the message that is added to Slack as attachment is in a short style (or not)
+ * Whether the the context/extra messages added to Slack as attachments are in a short style
* @var bool
*/
private $useShortAttachment;
/**
- * Whether the attachment should include extra data (or not)
+ * Whether the attachment should include context and extra data
* @var bool
*/
- private $includeExtra;
+ private $includeContextAndExtra;
/**
* @var LineFormatter
@@ -70,15 +70,17 @@ class SlackHandler extends SocketHandler
private $lineFormatter;
/**
- * @param string $token Slack API token
- * @param string $channel Slack channel (encoded ID or name)
- * @param string $username Name of a bot
- * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise)
- * @param string|null $iconEmoji The emoji name to use (or null)
- * @param int $level The minimum logging level at which this handler will be triggered
- * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
+ * @param string $token Slack API token
+ * @param string $channel Slack channel (encoded ID or name)
+ * @param string $username Name of a bot
+ * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise)
+ * @param string|null $iconEmoji The emoji name to use (or null)
+ * @param int $level The minimum logging level at which this handler will be triggered
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
+ * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style
+ * @param bool $includeContextAndExtra Whether the attachment should include context and extra data
*/
- public function __construct($token, $channel, $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeExtra = false)
+ public function __construct($token, $channel, $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeContextAndExtra = false)
{
if (!extension_loaded('openssl')) {
throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler');
@@ -92,8 +94,8 @@ class SlackHandler extends SocketHandler
$this->iconEmoji = trim($iconEmoji, ':');
$this->useAttachment = $useAttachment;
$this->useShortAttachment = $useShortAttachment;
- $this->includeExtra = $includeExtra;
- if ($this->includeExtra) {
+ $this->includeContextAndExtra = $includeContextAndExtra;
+ if ($this->includeContextAndExtra) {
$this->lineFormatter = new LineFormatter;
}
}
@@ -119,18 +121,31 @@ class SlackHandler extends SocketHandler
*/
private function buildContent($record)
{
+ $dataArray = $this->prepareContentData($record);
+
+ return http_build_query($dataArray);
+ }
+
+ /**
+ * Prepares content data
+ *
+ * @param array $record
+ * @return array
+ */
+ protected function prepareContentData($record)
+ {
$dataArray = array(
- 'token' => $this->token,
- 'channel' => $this->channel,
- 'username' => $this->username,
- 'text' => '',
+ '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'])
+ 'color' => $this->getAttachmentColor($record['level'])
);
if ($this->useShortAttachment) {
@@ -156,19 +171,44 @@ class SlackHandler extends SocketHandler
);
}
- if ($this->includeExtra) {
- $extra = '';
- foreach ($record['extra'] as $var => $val) {
- $extra .= $var.': '.$this->lineFormatter->stringify($val)." | ";
+ if ($this->includeContextAndExtra) {
+ if (!empty($record['extra'])) {
+ if ($this->useShortAttachment) {
+ $attachment['fields'][] = array(
+ 'title' => "Extra",
+ 'value' => $this->stringify($record['extra']),
+ 'short' => $this->useShortAttachment
+ );
+ } else {
+ // Add all extra fields as individual fields in attachment
+ foreach ($record['extra'] as $var => $val) {
+ $attachment['fields'][] = array(
+ 'title' => $var,
+ 'value' => $val,
+ 'short' => $this->useShortAttachment
+ );
+ }
+ }
}
- $extra = rtrim($extra, " |");
-
- $attachment['fields'][] = array(
- 'title' => "Extra",
- 'value' => $extra,
- 'short' => false
- );
+ if (!empty($record['context'])) {
+ if ($this->useShortAttachment) {
+ $attachment['fields'][] = array(
+ 'title' => "Context",
+ 'value' => $this->stringify($record['context']),
+ 'short' => $this->useShortAttachment
+ );
+ } else {
+ // Add all context fields as individual fields in attachment
+ foreach ($record['context'] as $var => $val) {
+ $attachment['fields'][] = array(
+ 'title' => $var,
+ 'value' => $val,
+ 'short' => $this->useShortAttachment
+ );
+ }
+ }
+ }
}
$dataArray['attachments'] = json_encode(array($attachment));
@@ -179,8 +219,7 @@ class SlackHandler extends SocketHandler
if ($this->iconEmoji) {
$dataArray['icon_emoji'] = ":{$this->iconEmoji}:";
}
-
- return http_build_query($dataArray);
+ return $dataArray;
}
/**
@@ -231,4 +270,23 @@ class SlackHandler extends SocketHandler
return '#e3e4e6';
}
}
+
+ /**
+ * 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;
+ }
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
index af321db2..003a1a2a 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
@@ -21,7 +21,7 @@ use Monolog\Logger;
class SwiftMailerHandler extends MailHandler
{
protected $mailer;
- protected $message;
+ private $messageTemplate;
/**
* @param \Swift_Mailer $mailer The mailer to use
@@ -32,14 +32,9 @@ class SwiftMailerHandler extends MailHandler
public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true)
{
parent::__construct($level, $bubble);
- $this->mailer = $mailer;
- if (!$message instanceof \Swift_Message && is_callable($message)) {
- $message = call_user_func($message);
- }
- if (!$message instanceof \Swift_Message) {
- throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it');
- }
- $this->message = $message;
+
+ $this->mailer = $mailer;
+ $this->messageTemplate = $message;
}
/**
@@ -47,10 +42,46 @@ class SwiftMailerHandler extends MailHandler
*/
protected function send($content, array $records)
{
- $message = clone $this->message;
+ $this->mailer->send($this->buildMessage($content, $records));
+ }
+
+ /**
+ * 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;
+ } else if (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');
+ }
+
$message->setBody($content);
$message->setDate(time());
- $this->mailer->send($message);
+ return $message;
+ }
+
+ /**
+ * BC getter, to be removed in 2.0
+ */
+ public function __get($name)
+ {
+ if ($name === 'message') {
+ trigger_error('SwiftMailerHandler->message is deprecated, use ->buildMessage() instead to retrieve the message', E_USER_DEPRECATED);
+
+ return $this->buildMessage(null, array());
+ }
+
+ throw new \InvalidArgumentException('Invalid property '.$name);
}
}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
index 085d9e17..80b7f283 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
@@ -129,6 +129,61 @@ class TestHandler extends AbstractProcessingHandler
return false;
}
+ public function hasEmergencyThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::EMERGENCY);
+ }
+
+ public function hasAlertThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::ALERT);
+ }
+
+ public function hasCriticalThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::CRITICAL);
+ }
+
+ public function hasErrorThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::ERROR);
+ }
+
+ public function hasWarningThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::WARNING);
+ }
+
+ public function hasNoticeThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::NOTICE);
+ }
+
+ public function hasInfoThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::INFO);
+ }
+
+ public function hasDebugThatContains($message)
+ {
+ return $this->hasRecordThatContains($message, Logger::DEBUG);
+ }
+
+ public function hasRecordThatContains($message, $level)
+ {
+ if (!isset($this->recordsByLevel[$level])) {
+ return false;
+ }
+
+ foreach ($this->recordsByLevel[$level] as $rec) {
+ if (strpos($rec['message'], $message) !== false) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
/**
* {@inheritdoc}
*/
diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php
index 4a38de7f..32e3dd92 100644
--- a/vendor/monolog/monolog/src/Monolog/Logger.php
+++ b/vendor/monolog/monolog/src/Monolog/Logger.php
@@ -152,10 +152,12 @@ class Logger implements LoggerInterface
* Pushes a handler on to the stack.
*
* @param HandlerInterface $handler
+ * @return $this
*/
public function pushHandler(HandlerInterface $handler)
{
array_unshift($this->handlers, $handler);
+ return $this;
}
/**
@@ -184,6 +186,7 @@ class Logger implements LoggerInterface
* Adds a processor on to the stack.
*
* @param callable $callback
+ * @return $this
*/
public function pushProcessor($callback)
{
@@ -191,6 +194,7 @@ class Logger implements LoggerInterface
throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
}
array_unshift($this->processors, $callback);
+ return $this;
}
/**
@@ -438,9 +442,7 @@ class Logger implements LoggerInterface
*/
public function log($level, $message, array $context = array())
{
- if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) {
- $level = constant(__CLASS__.'::'.strtoupper($level));
- }
+ $level = static::toMonologLevel($level);
return $this->addRecord($level, $message, $context);
}
@@ -612,4 +614,16 @@ class Logger implements LoggerInterface
{
return $this->addRecord(static::EMERGENCY, $message, $context);
}
+
+ /**
+ * Set the timezone to be used for the timestamp of log records.
+ *
+ * This is stored globally for all Logger instances
+ *
+ * @param \DateTimeZone $tz Timezone object
+ */
+ public static function setTimezone(\DateTimeZone $tz)
+ {
+ self::$timezone = $tz;
+ }
}
diff --git a/vendor/monolog/monolog/src/Monolog/Registry.php b/vendor/monolog/monolog/src/Monolog/Registry.php
index a3eba079..a33cb7c4 100644
--- a/vendor/monolog/monolog/src/Monolog/Registry.php
+++ b/vendor/monolog/monolog/src/Monolog/Registry.php
@@ -38,7 +38,7 @@ use InvalidArgumentException;
class Registry
{
/**
- * List of all loggers in the registry (ba named indexes)
+ * List of all loggers in the registry (by named indexes)
*
* @var Logger[]
*/
@@ -64,6 +64,22 @@ class Registry
}
/**
+ * Checks if such logging channel exists by name or instance
+ *
+ * @param string|Logger $logger Name or logger instance
+ */
+ public static function hasLogger($logger)
+ {
+ if ($logger instanceof Logger) {
+ $index = array_search($logger, self::$loggers, true);
+
+ return false !== $index;
+ } else {
+ return isset(self::$loggers[$logger]);
+ }
+ }
+
+ /**
* Removes instance from registry by name or instance
*
* @param string|Logger $logger Name or logger instance