Prechádzať zdrojové kódy

Merge remote-tracking branch 'scuben/enhanced-slack-handler'

Jordi Boggiano 11 rokov pred
rodič
commit
33ebc242eb
1 zmenil súbory, kde vykonal 108 pridanie a 19 odobranie
  1. 108 19
      src/Monolog/Handler/SlackHandler.php

+ 108 - 19
src/Monolog/Handler/SlackHandler.php

@@ -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" => ' '));
+    }
 }