Returns the text display of the specified level.
public static getLevelName ( integer $level ) : string | ||
$level | integer | the message level, e.g. [[LEVEL_ERROR]], [[LEVEL_WARNING]]. |
return | string | the text display of the level |
/** * Stores log messages to sentry. */ public function export() { foreach ($this->messages as $message) { list($msg, $level, $catagory, $timestamp, $traces) = $message; $errStr = ''; $options = ['level' => \yii\log\Logger::getLevelName($level), 'extra' => []]; $templateData = null; if (is_array($msg)) { $errStr = isset($msg['msg']) ? $msg['msg'] : ''; if (isset($msg['data'])) { $options['extra'] = $msg['data']; } } elseif (is_a($msg, \yii\base\Exception::class)) { $errStr = $msg->getMessage(); $traces = $msg->getTrace(); } else { $errStr = $msg; } // Store debug trace in extra data $traces = array_map(function ($v) { $file = isset($v['file']) ? $v['file'] : 'unknown file'; $line = isset($v['line']) ? $v['line'] : 'unknown line'; $class = isset($v['class']) ? $v['class'] : 'unknown class'; $function = isset($v['function']) ? $v['function'] : 'unknown function'; return $file . PHP_EOL . "{$class}::{$function} [{$line}]"; }, $traces); if (!empty($traces)) { $options['extra']['traces'] = $traces; } $this->client->captureMessage($errStr, [], $options, false); } }
protected static function getLevelName($level) { if (in_array($level, [Logger::LEVEL_PROFILE, Logger::LEVEL_PROFILE_BEGIN, Logger::LEVEL_PROFILE_END, Logger::LEVEL_TRACE])) { return 'debug'; } return Logger::getLevelName($level); }
/** * @inheritdoc */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { $text = VarDumper::export($text); } $prefix = $this->getMessagePrefix($message); return "{$prefix}[{$level}][{$category}] {$text}"; }
/** * @inheritdoc */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { $text = var_export($text, true); } $prefix = $this->prefix ? call_user_func($this->prefix, $message) : $this->getMessagePrefix($message); return "{$prefix}[{$level}][{$category}] {$text}"; }
/** * Sends log message to Sentry instance. */ public function export() { foreach ($this->messages as $message) { $options = ['level' => Logger::getLevelName($message[1])]; $logMessage = $this->formatMessage($message); $text = $message[0]; if (!is_string($text) && $text instanceof \Exception) { $logMessage = $text->getMessage() . "\n\n" . $logMessage; } $this->getClient()->captureMessage($logMessage, [], $options); } }
public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { // exceptions may not be serializable if in the call stack somewhere is a Closure if ($text instanceof \Exception) { $text = (string) $text; } else { $text = VarDumper::export($text); } } $prefix = $this->getMessagePrefix($message); return "Level: " . ucfirst($level) . " \n\n Time: " . date('F j, Y, g:i a (T)', $timestamp) . "\n\n Message:\n {$text} \n\n {$prefix} \n\n"; }
/** * @inheritdoc */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { // exceptions may not be serializable if in the call stack somewhere is a Closure if ($text instanceof \Throwable || $text instanceof \Exception) { $text = (string) $text; } else { $text = VarDumper::export($text); } } $prefix = $this->getMessagePrefix($message); return "{$prefix}[{$level}][{$category}] {$text}"; }
/** * Exports log [[messages]] to a specific destination. */ public function export() { foreach ($this->messages as $message) { list($msg, $level, $category, $timestamp, $traces) = $message; $levelName = Logger::getLevelName($level); if (!in_array($levelName, ['error', 'warning', 'info'])) { $levelName = 'error'; } $data = ['timestamp' => gmdate('Y-m-d\\TH:i:s\\Z', $timestamp), 'level' => $levelName, 'tags' => ['category' => $category], 'message' => $msg]; if (!empty($traces)) { $data['sentry.interfaces.Stacktrace'] = ['frames' => Raven_Stacktrace::get_stack_info($traces)]; } $this->client->capture($data, false); } }
/** * Writes log messages to a file. */ public function export() { $data = []; foreach ($this->messages as $message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); //$messageString = date('Y-m-d H:i:s', $timestamp) . " [$level][$category] $text"; //$messageArray = explode(PHP_EOL, $messageString); $needSkip = strpos($category, self::I18N_MESSAGE_KEY) !== false; if (strpos(LOG_LEVEL, $level) !== false && !$needSkip) { //$data[$level][] = $messageArray; $data[$level] = $text; } } foreach ($data as $key => $value) { LogUtil::$key($value); } }
/** * (non-PHPdoc) * @see \yii\log\Target::formatMessage() */ public function formatMessage($message) { if (!$this->with_microtime) { return parent::formatMessage($message); } list($text, $level, $category, $timestamp) = $message; $level = \yii\log\Logger::getLevelName($level); if (!is_string($text)) { $text = VarDumper::export($text); } $traces = []; if (isset($message[4])) { foreach ($message[4] as $trace) { $traces[] = "in {$trace['file']}:{$trace['line']}"; } } $prefix = $this->getMessagePrefix($message); return (new \DateTime())->setTimestamp($timestamp)->format('Y-m-d H:i:s') . ':' . str_pad(round(($timestamp - floor($timestamp)) * 1000000), 6, '0', STR_PAD_RIGHT) . " {$prefix}[{$level}][{$category}] {$text}" . (empty($traces) ? '' : "\n " . implode("\n ", $traces)); }
/** * Formats a log message for display as a string. * @param array $message the log message to be formatted. * The message structure follows that in [[Logger::messages]]. * @return string the formatted message */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { // exceptions may not be serializable if in the call stack somewhere is a Closure if ($text instanceof \Throwable || $text instanceof \Exception) { $text = sprintf('[%s] %s', $text->getCode(), $text->getMessage()); } elseif (is_array($text)) { /* * Only VarDump if array, don't want to inadvertently log objects with sensitive info */ $text = VarDumper::export($text); } else { $text = sprintf('Unsupported object of type %s sent to logger', get_class($text)); } } $prefix = $this->getMessagePrefix($message); return date('Y-m-d H:i:s', $timestamp) . " {$prefix}[{$level}][{$category}] {$text}"; }
/** * Formats a log message for display as a string. * @param array $message the log message to be formatted. * The message structure follows that in Logger::messages. * @return string the formatted message */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { // exceptions may not be serializable if in the call stack somewhere is a Closure if ($text instanceof \Exception) { $text = (string) $text; } else { $text = VarDumper::export($text); } } $traces = []; if (isset($message[4])) { foreach ($message[4] as $trace) { $traces[] = "in {$trace['file']}:{$trace['line']}"; } } $prefix = $this->getMessagePrefix($message); return date('Y-m-d H:i:s', $timestamp) . '.' . (strpos($timestamp, '.') ? str_pad(explode('.', (string) $timestamp)[1], 10, '0') : '0000000000') . " {$prefix}[{$level}][{$category}] {$text}" . (empty($traces) ? '' : "\n " . implode("\n ", $traces)); }
public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = log\Logger::getLevelName($level); if (!is_string($text)) { $text = VarDumper::export($text); } $traces = []; if (isset($message[4])) { foreach ($message[4] as $trace) { $traces[] = "in {$trace['file']}:{$trace['line']}"; } } $prefix = $this->getMessagePrefix($message); $text = str_replace(array("\t", "\n"), '', $text); $logs = ['time' => date('Y-m-d H:i:s', $timestamp), 'ip' => $prefix['ip'], 'reqId' => $prefix['reqId'], 'module' => $prefix['module'], 'level' => $level, 'category' => $category, 'text' => $text]; if (!empty($traces)) { $logs['traces'] = $traces[0]; } return implode("\t", $logs); }
/** * @param $message * * @return string */ private function generateLabel($message) { $label = ''; //Add date to log if (true == $this->displayDate) { $label .= '[' . date($this->dateFormat, time()) . ']'; } //Add category to label if (true == $this->displayCategory) { $label .= "[" . $message[2] . "]"; } $level = Logger::getLevelName($message[1]); $tmpLevel = "[{$level}]"; if (Console::streamSupportsAnsiColors(\STDOUT)) { if (isset($this->color[$level])) { $tmpLevel = Console::ansiFormat($tmpLevel, [$this->color[$level]]); } else { $tmpLevel = Console::ansiFormat($tmpLevel, [Console::BOLD]); } } $label .= $tmpLevel; return $label; }
/** * Exports log [[messages]] to a specific destination. */ public function export() { foreach ($this->messages as $message) { list($msg, $level, $category, $timestamp, $traces) = $message; $levelName = Logger::getLevelName($level); if (!in_array($levelName, ['error', 'warning', 'info'])) { $levelName = 'error'; } if (is_array($msg)) { if (isset($msg['data'])) { $new_extras = $msg['data']; unset($msg['data']); } if (isset($msg['msg'])) { $new_msg = $msg['msg']; unset($msg['msg']); } else { $new_msg = 'Unknown event format'; // deliver event data even if the format doesn't fit $new_extras = array_merge($new_extras, $msg); $new_tags = ['format' => 'unknown']; } } $data = ['timestamp' => gmdate('Y-m-d\\TH:i:s\\Z', $timestamp), 'level' => $levelName, 'tags' => ['category' => $category], 'message' => isset($new_msg) ? $new_msg : $msg]; if (isset($new_tags)) { $data['tags'] = array_merge($new_tags, $this->client->get_tags(), $this->client->context->extra); } if (isset($new_extras)) { $data['extra'] = array_merge($new_extras, $this->client->tags, $this->client->context->tags); } if (!empty($traces)) { $data['sentry.interfaces.Stacktrace'] = ['frames' => Raven_Stacktrace::get_stack_info($traces)]; } $this->client->capture($data, false); } }
/** * Stores log messages to sentry. */ public function export() { foreach ($this->messages as $message) { list($msg, $level, $catagory, $timestamp, $traces) = $message; $options = ['level' => log\Logger::getLevelName($level), 'extra' => []]; $templateData = null; if (is_array($msg)) { $errStr = isset($msg['msg']) ? $msg['msg'] : ''; if (isset($msg['data'])) { $options['extra'] = $msg['data']; } } else { $errStr = $msg; } // Store debug trace in extra data $traces = array_map(function ($v) { return "{$v['file']}" . PHP_EOL . "{$v['class']}::{$v['function']} [{$v['line']}]"; }, $traces); if (!empty($traces)) { $options['extra']['traces'] = $traces; } $this->client->captureMessage($errStr, array(), $options, false); } }
/** * Generating tag name based on $tagFormat * * @param $messages * @return string */ private function createTag($messages) { return str_replace(['%date', '%timestamp', '%level'], [date('Y-m-d H:i:s'), time(), Logger::getLevelName($messages[0][1])], $this->tagFormat); }
/** * Transform log message to assoc. * * @param array $message The log message. * * @return array */ protected function prepareMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); $timestamp = date('c', $timestamp); $result = ArrayHelper::merge($this->parseText($text), ['level' => $level, 'category' => $category, '@timestamp' => $timestamp]); if (isset($message[4]) === true) { $result['trace'] = $message[4]; } return $result; }
/** * Formats a log message for display as a string. * @param array $message the log message to be formatted. * The message structure follows that in [[Logger::messages]]. * @return string the formatted message */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { $text = VarDumper::export($text); } $traces = []; if (isset($message[4])) { foreach ($message[4] as $trace) { $traces[] = "in {$trace['file']}:{$trace['line']}"; } } $prefix = $this->getMessagePrefix($message); return date('Y-m-d H:i:s', $timestamp) . " {$prefix}[{$level}][{$category}] {$text}" . (empty($traces) ? '' : "\n " . implode("\n ", $traces)); }
/** * Compile log message. Adds remote ip address and trail id if enabled. * * @param array $message * @return array */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); $msg = ['timestamp' => date('Y/m/d H:i:s', $timestamp), 'level' => $level, 'category' => $category, 'message' => $text]; if ($this->enableIp) { $msg['ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0'; } if ($this->enableTrail) { $msg['trail'] = $this->trail; } return $msg; }
/** * Default line formatting * * @param string $text the actual log-text * @param integer $level the log level * @param string $category the log category * @param integer $timestamp the events timestamp * @return string the formatted line */ public function formatLine($text, $level, $category, $timestamp) { return sprintf("%-19s [%-7s] [%s]\n %s", Yii::$app->formatter->asDatetime($timestamp, 'php:d.m.Y H:i:s'), strtoupper(Logger::getLevelName($level)), $category, $text); }
/** * @inheritdoc */ public function formatMessage($loggerMessage) { // Retrieve the relevant pieces of data from the logger message data. list($messageContent, $level, $category) = $loggerMessage; // Begin assembling the data that we will JSON-encode for the log. $logData = array(); // If the prefix is already a JSON string, decode it (to avoid // double-encoding it below). $prefix = $this->getMessagePrefix($loggerMessage); $prefixData = $this->extractPrefixKeyValueData($prefix); // Only include the prefix data and/or raw prefix if there was content. if ($prefixData) { foreach ($prefixData as $key => $value) { $logData[$key] = $value; } } elseif ($prefix) { $logData['prefix'] = $prefix; } $logData['level'] = Logger::getLevelName($level); $logData['category'] = $category; $logData['message'] = $this->extractMessageContentData($messageContent); // Format the data as a JSON string and return it. return Json::encode($logData); }
/** * Returns a properly formatted message attachment for Slack API. * * @param array $message * * @return array */ protected function formatMessageAttachment($message) { list($text, $level, $category, $timestamp) = $message; $attachment = ['fallback' => $this->encodeMessage($this->formatMessage($message)), 'title' => ucwords(Logger::getLevelName($level)), 'fields' => [['title' => 'Level', 'value' => Logger::getLevelName($level), 'short' => true], ['title' => 'Category', 'value' => '`' . $this->encodeMessage($category) . '`', 'short' => true]], 'footer' => static::className(), 'ts' => (int) round($timestamp), 'mrkdwn_in' => ['fields', 'text']]; if (isset($this->prefix)) { $attachment['fields'][] = ['title' => 'Prefix', 'value' => '`' . $this->encodeMessage(call_user_func($this->prefix, $message)) . '`', 'short' => true]; } if (isset(\Yii::$app)) { $this->insertRequestIntoAttachment($attachment); $this->insertUserIntoAttachment($attachment); $this->insertSessionIntoAttachment($attachment); } if (isset($this->colors[$level])) { $attachment['color'] = $this->colors[$level]; } if (!is_string($text)) { if ($text instanceof \Throwable || $text instanceof \Exception) { $text = (string) $text; } else { $text = VarDumper::export($text); } } $attachment['text'] = "```\n" . $this->encodeMessage($text) . "\n```"; if (isset($message[4]) && !empty($message[4])) { $this->insertTracesIntoAttachment($message[4], $attachment); } return $attachment; }
/** * Formats a log message. * The message structure follows that in [[Logger::messages]]. * @param array $message the log message to be formatted. * @return string the formatted message */ public function formatMessage($message) { list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { $text = var_export($text, true); } $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1'; return date('Y/m/d H:i:s', $timestamp) . " [{$ip}] [{$level}] [{$category}] {$text}"; }
use yii\grid\GridView; use yii\helpers\Html; /* @var $this yii\web\View */ /* @var $searchModel backend\models\search\SystemLogSearch */ /* @var $dataProvider yii\data\ActiveDataProvider */ $this->title = Yii::t('backend', 'System Logs'); $this->params['breadcrumbs'][] = $this->title; ?> <div class="system-log-index"> <p> <?php echo Html::a(Yii::t('backend', 'Clear'), false, ['class' => 'btn btn-danger', 'data-method' => 'delete']); ?> </p> <?php // echo $this->render('_search', ['model' => $searchModel]); ?> <?php echo GridView::widget(['dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [['class' => 'yii\\grid\\SerialColumn'], ['attribute' => 'level', 'value' => function ($model) { return \yii\log\Logger::getLevelName($model->level); }, 'filter' => [\yii\log\Logger::LEVEL_ERROR => 'error', \yii\log\Logger::LEVEL_WARNING => 'warning', \yii\log\Logger::LEVEL_INFO => 'info', \yii\log\Logger::LEVEL_TRACE => 'trace', \yii\log\Logger::LEVEL_PROFILE_BEGIN => 'profile begin', \yii\log\Logger::LEVEL_PROFILE_END => 'profile end']], 'category', 'prefix', ['attribute' => 'log_time', 'format' => 'datetime', 'value' => function ($model) { return (int) $model->log_time; }], ['class' => 'yii\\grid\\ActionColumn', 'template' => '{view}{delete}']]]); ?> </div>
<?php use yii\helpers\Html; use yii\widgets\DetailView; /* @var $this yii\web\View */ /* @var $model backend\modules\log\models\SystemLog */ $this->title = $model->id; $this->params['breadcrumbs'][] = ['label' => Yii::t('backend', 'System Logs'), 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; ?> <div class="box box-primary"> <div class="box-body"> <p> <?php echo Html::a(Yii::t('backend', 'Delete'), ['delete', 'id' => $model->id], ['class' => 'btn btn-danger', 'data' => ['confirm' => Yii::t('backend', 'Are you sure you want to delete this item?'), 'method' => 'post']]); ?> </p> <?php echo DetailView::widget(['model' => $model, 'attributes' => ['id', ['attribute' => 'level', 'value' => \yii\log\Logger::getLevelName($model->level)], 'category', 'log_time:datetime', 'prefix:ntext', ['attribute' => 'message', 'format' => 'raw', 'value' => Html::tag('pre', $model->message, ['style' => 'white-space: pre-wrap'])]]]); ?> </div> </div>
<?php use yii\bootstrap\Html; use yii\grid\GridView; use yii\log\Logger; /* @var $this yii\web\View */ /* @var $searchModel backend\models\search\LogSearch */ /* @var $dataProvider yii\data\ActiveDataProvider */ $this->title = Yii::t('backend', 'Logs'); $this->params['breadcrumbs'][] = $this->title; ?> <div class="log-index"> <p> <?php echo Html::a(Yii::t('backend', 'Clear'), false, ['class' => 'btn btn-danger', 'data-method' => 'delete']); ?> </p> <?php echo GridView::widget(['dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [['attribute' => 'level', 'value' => function ($model) { return Logger::getLevelName($model->level); }, 'filter' => [Logger::LEVEL_ERROR => 'error', Logger::LEVEL_WARNING => 'warning', Logger::LEVEL_INFO => 'info', Logger::LEVEL_TRACE => 'trace', Logger::LEVEL_PROFILE_BEGIN => 'profile begin', Logger::LEVEL_PROFILE_END => 'profile end']], 'category', ['attribute' => 'log_time', 'format' => 'datetime', 'value' => function ($model) { return (int) $model->log_time; }], 'prefix', ['class' => 'yii\\grid\\ActionColumn', 'template' => '{view} {delete}']]]); ?> </div>
/** * @return string */ public function getLevelName() { return Logger::getLevelName($this->level); }
} else { return $data['timestamp']; } }, 'headerOptions' => ['class' => 'sort-numerical text-align-center'], 'footerOptions' => ['class' => 'sort-numerical text-align-center font-weight-bold th'], 'contentOptions' => ['class' => 'nowrap font-size-10px text-align-center']], ['attribute' => 'level', 'value' => function ($data) { switch ($data['level']) { case Logger::LEVEL_ERROR: $class = 'label label-danger'; break; case Logger::LEVEL_WARNING: $class = 'label label-warning'; break; case Logger::LEVEL_INFO: $class = 'label label-primary'; break; default: $class = 'label label-default'; break; } return Html::tag('span', Logger::getLevelName($data['level']), ['class' => $class]); }, 'format' => 'html', 'filter' => [Logger::LEVEL_TRACE => ' Trace ', Logger::LEVEL_INFO => ' Info ', Logger::LEVEL_WARNING => ' Warning ', Logger::LEVEL_ERROR => ' Error '], 'filterInputOptions' => ['class' => 'form-control chosen-select', 'id' => null, 'prompt' => ' All '], 'headerOptions' => ['class' => 'text-align-center'], 'footerOptions' => ['class' => 'text-align-center font-weight-bold th'], 'contentOptions' => ['class' => 'text-align-center']], ['attribute' => 'category', 'headerOptions' => ['class' => 'text-align-center'], 'footerOptions' => ['class' => 'text-align-center font-weight-bold th'], 'contentOptions' => ['class' => 'font-size-10px']], ['attribute' => 'message', 'value' => function ($data) { $description = Html::encode(is_string($data['message']) ? $data['message'] : VarDumper::export($data['message'])); $message = '<a href="javascript:;" class="spoiler-title" data-title="" data-content="' . $description . '">' . Stringy::substr(Stringy::collapseWhitespace($description), 0, 60, 'UTF-8') . '...' . '</a>'; $trace = ''; if (!empty($data['trace'])) { $trace .= Html::ul($data['trace'], ['class' => 'trace', 'item' => function ($trace) { return "<li>{$trace['file']} ({$trace['line']})</li>"; }]); } $message .= '<div class="spoiler-content"><strong>Message: </strong><br /><pre>' . $description . '</pre>' . (!empty($trace) ? '<br /><p><strong>Trace: </strong>' . $trace . '</p>' : '') . '</div>'; return $message; }, 'format' => 'html', 'options' => ['width' => '50%'], 'contentOptions' => ['class' => 'spoiler']]]]);
use yii\helpers\VarDumper; use yii\log\Logger; ?> <h1>Log Messages</h1> <?php echo GridView::widget(['dataProvider' => $dataProvider, 'id' => 'log-panel-detailed-grid', 'options' => ['class' => 'detail-grid-view table-responsive'], 'filterModel' => $searchModel, 'filterUrl' => $panel->getUrl(), 'rowOptions' => function ($model, $key, $index, $grid) { switch ($model['level']) { case Logger::LEVEL_ERROR: return ['class' => 'danger']; case Logger::LEVEL_WARNING: return ['class' => 'warning']; case Logger::LEVEL_INFO: return ['class' => 'success']; default: return []; } }, 'columns' => [['class' => 'yii\\grid\\SerialColumn'], ['attribute' => 'time', 'value' => function ($data) { $timeInSeconds = $data['time'] / 1000; $millisecondsDiff = (int) (($timeInSeconds - (int) $timeInSeconds) * 1000); return date('H:i:s.', $timeInSeconds) . sprintf('%03d', $millisecondsDiff); }, 'headerOptions' => ['class' => 'sort-numerical']], ['attribute' => 'level', 'value' => function ($data) { return Logger::getLevelName($data['level']); }, 'filter' => [Logger::LEVEL_TRACE => ' Trace ', Logger::LEVEL_INFO => ' Info ', Logger::LEVEL_WARNING => ' Warning ', Logger::LEVEL_ERROR => ' Error ']], 'category', ['attribute' => 'message', 'value' => function ($data) { $message = Html::encode(is_string($data['message']) ? $data['message'] : VarDumper::export($data['message'])); if (!empty($data['trace'])) { $message .= Html::ul($data['trace'], ['class' => 'trace', 'item' => function ($trace) { return "<li>{$trace['file']} ({$trace['line']})</li>"; }]); } return $message; }, 'format' => 'html', 'options' => ['width' => '50%']]]]);