Browse Source

Working base template list, link to detail. Working synchronous log.

Frederic G. MARAND 9 years ago
parent
commit
0c56a31ac0

+ 17 - 0
lib/Redis/Logger/Entry.php

@@ -70,4 +70,21 @@ class Entry {
    * @var string[]
    */
   public $variables;
+
+  public function __construct(array $entry) {
+    foreach ($entry as $k => $v) {
+      if (property_exists($this, $k)) {
+        $this->$k = $v;
+      }
+    }
+  }
+
+  /**
+   * @param Settings $settings
+   *
+   * @return string
+   */
+  public function getTemplateKey(Settings $settings) {
+    return $settings->getPrefix() . "{$this->type}:{$this->severity}:{$this->message}";
+  }
 }

+ 11 - 0
lib/Redis/Logger/Reader.php

@@ -115,6 +115,17 @@ class Reader {
     return $ret;
   }
 
+  /**
+   * @return \Redis\Logger\Settings
+   */
+  public function getSettings() {
+    return $this->settings;
+  }
+
+  public static function getTemplateChannel($template) {
+
+  }
+
   /**
    * @param null $channel
    * @param int $severity

+ 7 - 1
lib/Redis/Logger/Settings.php

@@ -16,13 +16,15 @@ class Settings {
   const REDIS_PATTERN = 'drupal:watchdog:*:[01234567]:*';
   const CHANNEL_REGEX = '/drupal:watchdog:([\w]+):[\d]:.*/';
   const SEVERITY_REGEX = '/drupal:watchdog:[\w]+:([\d]):.*/';
+  const SPLITING_REGEX = '/drupal:watchdog:([\w]+):([\d]):(.*)/';
   const SCAN_BATCH_SIZE = 100;
   const ENTRIES_PER_PAGE = 50;
 
   /**
    * @return string[int]
+   *   The translated severity levels keys by WATCHDOG_* value.
    */
-  public static function Levels() {
+  public static function getSeverityLevels() {
     return watchdog_severity_levels();
   }
 
@@ -49,4 +51,8 @@ class Settings {
   public static function getSeverityRegex() {
     return static::SEVERITY_REGEX;
   }
+
+  public static function getSplittingRegex() {
+    return static::SPLITING_REGEX;
+  }
 }

+ 14 - 3
lib/Redis/Logger/Writer.php

@@ -37,20 +37,29 @@ class Writer {
    *   - true: messages are stored during the page cycle and sent on shutdown.
    *   - false: message are sent immediately
    */
-  protected $deferred = FALSE;
+  public $deferred = FALSE;
 
   /**
    * @var \Redis\Logger\Entry[]
    */
   protected $entries = array();
 
+  /**
+   * @var \Redis\Logger\Settings
+   */
+  protected $settings;
+
   /**
    * Constructor.
    *
    * @param \Redis $redis
    */
-  protected function __construct(\Redis $redis) {
+  protected function __construct(\Redis $redis, Settings $settings = NULL) {
     $this->redis = $redis;
+    if (!isset($settings)) {
+      $settings = new Settings();
+    }
+    $this->settings = $settings;
   }
 
   /**
@@ -95,7 +104,9 @@ class Writer {
    * @param \Redis\Logger\Entry $entry
    */
   protected function post(Entry $entry) {
-
+    $list = $this->settings->getPrefix() . "{$entry->type}:{$entry->severity}:{$entry->message}";
+    $item = serialize($entry);
+    $this->redis->lPush($list, $item);
   }
 
   /**

+ 146 - 12
redis_logger.admin.inc

@@ -1,5 +1,5 @@
 <?php
-use Redis\Logger\Writer;
+use Redis\Logger\Reader;
 
 /**
  * @file
@@ -7,19 +7,153 @@ use Redis\Logger\Writer;
  */
 
 function redis_logger_form_overview($form, $form_state) {
-  $logger = Redis\Logger\Writer::instance();
+  $redis = Redis_Client::getClient();
+  $reader = new Reader($redis);
+  $severity_levels = $reader->getSettings()->getSeverityLevels();
 
-  $form['levels'] = array(
-    '#description' => t('The semantics of these levels are defined by RFC5424.'),
-    '#options' => watchdog_severity_levels(),
-    '#title' => t('Severity'),
-    '#type' => 'select',
+  $base_form = $form;
+  $form['redis_logger_filter_form'] = _redis_logger_filter_form($base_form, $reader);
+  $form['redis_logger_clear_log_form'] = _redis_logger_clear_log_form($base_form);
+
+  $header = array(
+    t('Type'),
+    t('Level'),
+    t('Message template'),
+    t('Occurrences'),
   );
-  $form['channels'] = array(
-    '#description' => t('The channels listed here are those which have emitted at least one message.'),
-    '#options' => Writer::instance()->getChannels(),
-    '#title' => t('Severity'),
-    '#type' => 'select',
+
+  $templates = $reader->getTemplates();
+  dsm($templates);
+  $regex = $reader->getSettings()->getSplittingRegex();
+  $rows = array();
+  foreach ($templates as $template) {
+    preg_match($regex, $template, $matches);
+    list(, $channel, $severity, $template) = $matches;
+    $occurrences = l(t('Occurrences'), 'admin/reports/redis/logger/' . $template);
+    $rows[] = array(
+      $channel,
+      $severity_levels[$severity],
+      $template,
+      $occurrences,
+    );
+  }
+
+  $form['redis_logger_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#attributes' => array('id' => 'admin-dblog'),
+    '#empty' => t('No log messages available.'),
   );
+  $build['dblog_pager'] = array('#theme' => 'pager');
+
+
   return $form;
 }
+
+/**
+ * TODO implement. Beware of XSS.
+ *
+ * @param string $template
+ *
+ * @return string
+ */
+function redis_logger_page_event($template) {
+  return check_plain($template);
+}
+
+/**
+ * Form constructor for the form that clears out the log.
+ *
+ * TODO implement.
+ *
+ * @see dblog_clear_log_submit()
+ * @ingroup forms
+ */
+function _redis_logger_clear_log_form($form) {
+  $form['redis_logger_clear'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Clear log messages'),
+    '#description' => t('NOT IMPLEMENTED YET. This will permanently remove the log messages from the Redis store.'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['redis_logger_clear']['clear'] = array(
+    '#type' => 'submit',
+    '#value' => t('Clear log messages'),
+    '#submit' => array('redis_logger_clear_log_submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Helper for the Redis logger filter form builder.
+ *
+ * @param \Redis\Logger\Reader $reader
+ *
+ * @return array
+ */
+function _redis_logger_filters(Reader $reader) {
+  $filters = array();
+
+  $filters['type'] = array(
+    'title' => t('Type'),
+    'options' => $reader->getChannels(),
+  );
+
+  $filters['severity'] = array(
+    'title' => t('Severity'),
+    'options' => $reader->getSettings()->getSeverityLevels(),
+  );
+
+  return $filters;
+}
+
+/**
+ * Build the filter form. Shares session status with DBLog.
+ *
+ * @param array $form
+ * @param \Redis\Logger\Reader $reader
+ *
+ * @return mixed
+ */
+function _redis_logger_filter_form($form, Reader $reader) {
+  $filters = _redis_logger_filters($reader);
+
+  $form['filters'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Filter log messages'),
+    '#collapsible' => TRUE,
+    '#collapsed' => empty($_SESSION['dblog_overview_filter']),
+  );
+  foreach ($filters as $key => $filter) {
+    $form['filters']['status'][$key] = array(
+      '#title' => $filter['title'],
+      '#type' => 'select',
+      '#multiple' => TRUE,
+      '#size' => 8,
+      '#options' => $filter['options'],
+    );
+    if (!empty($_SESSION['dblog_overview_filter'][$key])) {
+      $form['filters']['status'][$key]['#default_value'] = $_SESSION['dblog_overview_filter'][$key];
+    }
+  }
+
+  $form['filters']['actions'] = array(
+    '#type' => 'actions',
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['filters']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Filter'),
+  );
+  if (!empty($_SESSION['dblog_overview_filter'])) {
+    $form['filters']['actions']['reset'] = array(
+      '#type' => 'submit',
+      '#value' => t('Reset')
+    );
+  }
+  return $form;
+
+}

+ 5 - 3
redis_logger.module

@@ -5,6 +5,7 @@
  *
  * Storage model and logic differ from http://drupal.org/project/redis_watchdog
  */
+use Redis\Logger\Entry;
 use Redis\Logger\Writer;
 
 /**
@@ -29,10 +30,10 @@ function redis_logger_menu() {
     'file' => 'redis_logger.admin.inc',
   );
 
-  $items['admin/reports/redis/logger/event/%'] = array(
+  $items['admin/reports/redis/logger/%'] = array(
     'title' => 'Details',
     'page callback' => 'redis_logger_page_event',
-    'page arguments' => array(5),
+    'page arguments' => array(4),
     'access arguments' => array('access site reports'),
     'file' => 'redis_logger.admin.inc',
   );
@@ -44,5 +45,6 @@ function redis_logger_menu() {
  * Implements hook_watchdog().
  */
 function redis_logger_watchdog(array $log_entry) {
-  dsm($log_entry);
+  $writer = Writer::instance();
+  $writer->log(new Entry($log_entry));
 }