diff --git a/config/schema/rules.schema.yml b/config/schema/rules.schema.yml index 303af887..fa9a4239 100644 --- a/config/schema/rules.schema.yml +++ b/config/schema/rules.schema.yml @@ -205,3 +205,38 @@ rules.settings: log_level: type: integer label: 'Log level' + +rules.data_type.logger_entry.definition: + type: mapping + label: 'Logger Entry' + mapping: + uid: + type: user + label: 'User' + channel: + type: string + label: 'Channel' + message: + type: string + label: 'Message' + variables: + type: string + label: 'Message placeholders' + severity: + type: string + label: 'Level' + link: + type: link + label: 'Link' + location: + type: url + label: 'Request URI' + referer: + type: string + label: 'Referer' + hostname: + type: string + label: 'IP' + timestamp: + type: data + label: 'Timestamp' diff --git a/rules.rules.events.yml b/rules.rules.events.yml index d8b8c973..b273573d 100644 --- a/rules.rules.events.yml +++ b/rules.rules.events.yml @@ -42,5 +42,5 @@ rules_system_logger_event: context: # @todo: create a TypedData logger-entry object: https://www.drupal.org/node/2625238 logger_entry: - type: 'any' + type: 'logger_entry' label: 'Logger entry' diff --git a/src/Logger/RulesLog.php b/src/Logger/RulesLog.php index 06b824b1..fa347542 100644 --- a/src/Logger/RulesLog.php +++ b/src/Logger/RulesLog.php @@ -10,6 +10,7 @@ use Drupal\Core\Logger\LogMessageParserInterface; use Drupal\Core\Logger\RfcLoggerTrait; use Drupal\rules\Event\SystemLoggerEvent; +use Drupal\rules\Plugin\DataType\LoggerEntry; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -72,6 +73,10 @@ public function log($level, $message, array $context = array()) { 'timestamp' => $context['timestamp'], ); + $logger_entry = new LoggerEntry(); + $logger_entry->log($level, $message, $context, $this->parser); + + // Dispatch logger_entry event. $event = new SystemLoggerEvent($logger_entry, ['logger_entry' => $logger_entry]); $this->dispatcher->dispatch(SystemLoggerEvent::EVENT_NAME, $event); diff --git a/src/Plugin/DataType/LoggerEntry.php b/src/Plugin/DataType/LoggerEntry.php new file mode 100644 index 00000000..cffa159d --- /dev/null +++ b/src/Plugin/DataType/LoggerEntry.php @@ -0,0 +1,99 @@ +parser = $parser; + + // Remove any backtraces since they may contain an unserializable variable. + unset($context['backtrace']); + + // Convert PSR3-style messages to SafeMarkup::format() style, so they can be + // translated too in runtime. + $message_placeholders = $this->parser->parseMessagePlaceholders($message, $context); + + $logger_entry = array( + 'uid' => $context['uid'], + 'type' => $context['channel'], + 'message' => $message, + 'variables' => $message_placeholders, + 'severity' => $level, + 'link' => $context['link'], + 'location' => $context['request_uri'], + 'referer' => $context['referer'], + 'hostname' => $context['ip'], + 'timestamp' => $context['timestamp'], + ); + + $this->setValue($logger_entry); + } + +// // Plain copy from \Drupal\rules\Logger\RulesLog +// protected function createLoggerEntryFromContext($log) { +// list($level, $message, $context) = $log; +// +// // Remove any backtraces since they may contain an unserializable variable. +// unset($context['backtrace']); +// +// // Convert PSR3-style messages to SafeMarkup::format() style, so they can be +// // translated too in runtime. +// $message_placeholders = $this->parser->parseMessagePlaceholders($message, $context); +// +// $logger_entry = array( +// 'uid' => $context['uid'], +// 'type' => $context['channel'], +// 'message' => $message, +// 'variables' => $message_placeholders, +// 'severity' => $level, +// 'link' => $context['link'], +// 'location' => $context['request_uri'], +// 'referer' => $context['referer'], +// 'hostname' => $context['ip'], +// 'timestamp' => $context['timestamp'], +// ); +// +// return $logger_entry; +// } +} diff --git a/src/Plugin/DataType/MapDataDefinition.php b/src/Plugin/DataType/MapDataDefinition.php new file mode 100644 index 00000000..4fbca94b --- /dev/null +++ b/src/Plugin/DataType/MapDataDefinition.php @@ -0,0 +1,20 @@ + 'integer', + 'label' => t('Integer value'), + 'class' => '\Drupal\comment\CommentNewValue', + 'computed' => TRUE, + ); + } + return static::$propertyDefinitions; + } + +} diff --git a/tests/src/Integration/Event/SystemLoggerEventTest.php b/tests/src/Integration/Event/SystemLoggerEventTest.php index fbd77000..8f188c9b 100644 --- a/tests/src/Integration/Event/SystemLoggerEventTest.php +++ b/tests/src/Integration/Event/SystemLoggerEventTest.php @@ -22,7 +22,7 @@ public function testSystemLoggerEvent() { $logger_entry = $event->getContextDefinition('logger_entry'); // @todo: create a TypedData logger-entry object: https://www.drupal.org/node/2625238 - $this->assertSame('any', $logger_entry->getDataType()); + $this->assertSame('logger_entry', $logger_entry->getDataType()); } }