diff --git a/config/install/past.settings.yml b/config/install/past.settings.yml
index 73396e9..bfae26c 100644
--- a/config/install/past.settings.yml
+++ b/config/install/past.settings.yml
@@ -5,6 +5,7 @@ log_cache_tags: false
 shutdown_handling: true
 log_session_id: true
 max_recursion: 10
+log_requests: false
 backtrace_include:
   # @todo Convert to string sequence:
   # - PAST_SEVERITY_ERROR
diff --git a/config/schema/past.schema.yml b/config/schema/past.schema.yml
index 7f35fba..956d681 100644
--- a/config/schema/past.schema.yml
+++ b/config/schema/past.schema.yml
@@ -30,3 +30,6 @@ past.settings:
       label: 'Include watchdog severity levels from writing backtraces'
       sequence:
         type: string
+    log_requests:
+      type: boolean
+      label: 'Log page requests'
\ No newline at end of file
diff --git a/past.services.yml b/past.services.yml
index 3be461d..a3599f4 100644
--- a/past.services.yml
+++ b/past.services.yml
@@ -1,4 +1,8 @@
 services:
+  past.request_subscriber:
+    class: Drupal\past\EventSubscriber\RequestSubscriber
+    tags:
+      - name: event_subscriber
   past_event_subscriber:
     class: Drupal\past\EventSubscriber\PastSubscriber
     tags:
diff --git a/src/EventSubscriber/RequestSubscriber.php b/src/EventSubscriber/RequestSubscriber.php
new file mode 100644
index 0000000..ca6969b
--- /dev/null
+++ b/src/EventSubscriber/RequestSubscriber.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\past\EventSubscriber\RequestSubscriber.
+ */
+
+namespace Drupal\past\EventSubscriber;
+
+use Drupal\Component\Utility\SafeMarkup;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\KernelEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Listens to requests to log them.
+ */
+class RequestSubscriber implements EventSubscriberInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events = [];
+    $events[KernelEvents::REQUEST][] = 'onRequest';
+    return $events;
+  }
+
+  /**
+   * Invoked upon a request event, this logs the request.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\KernelEvent $event
+   *   The request event.
+   */
+  public function onRequest(KernelEvent $event) {
+    // Abort if the setting is not enabled.
+    if (!\Drupal::config('past.settings')->get('log_requests')) {
+      return;
+    }
+
+    $request = $event->getRequest();
+
+    $message_args = [
+      '@method' => $request->getMethod(),
+      '@path' => $request->getPathInfo(),
+      '@content' => $request->getContent(),
+    ];
+    // Only include ": @content" if there is any content.
+    $message = $request->getContent() ? SafeMarkup::format('@method @path: @content', $message_args) : SafeMarkup::format('@method @path', $message_args);
+
+    $past_event = past_event_create('past', 'request', $message);
+    $past_event->addArgument('headers', $request->headers->all());
+    $past_event->addArgument('content', $request->getContent());
+    $past_event->save();
+  }
+
+}
\ No newline at end of file
diff --git a/src/Form/PastSettingsForm.php b/src/Form/PastSettingsForm.php
index e0f7c07..00b7090 100644
--- a/src/Form/PastSettingsForm.php
+++ b/src/Form/PastSettingsForm.php
@@ -96,6 +96,13 @@ class PastSettingsForm extends ConfigFormBase {
       '#description' => t('When enabled, Past will log cache tag invalidations including a backtrace. This should only be used to debug invalidations and can be slow when a lot of cache tag invalidations happen.'),
     );
 
+    $form['log_requests'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Log page requests'),
+      '#default_value' => $config->get('log_requests'),
+      '#description' => $this->t('When enabled, Past will dump headers and content of all incoming HTTP requests. <strong>Note:</strong> This can generate abundant data, and is probably only useful for debugging in a development environment.'),
+    ];
+
     return parent::buildForm($form, $form_state);
   }
 
@@ -124,6 +131,7 @@ class PastSettingsForm extends ConfigFormBase {
       ->set('backtrace_include', $included_severity_levels)
       ->set('shutdown_handling', $form_state->getValue('shutdown_handling'))
       ->set('log_session_id', $form_state->getValue('log_session_id'))
+      ->set('log_requests', $form_state->getValue('log_requests'))
       ->save();
 
     parent::submitForm($form, $form_state);
