From 64a0b6c543986241327a5a71d998c892c9bcc79f Mon Sep 17 00:00:00 2001 From: ndf Date: Fri, 4 Dec 2015 20:43:28 +0100 Subject: [PATCH 1/3] class \Drupal\rules\Plugin\DataType\LoggerEntry --- src/Plugin/DataType/LoggerEntry.php | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/Plugin/DataType/LoggerEntry.php diff --git a/src/Plugin/DataType/LoggerEntry.php b/src/Plugin/DataType/LoggerEntry.php new file mode 100644 index 00000000..78fe951d --- /dev/null +++ b/src/Plugin/DataType/LoggerEntry.php @@ -0,0 +1,78 @@ +values = $this->createLoggerEntryFromContext($logger_entry_context) + } + + // Plain copy from \Drupal\rules\Logger\RulesLog + protected function createLoggerEntryFromContext($context) { + // 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; + } +} From 9b66e2a67e50525105cdfe1d5810370fd774ab85 Mon Sep 17 00:00:00 2001 From: ndf Date: Mon, 7 Dec 2015 11:53:57 +0100 Subject: [PATCH 2/3] Try out: config info in schema.xml and LoggerEntry --- config/schema/rules.schema.yml | 35 ++++++++++++++++++++++++++ src/Plugin/DataType/LoggerEntry.php | 38 +++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 5 deletions(-) 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/src/Plugin/DataType/LoggerEntry.php b/src/Plugin/DataType/LoggerEntry.php index 78fe951d..8e4d594f 100644 --- a/src/Plugin/DataType/LoggerEntry.php +++ b/src/Plugin/DataType/LoggerEntry.php @@ -7,7 +7,10 @@ namespace Drupal\rules\Plugin\DataType; +use Drupal\Core\TypedData\DataDefinitionInterface; use Drupal\Core\TypedData\Plugin\DataType\Map; +use Drupal\Core\TypedData\TypedData; +use Drupal\Core\TypedData\TypedDataInterface; /** * The logger entry data type. @@ -19,7 +22,7 @@ * @DataType( * id = "loggerentry", * label = @Translation("Logger Entry"), - * definition_class = "\Drupal\Core\TypedData\MapDataDefinition" + * definition_class = "\Drupal\Rules\TypedData\LoggerEntryDataDefinition" * ) */ class LoggerEntry extends Map { @@ -45,14 +48,39 @@ class LoggerEntry extends Map { */ protected $properties = array(); - public function __construct(DataDefinitionInterface $definition, $name, TypedDataInterface $parent, $logger_entry_context) { - parent::__construct($definition, $name, $parent); + /** + * {@inheritdoc} + * + * @todo: create a TypedData logger-entry object: https://www.drupal.org/node/2625238 + */ + public function log($level, $message, array $context = array()) { + // 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); - $this->values = $this->createLoggerEntryFromContext($logger_entry_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($context) { + protected function createLoggerEntryFromContext($log) { + list($level, $message, $context) = $log; + // Remove any backtraces since they may contain an unserializable variable. unset($context['backtrace']); From f11415217d83bdc31f923d65d70f1d1ca955d875 Mon Sep 17 00:00:00 2001 From: ndf Date: Tue, 8 Dec 2015 11:35:48 +0100 Subject: [PATCH 3/3] maybe should just create an entity for logger_entries --- rules.rules.events.yml | 2 +- src/Logger/RulesLog.php | 5 + src/Plugin/DataType/LoggerEntry.php | 99 +++++++++---------- src/Plugin/DataType/MapDataDefinition.php | 20 ++++ src/TypedData/LoggerEntryDataDefinition.php | 53 ++++++++++ .../Event/SystemLoggerEventTest.php | 2 +- 6 files changed, 126 insertions(+), 55 deletions(-) create mode 100644 src/Plugin/DataType/MapDataDefinition.php create mode 100644 src/TypedData/LoggerEntryDataDefinition.php 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 index 8e4d594f..cffa159d 100644 --- a/src/Plugin/DataType/LoggerEntry.php +++ b/src/Plugin/DataType/LoggerEntry.php @@ -7,53 +7,46 @@ namespace Drupal\rules\Plugin\DataType; -use Drupal\Core\TypedData\DataDefinitionInterface; +use Drupal\Core\Logger\LogMessageParserInterface; use Drupal\Core\TypedData\Plugin\DataType\Map; use Drupal\Core\TypedData\TypedData; -use Drupal\Core\TypedData\TypedDataInterface; +use Drupal\Component\Utility\Random; +use Drupal\Core\Field\FieldDefinitionInterface; +use Drupal\Core\Field\FieldItemBase; +use Drupal\Core\Field\FieldStorageDefinitionInterface; +use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\TypedData\DataDefinition; +use Drupal\Core\TypedData\MapDataDefinition; +use Drupal\Core\Url; +use Drupal\link\LinkItemInterface; /** * The logger entry data type. * - * @see: https://www.drupal.org/node/2625238 - * - * @ingroup typed_data + * Represents a log entry that is created from system log messages. * * @DataType( - * id = "loggerentry", - * label = @Translation("Logger Entry"), - * definition_class = "\Drupal\Rules\TypedData\LoggerEntryDataDefinition" + * id = "logger_entry", + * label = @Translation("Logger entry"), + * definition_class = "\Drupal\rules\TypedData\LoggerEntryDataDefinition" * ) */ class LoggerEntry extends Map { - /** - * The data definition. + * The message's placeholders parser. * - * @var \Drupal\Core\TypedData\ComplexDataDefinitionInterface + * @var \Drupal\Core\Logger\LogMessageParserInterface */ - protected $definition; - - /** - * An array of values for the contained properties. - * - * @var array - */ - protected $values = array(); - - /** - * The array of properties. - * - * @var \Drupal\Core\TypedData\TypedDataInterface[] - */ - protected $properties = array(); + protected $parser; /** * {@inheritdoc} * * @todo: create a TypedData logger-entry object: https://www.drupal.org/node/2625238 */ - public function log($level, $message, array $context = array()) { + public function log($level, $message, array $context = array(), LogMessageParserInterface $parser) { + $this->parser = $parser; + // Remove any backtraces since they may contain an unserializable variable. unset($context['backtrace']); @@ -77,30 +70,30 @@ public function log($level, $message, array $context = array()) { $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; - } +// // 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()); } }