diff --git a/src/Util/Logger/SyslogLogger.php b/src/Util/Logger/SyslogLogger.php index b1abd5bd5e..83c3fc3ce5 100644 --- a/src/Util/Logger/SyslogLogger.php +++ b/src/Util/Logger/SyslogLogger.php @@ -66,6 +66,12 @@ class SyslogLogger extends AbstractLogger */ 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 @@ -141,8 +147,12 @@ class SyslogLogger extends AbstractLogger */ 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); @@ -172,6 +182,11 @@ class SyslogLogger extends AbstractLogger return $logMessage; } + private function customErrorHandler($code, $msg) + { + $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); + } + /** * A syslog wrapper to make syslog functionality testable * @@ -180,6 +195,12 @@ class SyslogLogger extends AbstractLogger */ 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)); + } } } diff --git a/tests/src/Util/Logger/SyslogLoggerTest.php b/tests/src/Util/Logger/SyslogLoggerTest.php index 545f76b32f..fbd691d5eb 100644 --- a/tests/src/Util/Logger/SyslogLoggerTest.php +++ b/tests/src/Util/Logger/SyslogLoggerTest.php @@ -59,4 +59,15 @@ class SyslogLoggerTest extends AbstractLoggerTest $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'); + } } diff --git a/tests/src/Util/Logger/SyslogLoggerWrapper.php b/tests/src/Util/Logger/SyslogLoggerWrapper.php index 63ad53690e..779067e28e 100644 --- a/tests/src/Util/Logger/SyslogLoggerWrapper.php +++ b/tests/src/Util/Logger/SyslogLoggerWrapper.php @@ -6,6 +6,9 @@ use Friendica\Util\Introspection; use Friendica\Util\Logger\SyslogLogger; use Psr\Log\LogLevel; +/** + * Wraps the SyslogLogger for replacing the syslog call with a string field. + */ class SyslogLoggerWrapper extends SyslogLogger { private $content;