From 143537364978f038de1afb92928c0484f49fc22c Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Mon, 18 Nov 2013 21:38:10 +0000 Subject: [PATCH 1/9] add html email formatter --- src/Monolog/Formatter/HtmlEmailFormatter.php | 103 +++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/Monolog/Formatter/HtmlEmailFormatter.php diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php new file mode 100644 index 00000000..bc696754 --- /dev/null +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Formats incoming records into a HTML table + * + * This is especially useful for html email logging + * + * @author Tiago Brito + */ +class HtmlEmailFormatter extends NormalizerFormatter { + + /** + * Translates Monolog log levels to html colors priorities. + */ + private $logLevels = array( + Logger::DEBUG => '#cccccc', + Logger::INFO => '#468847', + Logger::NOTICE => '#3a87ad', + Logger::WARNING => '#c09853', + Logger::ERROR => '#f0ad4e', + Logger::CRITICAL => '#b94a48', + Logger::ALERT => '#d9534f', + Logger::EMERGENCY => '#ffffff', + ); + /** + * @param string $format The format of the message + * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct($format = null, $dateFormat = null) + { + parent::__construct($dateFormat); + } + + private function addRow($th, $td=' ') + { + return "\n$th:\n".nl2br($td)."\n"; + } + + private function addTitle($title, $level) + { + return '

'.$title.'

'; + } + /** + * Formats a log record. + * + * @param array $record A record to format + * @return mixed The formatted record + */ + public function format(array $record) + { + $output = $this->addTitle($this->convertToString($record['level_name']), $record['level']); + $output .= ''; + + $output .= $this->addRow('Message', $this->convertToString($record['message'])); + $output .= $this->addRow('Generated at', $this->convertToString($record['datetime'])); + $output .= $this->addRow('Level', $this->convertToString($record['level'])); + $output .= $this->addRow('Channel', $this->convertToString($record['channel'])); + $output .= $this->addRow('Context', $this->convertToString($record['context'])); + $output .= $this->addRow('Extra', $this->convertToString($record['extra'])); + + return $output.'
'; + } + + /** + * Formats a set of log records. + * + * @param array $records A set of records to format + * @return mixed The formatted set of records + */ + public function formatBatch(array $records) + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } + + protected function convertToString($data) + { + if (null === $data || is_scalar($data)) { + return (string) $data; + } + + $data = $this->normalize($data); + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + } + + return str_replace('\\/', '/', json_encode($data)); + } +} From 87b0e659529ead1f900a362c36035e0a8e929238 Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Tue, 19 Nov 2013 02:00:04 +0000 Subject: [PATCH 2/9] fix code-style and add documentation to addTitle and addRow methods --- src/Monolog/Formatter/HtmlEmailFormatter.php | 26 ++++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php index bc696754..d5d6e527 100644 --- a/src/Monolog/Formatter/HtmlEmailFormatter.php +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -17,7 +17,8 @@ namespace Monolog\Formatter; * * @author Tiago Brito */ -class HtmlEmailFormatter extends NormalizerFormatter { +class HtmlEmailFormatter extends NormalizerFormatter +{ /** * Translates Monolog log levels to html colors priorities. @@ -32,6 +33,7 @@ class HtmlEmailFormatter extends NormalizerFormatter { Logger::ALERT => '#d9534f', Logger::EMERGENCY => '#ffffff', ); + /** * @param string $format The format of the message * @param string $dateFormat The format of the timestamp: one supported by DateTime::format @@ -41,15 +43,29 @@ class HtmlEmailFormatter extends NormalizerFormatter { parent::__construct($dateFormat); } - private function addRow($th, $td=' ') + /** + * Create a HTML table row + * + * @param $th string Row header content + * @param string $td Row standard cell content + * @return string + */ + private function addRow($th, $td = ' ') { return "\n$th:\n".nl2br($td)."\n"; } + /** + * Create a HTML h1 tag + * + * @param $title string Text to be in the H1 + * @param $level integer Error level + * @return string + */ private function addTitle($title, $level) - { - return '

'.$title.'

'; - } + { + return '

'.$title.'

'; + } /** * Formats a log record. * From 5ce58ad471844d63439a808aaad4d576a62a3bd5 Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Tue, 19 Nov 2013 09:49:49 +0000 Subject: [PATCH 3/9] Remove the unused $format parameter from the construct --- src/Monolog/Formatter/HtmlEmailFormatter.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php index d5d6e527..678534ca 100644 --- a/src/Monolog/Formatter/HtmlEmailFormatter.php +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -35,10 +35,9 @@ class HtmlEmailFormatter extends NormalizerFormatter ); /** - * @param string $format The format of the message * @param string $dateFormat The format of the timestamp: one supported by DateTime::format */ - public function __construct($format = null, $dateFormat = null) + public function __construct($dateFormat = null) { parent::__construct($dateFormat); } From 06667ddf0b52a3e1685d1522f8852da829fc4dca Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Tue, 19 Nov 2013 09:58:40 +0000 Subject: [PATCH 4/9] Add
 tag to define the json as a preformatted text.

---
 src/Monolog/Formatter/HtmlEmailFormatter.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php
index 678534ca..890bd841 100644
--- a/src/Monolog/Formatter/HtmlEmailFormatter.php
+++ b/src/Monolog/Formatter/HtmlEmailFormatter.php
@@ -110,7 +110,7 @@ class HtmlEmailFormatter extends NormalizerFormatter
 
         $data = $this->normalize($data);
         if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
-            return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
+            return '
'.json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE).'
'; } return str_replace('\\/', '/', json_encode($data)); From 474250f5ff75350a117570f9a74c2276626a9742 Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Tue, 19 Nov 2013 16:18:58 +0000 Subject: [PATCH 5/9] Fix english in doc blocks --- src/Monolog/Formatter/HtmlEmailFormatter.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php index 890bd841..bf55097a 100644 --- a/src/Monolog/Formatter/HtmlEmailFormatter.php +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -19,9 +19,8 @@ namespace Monolog\Formatter; */ class HtmlEmailFormatter extends NormalizerFormatter { - /** - * Translates Monolog log levels to html colors priorities. + * Translates Monolog log levels to html color priorities. */ private $logLevels = array( Logger::DEBUG => '#cccccc', @@ -43,7 +42,7 @@ class HtmlEmailFormatter extends NormalizerFormatter } /** - * Create a HTML table row + * Creates an HTML table row * * @param $th string Row header content * @param string $td Row standard cell content @@ -57,7 +56,7 @@ class HtmlEmailFormatter extends NormalizerFormatter /** * Create a HTML h1 tag * - * @param $title string Text to be in the H1 + * @param $title string Text to be in the h1 * @param $level integer Error level * @return string */ From ec974cf3a167bbd663d9ed17b9c2c4ce33bce18a Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Tue, 19 Nov 2013 23:39:11 +0000 Subject: [PATCH 6/9] convert $th content special characters to HTML and make all the tables with the same with --- src/Monolog/Formatter/HtmlEmailFormatter.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php index bf55097a..2304c8f2 100644 --- a/src/Monolog/Formatter/HtmlEmailFormatter.php +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -48,9 +48,11 @@ class HtmlEmailFormatter extends NormalizerFormatter * @param string $td Row standard cell content * @return string */ - private function addRow($th, $td = ' ') + private function addRow($th, $td = ' ') { - return "\n$th:\n".nl2br($td)."\n"; + $td = '
'.htmlspecialchars($td).'
'; + + return "\n$th:\n".$td."\n"; } /** @@ -73,7 +75,7 @@ class HtmlEmailFormatter extends NormalizerFormatter public function format(array $record) { $output = $this->addTitle($this->convertToString($record['level_name']), $record['level']); - $output .= ''; + $output .= '
'; $output .= $this->addRow('Message', $this->convertToString($record['message'])); $output .= $this->addRow('Generated at', $this->convertToString($record['datetime'])); @@ -109,7 +111,7 @@ class HtmlEmailFormatter extends NormalizerFormatter $data = $this->normalize($data); if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return '
'.json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE).'
'; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } return str_replace('\\/', '/', json_encode($data)); From 2fd22fe38624a3f5544f4fcf29bf858a9602ae3b Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Wed, 20 Nov 2013 00:52:01 +0000 Subject: [PATCH 7/9] consistent spacing in html tags --- src/Monolog/Formatter/HtmlEmailFormatter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php index 2304c8f2..7438ae20 100644 --- a/src/Monolog/Formatter/HtmlEmailFormatter.php +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -52,7 +52,7 @@ class HtmlEmailFormatter extends NormalizerFormatter { $td = '
'.htmlspecialchars($td).'
'; - return "
\n\n\n"; + return "\n\n\n"; } /** @@ -64,7 +64,7 @@ class HtmlEmailFormatter extends NormalizerFormatter */ private function addTitle($title, $level) { - return '

'.$title.'

'; + return '

'.$title.'

'; } /** * Formats a log record. From b230483fa59ec42dc9965aa3e8d4b279c51949e4 Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Wed, 20 Nov 2013 00:54:00 +0000 Subject: [PATCH 8/9] consistent spacing in title style attribute --- src/Monolog/Formatter/HtmlEmailFormatter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php index 7438ae20..662eeef8 100644 --- a/src/Monolog/Formatter/HtmlEmailFormatter.php +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -64,7 +64,7 @@ class HtmlEmailFormatter extends NormalizerFormatter */ private function addTitle($title, $level) { - return '

'.$title.'

'; + return '

'.$title.'

'; } /** * Formats a log record. From e98c525dd3c4da292bc296fe61a644b55949416e Mon Sep 17 00:00:00 2001 From: Tiago Brito Date: Wed, 20 Nov 2013 11:34:14 +0000 Subject: [PATCH 9/9] convert $title and $th special characters to HTML --- src/Monolog/Formatter/HtmlEmailFormatter.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Monolog/Formatter/HtmlEmailFormatter.php b/src/Monolog/Formatter/HtmlEmailFormatter.php index 662eeef8..056bf13b 100644 --- a/src/Monolog/Formatter/HtmlEmailFormatter.php +++ b/src/Monolog/Formatter/HtmlEmailFormatter.php @@ -50,6 +50,7 @@ class HtmlEmailFormatter extends NormalizerFormatter */ private function addRow($th, $td = ' ') { + $th = htmlspecialchars($th); $td = '
'.htmlspecialchars($td).'
'; return "
\n\n\n"; @@ -64,6 +65,8 @@ class HtmlEmailFormatter extends NormalizerFormatter */ private function addTitle($title, $level) { + $title = htmlspecialchars($title); + return '

'.$title.'

'; } /**
$th:".$td."
$th:".$td."
$th:".$td."