|
|
@@ -51,6 +51,18 @@ class SlackHandler extends SocketHandler
|
|
|
*/
|
|
|
private $useAttachment;
|
|
|
|
|
|
+ /**
|
|
|
+ * Whether the the message that is added to Slack as attachment is in a short style (or not)
|
|
|
+ * @var bool
|
|
|
+ */
|
|
|
+ private $useShortAttachment;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Whether the attachment should include extra data (or not)
|
|
|
+ * @var bool
|
|
|
+ */
|
|
|
+ private $includeExtra;
|
|
|
+
|
|
|
/**
|
|
|
* @param string $token Slack API token
|
|
|
* @param string $channel Slack channel (encoded ID or name)
|
|
|
@@ -60,7 +72,7 @@ class SlackHandler extends SocketHandler
|
|
|
* @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
|
|
|
*/
|
|
|
- public function __construct($token, $channel, $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true)
|
|
|
+ public function __construct($token, $channel, $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeExtra = false)
|
|
|
{
|
|
|
if (!extension_loaded('openssl')) {
|
|
|
throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler');
|
|
|
@@ -73,6 +85,8 @@ class SlackHandler extends SocketHandler
|
|
|
$this->username = $username;
|
|
|
$this->iconEmoji = trim($iconEmoji, ':');
|
|
|
$this->useAttachment = $useAttachment;
|
|
|
+ $this->useShortAttachment = $useShortAttachment;
|
|
|
+ $this->includeExtra = $includeExtra;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -104,27 +118,52 @@ class SlackHandler extends SocketHandler
|
|
|
'attachments' => array()
|
|
|
);
|
|
|
|
|
|
+ $extra = '';
|
|
|
+ foreach ($record['extra'] as $var => $val) {
|
|
|
+ $extra .= $var.': '.$this->replaceNewlines($this->convertToString($val))." | ";
|
|
|
+ }
|
|
|
+
|
|
|
+ $extra = rtrim($extra, " |");
|
|
|
+
|
|
|
if ($this->useAttachment) {
|
|
|
- $dataArray['attachments'] = json_encode(
|
|
|
- array(
|
|
|
+
|
|
|
+ $attachment = array(
|
|
|
+ 'fallback' => $record['message'],
|
|
|
+ 'color' => $this->getAttachmentColor($record['level'])
|
|
|
+ );
|
|
|
+
|
|
|
+ if ($this->useShortAttachment) {
|
|
|
+ $attachment['fields'] = array(
|
|
|
array(
|
|
|
- 'fallback' => $record['message'],
|
|
|
- 'color' => $this->getAttachmentColor($record['level']),
|
|
|
- 'fields' => array(
|
|
|
- array(
|
|
|
- 'title' => 'Message',
|
|
|
- 'value' => $record['message'],
|
|
|
- 'short' => false
|
|
|
- ),
|
|
|
- array(
|
|
|
- 'title' => 'Level',
|
|
|
- 'value' => $record['level_name'],
|
|
|
- 'short' => true
|
|
|
- )
|
|
|
- )
|
|
|
+ '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) {
|
|
|
+ $attachment['fields'][] = array(
|
|
|
+ 'title' => "Extra",
|
|
|
+ 'value' => $extra,
|
|
|
+ 'short' => false
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ $dataArray['attachments'] = json_encode(array($attachment));
|
|
|
} else {
|
|
|
$dataArray['text'] = $record['message'];
|
|
|
}
|
|
|
@@ -184,4 +223,54 @@ class SlackHandler extends SocketHandler
|
|
|
return '#e3e4e6';
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Copy from LineFormater (any better idea?)
|
|
|
+ */
|
|
|
+ protected function convertToString($data)
|
|
|
+ {
|
|
|
+ if (null === $data || is_bool($data)) {
|
|
|
+ return var_export($data, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_scalar($data)) {
|
|
|
+ return (string) $data;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
|
|
|
+ return $this->toJson($data, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ return str_replace('\\/', '/', @json_encode($data));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Copy from LineFormater (any better idea?)
|
|
|
+ */
|
|
|
+ protected function toJson($data, $ignoreErrors = false)
|
|
|
+ {
|
|
|
+ // suppress json_encode errors since it's twitchy with some inputs
|
|
|
+ if ($ignoreErrors) {
|
|
|
+ if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
|
|
|
+ return @json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
|
|
+ }
|
|
|
+
|
|
|
+ return @json_encode($data);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
|
|
|
+ return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
|
|
+ }
|
|
|
+
|
|
|
+ return json_encode($data);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Copy from LineFormater (any better idea?)
|
|
|
+ */
|
|
|
+ protected function replaceNewlines($str)
|
|
|
+ {
|
|
|
+ return strtr($str, array("\r\n" => ' ', "\r" => ' ', "\n" => ' '));
|
|
|
+ }
|
|
|
}
|