1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-02-23 22:42:38 +01:00

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

This commit is contained in:
Jordi Boggiano 2014-12-28 16:12:30 +00:00
commit 33ebc242eb

View File

@ -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(
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
)
)
)
)
$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) {
$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" => ' '));
}
}