. */ namespace SP\Providers\Log; use DI\Container; use Monolog\Handler\SyslogUdpHandler; use Monolog\Logger; use SP\Core\Events\Event; use SP\Core\Events\EventReceiver; use SP\Core\Language; use SP\Providers\EventsTrait; use SP\Providers\Provider; use SplSubject; /** * Class RemoteSyslogHandler * * @package SP\Providers\Log */ final class RemoteSyslogHandler extends Provider implements EventReceiver { use EventsTrait; const MESSAGE_FORMAT = '%s;%s'; /** * @var string */ private $events; /** * @var Logger */ private $logger; /** * @var Language */ private $language; /** * Devuelve los eventos que implementa el observador * * @return array */ public function getEvents() { return LogInterface::EVENTS; } /** * Devuelve los eventos que implementa el observador en formato cadena * * @return string */ public function getEventsString() { return $this->events; } /** * Receive update from subject * * @link http://php.net/manual/en/splobserver.update.php * * @param SplSubject $subject

* The SplSubject notifying the observer of an update. *

* * @return void * @throws \SP\Core\Exceptions\InvalidClassException * @since 5.1.0 */ public function update(SplSubject $subject) { $this->updateEvent('update', new Event($subject)); } /** * Evento de actualización * * @param string $eventType Nombre del evento * @param Event $event Objeto del evento * * @throws \SP\Core\Exceptions\InvalidClassException */ public function updateEvent($eventType, Event $event) { $this->language->setAppLocales(); if (($e = $event->getSource()) instanceof \Exception) { /** @var \Exception $e */ $this->logger->error(sprintf(self::MESSAGE_FORMAT, $eventType, __($e->getMessage()))); } elseif (($eventMessage = $event->getEventMessage()) !== null) { $this->logger->debug(sprintf(self::MESSAGE_FORMAT, $eventType, $eventMessage->composeText(';'))); } $this->language->unsetAppLocales(); } /** * @param Container $dic * * @throws \DI\DependencyException * @throws \DI\NotFoundException */ protected function initialize(Container $dic) { $this->language = $dic->get(Language::class); $configData = $this->config->getConfigData(); $this->logger = $dic->get(Logger::class) ->pushHandler( new SyslogUdpHandler( $configData->getSyslogServer(), $configData->getSyslogPort(), LOG_USER, Logger::DEBUG, true, 'syspass' ) ); $configEvents = $configData->getLogEvents(); if (count($configEvents) === 0) { $this->events = $this->parseEventsToRegex(array_merge(LogInterface::EVENTS, LogInterface::EVENTS_FIXED)); } else { $this->events = $this->parseEventsToRegex(array_merge($configEvents, LogInterface::EVENTS_FIXED)); } } }