*/
private $logLevel;
+ /**
+ * A error message of the current operation
+ * @var string
+ */
+ private $errorMessage;
+
/**
* {@inheritdoc}
* @param string $level The minimum loglevel at which this logger will be triggered
*/
private function write($priority, $message)
{
- if (!openlog(self::IDENT, $this->logOpts, $this->logFacility)) {
- throw new InternalServerErrorException('Can\'t open syslog for ident "' . $this->channel . '" and facility "' . $this->logFacility . '""');
+ set_error_handler([$this, 'customErrorHandler']);
+ $opened = openlog(self::IDENT, $this->logOpts, $this->logFacility);
+ restore_error_handler();
+
+ if (!$opened) {
+ throw new \UnexpectedValueException(sprintf('Can\'t open syslog for ident "%s" and facility "%s": ' . $this->errorMessage, $this->channel, $this->logFacility));
}
$this->syslogWrapper($priority, $message);
return $logMessage;
}
+ private function customErrorHandler($code, $msg)
+ {
+ $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg);
+ }
+
/**
* A syslog wrapper to make syslog functionality testable
*
*/
protected function syslogWrapper($level, $entry)
{
- syslog($level, $entry);
+ set_error_handler([$this, 'customErrorHandler']);
+ $written = syslog($level, $entry);
+ restore_error_handler();
+
+ if (!$written) {
+ throw new \UnexpectedValueException(sprintf('Can\'t write into syslog for ident "%s" and facility "%s": ' . $this->errorMessage, $this->channel, $this->logFacility));
+ }
}
}
$logger->log('NOPE', 'a test');
}
+
+ /**
+ * Test when the logfacility is wrong (string)
+ * @expectedException \UnexpectedValueException
+ * @expectedExceptionMessageRegExp /Can\'t open syslog for ident ".*" and facility ".*": .* /
+ */
+ public function testServerException()
+ {
+ $logger = new SyslogLoggerWrapper('test', $this->introspection, LogLevel::DEBUG, null, 'a string');
+ $logger->emergency('not working');
+ }
}