From 256453ad949123f3f84fedc6462cb310a84b4870 Mon Sep 17 00:00:00 2001 From: Davide Pastore Date: Fri, 7 Mar 2014 11:41:32 +0100 Subject: [PATCH] Added HtmlFileWriter --- Log/HtmlFileWriter.php | 186 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 Log/HtmlFileWriter.php diff --git a/Log/HtmlFileWriter.php b/Log/HtmlFileWriter.php new file mode 100644 index 0000000..3f03949 --- /dev/null +++ b/Log/HtmlFileWriter.php @@ -0,0 +1,186 @@ + new \Slim\Extras\Log\HtmlFileWriter() + * )); + * + * SETTINGS + * + * You may customize this log writer by passing an array of + * settings into the class constructor. Available options + * are shown above the constructor method below. + * + * @author Davide Pastore + * @copyright 2014 Davide Pastore + * + * MIT LICENSE + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +namespace Slim\Extras\Log; + +class HtmlFileWriter +{ + /** + * @var \DOMDocument + */ + protected $doc; + + /** + * @var array + */ + protected $settings; + + /** + * The base html skeleton. + * @var unknown + */ + protected $htmlSkeleton = 'Logger
LabelDateMessage
'; + + /** + * Constructor + * + * Prepare this log writer. Available settings are: + * + * path: + * (string) The relative or absolute filesystem path to a writable directory. + * + * name_format: + * (string) The log file name format; parsed with `date()`. + * + * extension: + * (string) The file extention to append to the filename`. + * + * date_message_format: + * (string) The date format to use in the %date% parameter in message_format; parsed with `date()`. + * + * message_format: + * (string) The log message format; available tokens are... + * %label% Replaced with the log message level (e.g. FATAL, ERROR, WARN). + * %date% Replaced with a date string for current timezone (default is ISO8601). + * %message% Replaced with the log message, coerced to a string. + * %class% Replaced with the CSS class (the log message level in the lower case). + * + * @param array $settings + * @return void + */ + public function __construct($settings = array()) + { + //Merge user settings + $this->settings = array_merge(array( + 'path' => './logs', + 'name_format' => 'Y-m-d', + 'extension' => 'html', + 'date_message_format' => 'c', + 'message_format' => '%label%%date%%message%' + ), $settings); + + //Remove trailing slash from log path + $this->settings['path'] = rtrim($this->settings['path'], DIRECTORY_SEPARATOR); + } + + /** + * Write to log + * + * @param mixed $object + * @param int $level + * @return void + */ + public function write($object, $level) + { + //Determine label + $label = 'DEBUG'; + switch ($level) { + case \Slim\Log::EMERGENCY: + $label = 'EMERGENCY'; + break; + case \Slim\Log::ALERT: + $label = 'ALERT'; + break; + case \Slim\Log::CRITICAL: + $label = 'CRITICAL'; + break; + case \Slim\Log::ERROR: + $label = 'ERROR'; + break; + case \Slim\Log::WARN: + $label = 'WARN'; + break; + case \Slim\Log::NOTICE: + $label = 'NOTICE'; + break; + case \Slim\Log::INFO: + $label = 'INFO'; + break; + } + + //Get formatted log message + $message = str_replace(array( + '%label%', + '%date%', + '%message%', + '%class%' + ), array( + $label, + date($this->settings['date_message_format']), + htmlspecialchars((string)$object), + strtolower($label) + ), $this->settings['message_format']); + + + //Set the filename + $filename = date($this->settings['name_format']); + if (! empty($this->settings['extension'])) { + $filename .= '.' . $this->settings['extension']; + } + + //Open resource handle to log file + if (!$this->doc) { + + $this->doc = new \DOMDocument(); + + //Try to open the file + if(file_exists($this->settings['path'] . DIRECTORY_SEPARATOR . $filename)){ + $this->doc->loadHTMLFile($this->settings['path'] . DIRECTORY_SEPARATOR . $filename); + } + else{ + $this->doc = new \DOMDocument(); + $this->doc->loadHTML($this->htmlSkeleton); + } + } + + //Output to resource + $element = $this->doc->getElementById('log'); + $fragment = $this->doc->createDocumentFragment(); + $fragment->appendXML($message); + $element->appendChild($fragment); + $this->doc->saveHTMLFile($this->settings['path'] . DIRECTORY_SEPARATOR . $filename); + } +}