diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index dfb61e1..fa517db 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -12,6 +12,7 @@
 use Drupal\Core\Language\Language;
 use Drupal\Core\Lock\DatabaseLockBackend;
 use Drupal\Core\Lock\LockBackendInterface;
+use Monolog\Logger;
 
 /**
  * @file
@@ -1733,7 +1734,6 @@ function watchdog($type, $message, array $variables = array(), $severity = WATCH
     // Prepare the fields to be logged
     $log_entry = array(
       'type'        => $type,
-      'message'     => $message,
       'variables'   => $variables,
       'severity'    => $severity,
       'link'        => $link,
@@ -1746,11 +1746,38 @@ function watchdog($type, $message, array $variables = array(), $severity = WATCH
       'timestamp'   => time(),
     );
 
-    // Call the logging hooks to log/process the message
-    foreach (module_implements('watchdog') as $module) {
-      module_invoke($module, 'watchdog', $log_entry);
+    // Translate the watchdog constant value to a Monolog value.
+    // @todo Switch the WATCHDOG constants to the straight Logger constants?
+    switch ($severity) {
+      case WATCHDOG_EMERGENCY:
+        $severity = Logger::EMERGENCY;
+        break;
+      case WATCHDOG_ALERT:
+        $severity = Logger::ALERT;
+        break;
+      case WATCHDOG_CRITICAL:
+        $severity = Logger::CRITICAL;
+        break;
+      case WATCHDOG_ERROR:
+        $severity = Logger::ERROR;
+        break;
+      case WATCHDOG_WARNING:
+        $severity = Logger::WARNING;
+        break;
+      case WATCHDOG_NOTICE:
+        $severity = Logger::NOTICE;
+        break;
+      case WATCHDOG_INFO:
+        $severity = Logger::INFO;
+        break;
+      case WATCHDOG_DEBUG:
+        $severity = Logger::DEBUG;
+        break;
     }
 
+    // Add the record to the logger.
+    drupal_container()->get('logger')->addRecord($severity, $message, $log_entry);
+
     // It is critical that the semaphore is only cleared here, in the parent
     // watchdog() call (not outside the loop), to prevent recursive execution.
     $in_error_state = FALSE;
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 879586d..7320396 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -70,6 +70,10 @@ public function build(ContainerBuilder $container) {
       ->addArgument(new Reference('router.dumper'))
       ->addArgument(new Reference('lock'));
 
+    // Register services needed for the watchdog logging system.
+    $container->register('logger', 'Symfony\Bridge\Monolog\Logger')
+      ->addArgument('Drupal');
+
     $container->register('matcher', 'Drupal\Core\Routing\ChainMatcher');
     $container->register('legacy_url_matcher', 'Drupal\Core\LegacyUrlMatcher')
       ->addTag('chained_matcher');
diff --git a/core/modules/action/lib/Drupal/action/Tests/LoopTest.php b/core/modules/action/lib/Drupal/action/Tests/LoopTest.php
deleted file mode 100644
index 87fa08e..0000000
--- a/core/modules/action/lib/Drupal/action/Tests/LoopTest.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\action\Tests\LoopTest.
- */
-
-namespace Drupal\action\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests aborting of actions executing in a potential loop.
- */
-class LoopTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('dblog', 'action_loop_test');
-
-  protected $aid;
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Actions executing in a potentially infinite loop',
-      'description' => 'Tests actions executing in a loop, and makes sure they abort properly.',
-      'group' => 'Action',
-    );
-  }
-
-  /**
-   * Sets up a loop with 3 - 12 recursions, and sees if it aborts properly.
-   */
-  function testActionLoop() {
-    $user = $this->drupalCreateUser(array('administer actions'));
-    $this->drupalLogin($user);
-
-    $info = action_loop_test_action_info();
-    $this->aid = action_save('action_loop_test_log', $info['action_loop_test_log']['type'], array(), $info['action_loop_test_log']['label']);
-
-    // Delete any existing watchdog messages to clear the plethora of
-    // "Action added" messages from when Drupal was installed.
-    db_delete('watchdog')->execute();
-    // To prevent this test from failing when xdebug is enabled, the maximum
-    // recursion level should be kept low enough to prevent the xdebug
-    // infinite recursion protection mechanism from aborting the request.
-    // See http://drupal.org/node/587634.
-    config('action.settings')
-      ->set('recursion_limit', 7)
-      ->save();
-    $this->triggerActions();
-  }
-
-  /**
-   * Loops watchdog messages up to actions_max_stack times.
-   *
-   * Creates an infinite loop by causing a watchdog message to be set,
-   * which causes the actions to be triggered again, up to action_max_stack
-   * times.
-   */
-  protected function triggerActions() {
-    $this->drupalGet('<front>', array('query' => array('trigger_action_on_watchdog' => $this->aid)));
-    $expected = array();
-    $expected[] = 'Triggering action loop';
-    $recursion_limit = config('action.settings')->get('recursion_limit');
-    for ($i = 1; $i <= $recursion_limit; $i++) {
-      $expected[] = "Test log #$i";
-    }
-    $expected[] = 'Stack overflow: recursion limit for actions_do() has been reached. Stack is limited by %limit calls.';
-
-    $result = db_query("SELECT message FROM {watchdog} WHERE type = 'action_loop_test' OR type = 'action' ORDER BY wid");
-    $loop_started = FALSE;
-    foreach ($result as $row) {
-      $expected_message = array_shift($expected);
-      $this->assertEqual($row->message, $expected_message, format_string('Expected message %expected, got %message.', array('%expected' => $expected_message, '%message' => $row->message)));
-    }
-    $this->assertTrue(empty($expected), 'All expected messages found.');
-  }
-}
diff --git a/core/modules/action/tests/action_loop_test/action_loop_test.info b/core/modules/action/tests/action_loop_test/action_loop_test.info
deleted file mode 100644
index 82a2810..0000000
--- a/core/modules/action/tests/action_loop_test/action_loop_test.info
+++ /dev/null
@@ -1,7 +0,0 @@
-name = Action loop test
-description = Support module for action loop testing.
-package = Testing
-version = VERSION
-core = 8.x
-hidden = TRUE
-dependencies[] = action
diff --git a/core/modules/action/tests/action_loop_test/action_loop_test.install b/core/modules/action/tests/action_loop_test/action_loop_test.install
deleted file mode 100644
index 7085aed..0000000
--- a/core/modules/action/tests/action_loop_test/action_loop_test.install
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-/**
- * Implements hook_install().
- */
-function action_loop_test_install() {
-  module_set_weight('action_loop_test', 1);
-}
diff --git a/core/modules/action/tests/action_loop_test/action_loop_test.module b/core/modules/action/tests/action_loop_test/action_loop_test.module
deleted file mode 100644
index 8c3b98d..0000000
--- a/core/modules/action/tests/action_loop_test/action_loop_test.module
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/**
- * Implements hook_watchdog().
- */
-function action_loop_test_watchdog(array $log_entry) {
-  // If the triggering actions are not explicitly enabled, abort.
-  if (empty($_GET['trigger_action_on_watchdog'])) {
-    return;
-  }
-  // We can pass in any applicable information in $context. There isn't much in
-  // this case, but we'll pass in the hook name as the bare minimum.
-  $context = array(
-    'hook' => 'watchdog',
-  );
-  // Fire the actions on the associated object ($log_entry) and the context
-  // variable.
-  $aids = (array) $_GET['trigger_action_on_watchdog'];
-  actions_do($aids, $log_entry, $context);
-}
-
-/**
- * Implements hook_init().
- */
-function action_loop_test_init() {
-  if (!empty($_GET['trigger_action_on_watchdog'])) {
-    watchdog_skip_semaphore('action_loop_test', 'Triggering action loop');
-  }
-}
-
-/**
- * Implements hook_action_info().
- */
-function action_loop_test_action_info() {
-  return array(
-    'action_loop_test_log' => array(
-      'label' => t('Write a message to the log.'),
-      'type' => 'system',
-      'configurable' => FALSE,
-      'triggers' => array('any'),
-    ),
-  );
-}
-
-/**
- * Write a message to the log.
- */
-function action_loop_test_log() {
-  $count = &drupal_static(__FUNCTION__, 0);
-  $count++;
-  watchdog_skip_semaphore('action_loop_test', "Test log #$count");
-}
-
-/**
- * Replacement of the watchdog() function that eliminates the use of semaphores
- * so that we can test the abortion of an action loop.
- */
-function watchdog_skip_semaphore($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
-  global $user, $base_root;
-
-  // Prepare the fields to be logged
-  $log_entry = array(
-    'type'        => $type,
-    'message'     => $message,
-    'variables'   => $variables,
-    'severity'    => $severity,
-    'link'        => $link,
-    'user'        => $user,
-    'uid'         => isset($user->uid) ? $user->uid : 0,
-    'request_uri' => $base_root . request_uri(),
-    'referer'     => $_SERVER['HTTP_REFERER'],
-    'ip'          => ip_address(),
-    'timestamp'   => REQUEST_TIME,
-  );
-
-  // Call the logging hooks to log/process the message
-  foreach (module_implements('watchdog') as $module) {
-    module_invoke($module, 'watchdog', $log_entry);
-  }
-}
diff --git a/core/modules/dblog/dblog.module b/core/modules/dblog/dblog.module
index 89efb57..95024a1 100644
--- a/core/modules/dblog/dblog.module
+++ b/core/modules/dblog/dblog.module
@@ -141,28 +141,6 @@ function _dblog_get_message_types() {
 }
 
 /**
- * Implements hook_watchdog().
- *
- * Note: Some values may be truncated to meet database column size restrictions.
- */
-function dblog_watchdog(array $log_entry) {
-  Database::getConnection('default', 'default')->insert('watchdog')
-    ->fields(array(
-      'uid' => $log_entry['uid'],
-      'type' => substr($log_entry['type'], 0, 64),
-      'message' => $log_entry['message'],
-      'variables' => serialize($log_entry['variables']),
-      'severity' => $log_entry['severity'],
-      'link' => substr($log_entry['link'], 0, 255),
-      'location' => $log_entry['request_uri'],
-      'referer' => $log_entry['referer'],
-      'hostname' => substr($log_entry['ip'], 0, 128),
-      'timestamp' => $log_entry['timestamp'],
-    ))
-    ->execute();
-}
-
-/**
  * Implements hook_form_FORM_ID_alter() for system_logging_settings().
  */
 function dblog_form_system_logging_settings_alter(&$form, $form_state) {
diff --git a/core/modules/dblog/lib/Drupal/dblog/DblogBundle.php b/core/modules/dblog/lib/Drupal/dblog/DblogBundle.php
new file mode 100755
index 0000000..e54b148
--- /dev/null
+++ b/core/modules/dblog/lib/Drupal/dblog/DblogBundle.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\dblog\DblogBundle.
+ */
+
+namespace Drupal\dblog;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * Database Logging dependency injection container.
+ */
+class DblogBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the database logging handler.
+    $container->register('logger.dbloghandler', 'Drupal\dblog\DblogHandler');
+
+    // Add the handler to the logging system.
+    $reference = new Reference('logger.dbloghandler');
+    $container->getDefinition('logger')
+      ->addMethodCall('pushHandler', array($reference));
+  }
+
+}
diff --git a/core/modules/dblog/lib/Drupal/dblog/DblogHandler.php b/core/modules/dblog/lib/Drupal/dblog/DblogHandler.php
new file mode 100755
index 0000000..cd7c9c7
--- /dev/null
+++ b/core/modules/dblog/lib/Drupal/dblog/DblogHandler.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\dblog\DatabaseLoggingBundle.
+ */
+
+namespace Drupal\dblog;
+
+use Monolog\Logger;
+use Monolog\Handler\AbstractProcessingHandler;
+
+/**
+ * Logs and records system events to the database.
+ *
+ * Note: Some values may be truncated to meet database column size restrictions.
+ */
+class DblogHandler extends AbstractProcessingHandler {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function write(array $record) {
+    Database::getConnection('default', 'default')->insert('watchdog')
+      ->fields(array(
+        'uid' => $record['context']['uid'],
+        'type' => substr($record['context']['type'], 0, 64),
+        'message' => $record['message'],
+        'variables' => serialize($record['context']['variables']),
+        'severity' => $record['context']['severity'],
+        'link' => substr($record['context']['link'], 0, 255),
+        'location' => $record['context']['request_uri'],
+        'referer' => $record['context']['referer'],
+        'hostname' => substr($record['context']['ip'], 0, 128),
+        'timestamp' => $record['context']['timestamp'],
+      ))
+      ->execute();
+  }
+}
diff --git a/core/modules/syslog/config/syslog.settings.yml b/core/modules/syslog/config/syslog.settings.yml
index 1aa5b90..7f17a98 100644
--- a/core/modules/syslog/config/syslog.settings.yml
+++ b/core/modules/syslog/config/syslog.settings.yml
@@ -1,3 +1,2 @@
 identity: drupal
-facility: ''
-format: '!base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message'
+facility: 8  # Facility defaults to the value of LOG_USER.
diff --git a/core/modules/syslog/lib/Drupal/syslog/SyslogBundle.php b/core/modules/syslog/lib/Drupal/syslog/SyslogBundle.php
new file mode 100755
index 0000000..f29bb24
--- /dev/null
+++ b/core/modules/syslog/lib/Drupal/syslog/SyslogBundle.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\syslog\SyslogBundle.
+ */
+
+namespace Drupal\syslog;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * Database Logging dependency injection container.
+ */
+class DatabaseLoggingBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the database logging handler.
+    // @todo Retrieve values dynamically from config so that the services can be
+    // compiled correctly.
+    $config = config('syslog.settings');
+    $ident = $config->get('identity');
+    $facility = $config->get('facility');
+    $container->register('logger.sysloghandler', 'Monolog/Handler/SyslogHandler')
+      ->addArgument($ident)
+      ->addArgument('facility');
+
+    // Add the handler to the logging system.
+    $reference = new Reference('logger.sysloghandler');
+    $container->getDefinition('logger')
+      ->addMethodCall('pushHandler', array($reference));
+  }
+
+}
diff --git a/core/modules/syslog/syslog.install b/core/modules/syslog/syslog.install
index 5b2c41a..8c8b03e 100644
--- a/core/modules/syslog/syslog.install
+++ b/core/modules/syslog/syslog.install
@@ -26,7 +26,6 @@ function syslog_update_8000() {
   update_variables_to_config('syslog.settings', array(
     'syslog_identity' => 'identity',
     'syslog_facility' => 'facility',
-    'syslog_format' => 'format',
   ));
 }
 
diff --git a/core/modules/syslog/syslog.module b/core/modules/syslog/syslog.module
index 8af77c1..cc78a32 100644
--- a/core/modules/syslog/syslog.module
+++ b/core/modules/syslog/syslog.module
@@ -5,22 +5,6 @@
  * Redirects logging messages to syslog.
  */
 
-if (defined('LOG_LOCAL0')) {
-  /**
-   * Sets the proper logging facility.
-   *
-   * Note that LOG_LOCAL0 through LOG_LOCAL7 are not available on Windows, so we
-   * check for availability. If LOG_LOCAL0 is defined by the PHP environment, we
-   * set that as the default; if not, we use LOG_USER.
-   *
-   * @see http://php.net/manual/function.syslog.php
-   */
-  define('DEFAULT_SYSLOG_FACILITY', LOG_LOCAL0);
-}
-else {
-  define('DEFAULT_SYSLOG_FACILITY', LOG_USER);
-}
-
 /**
  * Implements hook_help().
  */
@@ -62,12 +46,6 @@ function syslog_form_system_logging_settings_alter(&$form, &$form_state) {
       '#description'   => t('Depending on the system configuration, Syslog and other logging tools use this code to identify or filter messages from within the entire system log.') . $help,
      );
   }
-  $form['syslog_format'] = array(
-    '#type'          => 'textarea',
-    '#title'         => t('Syslog format'),
-    '#default_value' => $config->get('format'),
-    '#description'   => t('Specify the format of the syslog entry. Available variables are: <dl><dt><code>!base_url</code></dt><dd>Base URL of the site.</dd><dt><code>!timestamp</code></dt><dd>Unix timestamp of the log entry.</dd><dt><code>!type</code></dt><dd>The category to which this message belongs.</dd><dt><code>!ip</code></dt><dd>IP address of the user triggering the message.</dd><dt><code>!request_uri</code></dt><dd>The requested URI.</dd><dt><code>!referer</code></dt><dd>HTTP Referer if available.</dd><dt><code>!uid</code></dt><dd>User ID.</dd><dt><code>!link</code></dt><dd>A link to associate with the message.</dd><dt><code>!message</code></dt><dd>The message to store in the log.</dd></dl>'),
-  );
 
   $form['#submit'][] = 'syslog_logging_settings_submit';
 }
@@ -81,58 +59,5 @@ function syslog_logging_settings_submit($form, &$form_state) {
   config('syslog.settings')
     ->set('identity', $form_state['values']['syslog_identity'])
     ->set('facility', $form_state['values']['syslog_facility'])
-    ->set('format', $form_state['values']['syslog_format'])
     ->save();
 }
-
-/**
- * Lists all possible syslog facilities for UNIX/Linux.
- *
- * @return array
- *   An array of syslog facilities for UNIX/Linux.
- */
-function syslog_facility_list() {
-  return array(
-    LOG_LOCAL0 => 'LOG_LOCAL0',
-    LOG_LOCAL1 => 'LOG_LOCAL1',
-    LOG_LOCAL2 => 'LOG_LOCAL2',
-    LOG_LOCAL3 => 'LOG_LOCAL3',
-    LOG_LOCAL4 => 'LOG_LOCAL4',
-    LOG_LOCAL5 => 'LOG_LOCAL5',
-    LOG_LOCAL6 => 'LOG_LOCAL6',
-    LOG_LOCAL7 => 'LOG_LOCAL7',
-  );
-}
-
-/**
- * Implements hook_watchdog().
- */
-function syslog_watchdog(array $log_entry) {
-  global $base_url;
-
-  $log_init = &drupal_static(__FUNCTION__, FALSE);
-  $config = config('syslog.settings');
-
-  if (!$log_init) {
-    $log_init = TRUE;
-    $facility = $config->get('facility');
-    if ($facility === '') {
-      $facility = defined('LOG_LOCAL0') ? LOG_LOCAL0 : LOG_USER;
-    }
-    openlog($config->get('identity'), LOG_NDELAY, $facility);
-  }
-
-  $message = strtr($config->get('format'), array(
-    '!base_url'    => $base_url,
-    '!timestamp'   => $log_entry['timestamp'],
-    '!type'        => $log_entry['type'],
-    '!ip'          => $log_entry['ip'],
-    '!request_uri' => $log_entry['request_uri'],
-    '!referer'     => $log_entry['referer'],
-    '!uid'         => $log_entry['uid'],
-    '!link'        => strip_tags($log_entry['link']),
-    '!message'     => strip_tags(!isset($log_entry['variables']) ? $log_entry['message'] : strtr($log_entry['message'], $log_entry['variables'])),
-  ));
-
-  syslog($log_entry['severity'], $message);
-}
