Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / syslog / src / Logger / SysLog.php
1 <?php
2
3 namespace Drupal\syslog\Logger;
4
5 use Drupal\Core\Config\ConfigFactoryInterface;
6 use Drupal\Core\Logger\LogMessageParserInterface;
7 use Drupal\Core\Logger\RfcLoggerTrait;
8 use Psr\Log\LoggerInterface;
9
10 /**
11  * Redirects logging messages to syslog.
12  */
13 class SysLog implements LoggerInterface {
14   use RfcLoggerTrait;
15
16   /**
17    * A configuration object containing syslog settings.
18    *
19    * @var \Drupal\Core\Config\Config
20    */
21   protected $config;
22
23   /**
24    * The message's placeholders parser.
25    *
26    * @var \Drupal\Core\Logger\LogMessageParserInterface
27    */
28   protected $parser;
29
30   /**
31    * Stores whether there is a system logger connection opened or not.
32    *
33    * @var bool
34    */
35   protected $connectionOpened = FALSE;
36
37   /**
38    * Constructs a SysLog object.
39    *
40    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
41    *   The configuration factory object.
42    * @param \Drupal\Core\Logger\LogMessageParserInterface $parser
43    *   The parser to use when extracting message variables.
44    */
45   public function __construct(ConfigFactoryInterface $config_factory, LogMessageParserInterface $parser) {
46     $this->config = $config_factory->get('syslog.settings');
47     $this->parser = $parser;
48   }
49
50   /**
51    * Opens a connection to the system logger.
52    */
53   protected function openConnection() {
54     if (!$this->connectionOpened) {
55       $facility = $this->config->get('facility');
56       $this->connectionOpened = openlog($this->config->get('identity'), LOG_NDELAY, $facility);
57     }
58   }
59
60   /**
61    * {@inheritdoc}
62    */
63   public function log($level, $message, array $context = []) {
64     global $base_url;
65
66     // Ensure we have a connection available.
67     $this->openConnection();
68
69     // Populate the message placeholders and then replace them in the message.
70     $message_placeholders = $this->parser->parseMessagePlaceholders($message, $context);
71     $message = empty($message_placeholders) ? $message : strtr($message, $message_placeholders);
72
73     $entry = strtr($this->config->get('format'), [
74       '!base_url' => $base_url,
75       '!timestamp' => $context['timestamp'],
76       '!type' => $context['channel'],
77       '!ip' => $context['ip'],
78       '!request_uri' => $context['request_uri'],
79       '!referer' => $context['referer'],
80       '!uid' => $context['uid'],
81       '!link' => strip_tags($context['link']),
82       '!message' => strip_tags($message),
83     ]);
84
85     $this->syslogWrapper($level, $entry);
86   }
87
88   /**
89    * A syslog wrapper to make syslog functionality testable.
90    *
91    * @param int $level
92    *   The syslog priority.
93    * @param string $entry
94    *   The message to send to syslog function.
95    */
96   protected function syslogWrapper($level, $entry) {
97     syslog($level, $entry);
98   }
99
100 }