diff --git a/library/Icinga/Logger/Writer/StreamWriter.php b/library/Icinga/Logger/Writer/StreamWriter.php new file mode 100644 index 000000000..f0336cda0 --- /dev/null +++ b/library/Icinga/Logger/Writer/StreamWriter.php @@ -0,0 +1,97 @@ +stream = Config::resolvePath($config->target); + $this->setup(); + } + + /** + * Log a message with the given severity + * + * @param int $severity The severity to use + * @param string $message The message to log + */ + public function log($severity, $message) + { + $this->write(date('c') . ' ' . $this->getSeverityString($severity) . ' ' . $message); + } + + /** + * Create the stream if it does not already exist + */ + protected function setup() + { + if (substr($this->stream, 0, 6) !== 'php://') { + if (!file_exists($this->stream) && (!@touch($this->stream) || !@chmod($this->stream, 0664))) { + throw new ConfigurationError('Cannot create log file "' . $this->stream . '"'); + } + + if (!@is_writable($this->stream)) { + throw new ConfigurationError('Cannot write to log file "' . $this->stream . '"'); + } + } + } + + /** + * Return a string representation for the given severity + * + * @param string $severity The severity to use + * + * @return string The string representation of the severity + * + * @throws Exception In case the given severity is unknown + */ + protected function getSeverityString($severity) + { + switch ($severity) { + case Logger::$ERROR: + return '- ERROR -'; + case Logger::$WARNING: + return '- WARNING -'; + case Logger::$INFO: + return '- INFO -'; + case Logger::$DEBUG: + return '- DEBUG -'; + default: + throw new Exception('Unknown severity "' . $severity . '"'); + } + } + + /** + * Write a message to the stream + * + * @param string $text The message to write + */ + protected function write($text) + { + $fd = fopen($this->stream, 'a'); + fwrite($fd, $text . PHP_EOL); + fclose($fd); + } +} diff --git a/test/php/library/Icinga/Application/LoggerTest.php b/test/php/library/Icinga/Application/LoggerTest.php index af996d1d2..32e8d3980 100644 --- a/test/php/library/Icinga/Application/LoggerTest.php +++ b/test/php/library/Icinga/Application/LoggerTest.php @@ -35,6 +35,8 @@ use Icinga\Test\BaseTestCase; // @codingStandardsIgnoreStart require_once BaseTestCase::$libDir . '/Logger/Logger.php'; +require_once BaseTestCase::$libDir . '/Logger/LogWriter.php'; +require_once BaseTestCase::$libDir . '/Logger/Writer/StreamWriter.php'; // @codingStandardsIgnoreEnd use \Zend_Config;