Commit bcbfb507 authored by casey's avatar casey Committed by Luca Lusso
Browse files

Issue #3103394 by casey: Drupal loggers should use original message placeholders

parent 0f7eb73c
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -223,6 +223,21 @@ This will send PHP logs to the rotating file handler with json formatter and
with only the `current_user` processor. The same logs are sent to Syslog with
only the `request_uri` processor.

#### Log to database

When using the *drupal.dblog* handler you can use the
`drupal_message_placeholder` processor instead of `message_placeholder` to
maintain the same behavior of the original Drupal logging system:

```
parameters:
  monolog.channel_handlers:
    default:
      handlers:
        - name: 'drupal.dblog'
          processors: ['drupal_message_placeholder', 'current_user', 'request_uri', 'ip', 'referer', 'filter_backtrace', 'introspection']
```

## Examples

* RotatingFileHandler: logs to filesystem
+3 −0
Original line number Diff line number Diff line
@@ -49,6 +49,9 @@ services:
  monolog.processor.message_placeholder:
    class: Drupal\monolog\Logger\Processor\MessagePlaceholderProcessor
    arguments: ['@logger.log_message_parser']
  monolog.processor.drupal_message_placeholder:
    class: Drupal\monolog\Logger\Processor\DrupalMessagePlaceholderProcessor
    arguments: ['@logger.log_message_parser']
  monolog.processor.filter_backtrace:
    class: Drupal\monolog\Logger\Processor\ContextKeyFilterProcessor
    arguments: [['backtrace']]
+2 −2
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ class DrupalHandler extends AbstractProcessingHandler {
  public function write(array $record): void {
    // Set up context with the data Drupal loggers expect.
    // @see Drupal\Core\Logger\LoggerChannel::log()
    $context = $record['context'] + [
    $context = $record['context'] + ($record['drupal_context_placeholders'] ?? []) + [
      'channel' => $record['channel'],
      'link' => '',
      'user' => $record['extra']['user'] ?? NULL,
@@ -69,7 +69,7 @@ class DrupalHandler extends AbstractProcessingHandler {
    ];
    $level = static::$levels[$record['level']];

    $this->logger->log($level, $record['message'], $context);
    $this->logger->log($level, $record['drupal_message'] ?? $record['message'], $context);
  }

}
+36 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\monolog\Logger\Processor;

/**
 * Parse and replace message placeholders for DrupalHandler.
 */
class DrupalMessagePlaceholderProcessor extends MessagePlaceholderProcessor {

  /**
   * {@inheritdoc}
   */
  public function __invoke(array $record): array {
    // Populate the message placeholders and then replace them in the message.
    $message_placeholders = $this
      ->parser
      ->parseMessagePlaceholders(
        $record['message'],
        $record['context']
      );
    $record['drupal_message'] = $record['message'];
    $record['message'] = empty($message_placeholders)
      ? $record['message']
      : strtr($record['message'], $message_placeholders);

    // Remove the replaced placeholders from the context to prevent logging the
    // same information twice.
    foreach ($message_placeholders as $placeholder => $value) {
      $record['drupal_context_placeholders'][$placeholder] = $value;
      unset($record['context'][$placeholder]);
    }

    return $record;
  }

}
+10 −5
Original line number Diff line number Diff line
@@ -32,14 +32,19 @@ class MessagePlaceholderProcessor implements ProcessorInterface {
   */
  public function __invoke(array $record): array {
    // Populate the message placeholders and then replace them in the message.
    $message_placeholders = $this->parser->parseMessagePlaceholders($record['message'],
      $record['context']);
    $record['message'] = empty($message_placeholders) ? $record['message'] : strtr($record['message'],
      $message_placeholders);
    $message_placeholders = $this
      ->parser
      ->parseMessagePlaceholders(
        $record['message'],
        $record['context']
      );
    $record['message'] = empty($message_placeholders)
      ? $record['message']
      : strtr($record['message'], $message_placeholders);

    // Remove the replaced placeholders from the context to prevent logging the
    // same information twice.
    foreach (array_keys($message_placeholders) as $placeholder) {
    foreach ($message_placeholders as $placeholder => $value) {
      unset($record['context'][$placeholder]);
    }