diff --git a/core/authorize.php b/core/authorize.php
index f938f39..2b02d78 100644
--- a/core/authorize.php
+++ b/core/authorize.php
@@ -147,7 +147,7 @@ function authorize_access_allowed() {
 }
 else {
   drupal_add_http_header('Status', '403 Forbidden');
-  watchdog('access denied', 'authorize.php', array(), WATCHDOG_WARNING);
+  \Drupal::logger('access denied')->warning('authorize.php');
   $page_title = t('Access denied');
   $output = t('You are not allowed to access this page.');
 }
diff --git a/core/core.services.yml b/core/core.services.yml
index 66b3d9b..b7c61cd 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -113,7 +113,7 @@ services:
     arguments: ['@config.storage', '@config.storage.schema', '@cache.discovery']
   cron:
     class: Drupal\Core\Cron
-    arguments: ['@module_handler', '@lock', '@queue', '@state', '@current_user', '@session_manager']
+    arguments: ['@module_handler', '@lock', '@queue', '@state', '@current_user', '@session_manager', '@logger.channel.cron']
   database:
     class: Drupal\Core\Database\Connection
     factory_class: Drupal\Core\Database\Database
@@ -124,7 +124,7 @@ services:
     arguments: ['@form_validator', '@form_submitter', '@module_handler', '@keyvalue.expirable', '@event_dispatcher', '@request_stack', '@?csrf_token', '@?http_kernel']
   form_validator:
     class: Drupal\Core\Form\FormValidator
-    arguments: ['@request_stack', '@string_translation', '@csrf_token']
+    arguments: ['@request_stack', '@string_translation', '@csrf_token', '@logger.channel.form']
   form_submitter:
     class: Drupal\Core\Form\FormSubmitter
     arguments: ['@request_stack', '@url_generator']
@@ -152,6 +152,16 @@ services:
     factory_method: get
     factory_service: logger.factory
     arguments: ['system']
+  logger.channel.cron:
+    class: Drupal\Core\Logger\LoggerChannel
+    factory_method: get
+    factory_service: logger.factory
+    arguments: ['cron']
+  logger.channel.form:
+    class: Drupal\Core\Logger\LoggerChannel
+    factory_method: get
+    factory_service: logger.factory
+    arguments: ['form']
   logger.log_message_parser:
     class: Drupal\Core\Logger\LogMessageParser
 
@@ -218,10 +228,10 @@ services:
     arguments: ['@container.namespaces', '@cache.discovery', '@language_manager', '@module_handler']
   module_handler:
     class: Drupal\Core\Extension\ModuleHandler
-    arguments: ['%container.modules%', '@cache.bootstrap']
+    arguments: ['%container.modules%', '@cache.bootstrap', '@logger.channel.default']
   theme_handler:
     class: Drupal\Core\Extension\ThemeHandler
-    arguments: ['@config.factory', '@module_handler', '@state', '@info_parser', '@config.installer', '@router.builder']
+    arguments: ['@config.factory', '@module_handler', '@state', '@info_parser', '@logger.channel.default', '@config.installer', '@router.builder']
   entity.manager:
     class: Drupal\Core\Entity\EntityManager
     arguments: ['@container.namespaces', '@module_handler', '@cache.discovery', '@language_manager', '@string_translation']
@@ -482,6 +492,7 @@ services:
       - { name: event_subscriber }
   route_special_attributes_subscriber:
     class: Drupal\Core\EventSubscriber\SpecialAttributesRouteSubscriber
+    arguments: ['@logger.channel.default']
     tags:
       - { name: event_subscriber }
   route_http_method_subscriber:
@@ -618,7 +629,7 @@ services:
     arguments: ['@config.manager', '@config.storage', '@config.storage.snapshot']
   exception_controller:
     class: Drupal\Core\Controller\ExceptionController
-    arguments: ['@content_negotiation', '@title_resolver', '@html_page_renderer', '@html_fragment_renderer', '@string_translation', '@url_generator']
+    arguments: ['@content_negotiation', '@title_resolver', '@html_page_renderer', '@html_fragment_renderer', '@string_translation', '@url_generator', '@logger.factory']
     calls:
       - [setContainer, ['@service_container']]
   exception_listener:
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index ac20992..112722c 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -1092,20 +1092,21 @@ function request_uri($omit_query_string = FALSE) {
  */
 function watchdog_exception($type, Exception $exception, $message = NULL, $variables = array(), $severity = WATCHDOG_ERROR, $link = NULL) {
 
-   // Use a default value if $message is not set.
-   if (empty($message)) {
-     // The exception message is run through
-     // \Drupal\Component\Utility\String::checkPlain() by
-     // \Drupal\Core\Utility\Error:decodeException().
-     $message = '%type: !message in %function (line %line of %file).';
-   }
-   // $variables must be an array so that we can add the exception information.
-   if (!is_array($variables)) {
-     $variables = array();
-   }
-
-   $variables += Error::decodeException($exception);
-   watchdog($type, $message, $variables, $severity, $link);
+  // Use a default value if $message is not set.
+  if (empty($message)) {
+    // The exception message is run through
+    // \Drupal\Component\Utility\String::checkPlain() by
+    // \Drupal\Core\Utility\Error:decodeException().
+    $message = '%type: !message in %function (line %line of %file).';
+  }
+
+  if ($link) {
+    $variables['link'] = $link;
+  }
+
+  $variables += Error::decodeException($exception);
+
+  \Drupal::logger($type)->log($severity, $message, $variables);
 }
 
 /**
diff --git a/core/includes/errors.inc b/core/includes/errors.inc
index 8b0b9e4..2e35710 100644
--- a/core/includes/errors.inc
+++ b/core/includes/errors.inc
@@ -156,7 +156,7 @@ function _drupal_log_error($error, $fatal = FALSE) {
     $number++;
   }
 
-  watchdog('php', '%type: !message in %function (line %line of %file).', $error, $error['severity_level']);
+  \Drupal::logger('php')->log($error['severity_level'], '%type: !message in %function (line %line of %file).', $error);
 
   if (drupal_is_cli()) {
     if ($fatal) {
diff --git a/core/includes/file.inc b/core/includes/file.inc
index fc0b72a..4115791 100644
--- a/core/includes/file.inc
+++ b/core/includes/file.inc
@@ -616,7 +616,7 @@ function file_save_htaccess($directory, $private = TRUE, $force_overwrite = FALS
   }
   else {
     $variables = array('%directory' => $directory, '!htaccess' => '<br />' . nl2br(String::checkPlain($htaccess_lines)));
-    watchdog('security', "Security warning: Couldn't write .htaccess file. Please create a .htaccess file in your %directory directory which contains the following lines: <code>!htaccess</code>", $variables, WATCHDOG_ERROR);
+    \Drupal::logger('security')->error("Security warning: Couldn't write .htaccess file. Please create a .htaccess file in your %directory directory which contains the following lines: <code>!htaccess</code>", $variables);
     return FALSE;
   }
 }
@@ -696,16 +696,17 @@ function file_valid_uri($uri) {
  */
 function file_unmanaged_copy($source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
   $original_source = $source;
+  $logger = \Drupal::logger('file');
 
   // Assert that the source file actually exists.
   if (!file_exists($source)) {
     // @todo Replace drupal_set_message() calls with exceptions instead.
     drupal_set_message(t('The specified file %file could not be copied because no file by that name exists. Please check that you supplied the correct filename.', array('%file' => $original_source)), 'error');
     if (($realpath = drupal_realpath($original_source)) !== FALSE) {
-      watchdog('file', 'File %file (%realpath) could not be copied because it does not exist.', array('%file' => $original_source, '%realpath' => $realpath));
+      $logger->notice('File %file (%realpath) could not be copied because it does not exist.', array('%file' => $original_source, '%realpath' => $realpath));
     }
     else {
-      watchdog('file', 'File %file could not be copied because it does not exist.', array('%file' => $original_source));
+      $logger->notice('File %file could not be copied because it does not exist.', array('%file' => $original_source));
     }
     return FALSE;
   }
@@ -726,7 +727,7 @@ function file_unmanaged_copy($source, $destination = NULL, $replace = FILE_EXIST
     $dirname = drupal_dirname($destination);
     if (!file_prepare_directory($dirname)) {
       // The destination is not valid.
-      watchdog('file', 'File %file could not be copied because the destination directory %destination is not configured correctly.', array('%file' => $original_source, '%destination' => $dirname));
+      $logger->notice('File %file could not be copied because the destination directory %destination is not configured correctly.', array('%file' => $original_source, '%destination' => $dirname));
       drupal_set_message(t('The specified file %file could not be copied because the destination directory is not properly configured. This may be caused by a problem with file or directory permissions. More information is available in the system log.', array('%file' => $original_source)), 'error');
       return FALSE;
     }
@@ -736,7 +737,7 @@ function file_unmanaged_copy($source, $destination = NULL, $replace = FILE_EXIST
   $destination = file_destination($destination, $replace);
   if ($destination === FALSE) {
     drupal_set_message(t('The file %file could not be copied because a file by that name already exists in the destination directory.', array('%file' => $original_source)), 'error');
-    watchdog('file', 'File %file could not be copied because a file by that name already exists in the destination directory (%destination)', array('%file' => $original_source, '%destination' => $destination));
+    $logger->notice('file', 'File %file could not be copied because a file by that name already exists in the destination directory (%destination)', array('%file' => $original_source, '%destination' => $destination));
     return FALSE;
   }
 
@@ -745,7 +746,7 @@ function file_unmanaged_copy($source, $destination = NULL, $replace = FILE_EXIST
   $real_destination = drupal_realpath($destination);
   if ($source == $destination || ($real_source !== FALSE) && ($real_source == $real_destination)) {
     drupal_set_message(t('The specified file %file was not copied because it would overwrite itself.', array('%file' => $source)), 'error');
-    watchdog('file', 'File %file could not be copied because it would overwrite itself.', array('%file' => $source));
+    $logger->notice('file', 'File %file could not be copied because it would overwrite itself.', array('%file' => $source));
     return FALSE;
   }
   // Make sure the .htaccess files are present.
@@ -755,7 +756,7 @@ function file_unmanaged_copy($source, $destination = NULL, $replace = FILE_EXIST
     // If the copy failed and realpaths exist, retry the operation using them
     // instead.
     if ($real_source === FALSE || $real_destination === FALSE || !@copy($real_source, $real_destination)) {
-      watchdog('file', 'The specified file %file could not be copied to %destination.', array('%file' => $source, '%destination' => $destination), WATCHDOG_ERROR);
+      $logger->error('file', 'The specified file %file could not be copied to %destination.', array('%file' => $source, '%destination' => $destination));
       return FALSE;
     }
   }
@@ -1025,8 +1026,9 @@ function file_delete_multiple(array $fids) {
  * @see file_unmanaged_delete_recursive()
  */
 function file_unmanaged_delete($path) {
+  $logger = \Drupal::logger('file');
   if (is_dir($path)) {
-    watchdog('file', '%path is a directory and cannot be removed using file_unmanaged_delete().', array('%path' => $path), WATCHDOG_ERROR);
+    $logger->error('%path is a directory and cannot be removed using file_unmanaged_delete().', array('%path' => $path));
     return FALSE;
   }
   if (is_file($path)) {
@@ -1035,12 +1037,12 @@ function file_unmanaged_delete($path) {
   // Return TRUE for non-existent file, but log that nothing was actually
   // deleted, as the current state is the intended result.
   if (!file_exists($path)) {
-    watchdog('file', 'The file %path was not deleted because it does not exist.', array('%path' => $path), WATCHDOG_NOTICE);
+    $logger->notice('The file %path was not deleted because it does not exist.', array('%path' => $path));
     return TRUE;
   }
   // We cannot handle anything other than files and directories. Log an error
   // for everything else (sockets, symbolic links, etc).
-  watchdog('file', 'The file %path is not of a recognized type so it was not deleted.', array('%path' => $path), WATCHDOG_ERROR);
+  $logger->error('The file %path is not of a recognized type so it was not deleted.', array('%path' => $path));
   return FALSE;
 }
 
@@ -1252,7 +1254,7 @@ function file_scan_directory($dir, $mask, $options = array(), $depth = 0) {
       closedir($handle);
     }
     else {
-      watchdog('file', '@dir can not be opened', array('@dir' => $dir), WATCHDOG_ERROR);
+      \Drupal::logger('file')->error('@dir can not be opened', array('@dir' => $dir));
     }
   }
 
@@ -1352,7 +1354,7 @@ function drupal_chmod($uri, $mode = NULL) {
     return TRUE;
   }
 
-  watchdog('file', 'The file permissions could not be set on %uri.', array('%uri' => $uri), WATCHDOG_ERROR);
+  \Drupal::logger('file')->error('The file permissions could not be set on %uri.', array('%uri' => $uri));
   return FALSE;
 }
 
diff --git a/core/includes/mail.inc b/core/includes/mail.inc
index 68091fb..2fb7fab 100644
--- a/core/includes/mail.inc
+++ b/core/includes/mail.inc
@@ -184,7 +184,7 @@ function drupal_mail($module, $key, $to, $langcode, $params = array(), $reply =
       $message['result'] = $system->mail($message);
       // Log errors.
       if (!$message['result']) {
-        watchdog('mail', 'Error sending e-mail (from %from to %to with reply-to %reply).', array('%from' => $message['from'], '%to' => $message['to'], '%reply' => $message['reply-to'] ? $message['reply-to'] : t('not set')), WATCHDOG_ERROR);
+        \Drupal::logger('mail')->error('Error sending e-mail (from %from to %to with reply-to %reply).', array('%from' => $message['from'], '%to' => $message['to'], '%reply' => $message['reply-to'] ? $message['reply-to'] : t('not set')));
         drupal_set_message(t('Unable to send e-mail. Contact the site administrator if the problem persists.'), 'error');
       }
     }
diff --git a/core/includes/menu.inc b/core/includes/menu.inc
index 0fefe74..08a52ea 100644
--- a/core/includes/menu.inc
+++ b/core/includes/menu.inc
@@ -839,7 +839,7 @@ function menu_link_rebuild_defaults() {
       }
       else {
         if (empty($link['route_name']) && empty($link['link_path'])) {
-          watchdog('error', 'Menu_link %machine_name does neither provide a route_name nor a link_path, so it got skipped.', array('%machine_name' => $machine_name));
+          \Drupal::logger('menu_link')->error('Menu_link %machine_name does neither provide a route_name nor a link_path, so it got skipped.', array('%machine_name' => $machine_name));
           continue;
         }
         $menu_link = $menu_link_storage->createFromDefaultLink($link);
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index e44f13d..1a07fd7 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -453,7 +453,7 @@ function _theme($hook, $variables = array()) {
       // Only log a message when not trying theme suggestions ($hook being an
       // array).
       if (!isset($candidate)) {
-        watchdog('theme', 'Theme hook %hook not found.', array('%hook' => $hook), WATCHDOG_WARNING);
+        \Drupal::logger('theme')->warning('Theme hook %hook not found.', array('%hook' => $hook));
       }
       // There is no theme implementation for the hook passed. Return FALSE so
       // the function calling _theme() can differentiate between a hook that
diff --git a/core/includes/unicode.inc b/core/includes/unicode.inc
index 9540d42..27f1dd8 100644
--- a/core/includes/unicode.inc
+++ b/core/includes/unicode.inc
@@ -102,7 +102,7 @@ function drupal_xml_parser_create(&$data) {
       $data = preg_replace('/^(<\?xml[^>]+encoding)="(.+?)"/', '\\1="utf-8"', $out);
     }
     else {
-      watchdog('php', 'Could not convert XML encoding %s to UTF-8.', array('%s' => $encoding), WATCHDOG_WARNING);
+      \Drupal::logger('php')->warning('Could not convert XML encoding %s to UTF-8.', array('%s' => $encoding));
       return FALSE;
     }
   }
@@ -128,7 +128,7 @@ function drupal_xml_parser_create(&$data) {
 function drupal_convert_to_utf8($data, $encoding) {
   $out = Unicode::convertToUtf8($data, $encoding);
   if ($out === FALSE) {
-    watchdog('php', 'Unsupported encoding %s. Please install iconv, GNU recode or mbstring for PHP.', array('%s' => $encoding), WATCHDOG_ERROR);
+    \Drupal::logger('php')->error('Unsupported encoding %s. Please install iconv, GNU recode or mbstring for PHP.', array('%s' => $encoding));
   }
 
   return $out;
diff --git a/core/lib/Drupal/Core/Controller/ExceptionController.php b/core/lib/Drupal/Core/Controller/ExceptionController.php
index 320cb06..e6e7984 100644
--- a/core/lib/Drupal/Core/Controller/ExceptionController.php
+++ b/core/lib/Drupal/Core/Controller/ExceptionController.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Controller;
 
+use Drupal\Core\Logger\LoggerChannelFactoryInterface;
 use Drupal\Core\Page\DefaultHtmlPageRenderer;
 use Drupal\Core\Page\HtmlFragmentRendererInterface;
 use Drupal\Core\Page\HtmlPageRendererInterface;
@@ -59,6 +60,13 @@ class ExceptionController extends HtmlControllerBase implements ContainerAwareIn
   protected $fragmentRenderer;
 
   /**
+   * The logger factory service.
+   *
+   * @var \Drupal\Core\Logger\LoggerChannelFactoryInterface
+   */
+  protected $loggerFactory;
+
+  /**
    * Constructor.
    *
    * @param \Drupal\Core\ContentNegotiation $negotiation
@@ -73,13 +81,17 @@ class ExceptionController extends HtmlControllerBase implements ContainerAwareIn
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    *   The url generator.
    * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
+   *   The URL generator.
+   * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory
+   *   The logger factory.
    */
-  public function __construct(ContentNegotiation $negotiation, TitleResolverInterface $title_resolver, HtmlPageRendererInterface $renderer, HtmlFragmentRendererInterface $fragment_renderer, TranslationInterface $string_translation, UrlGeneratorInterface $url_generator) {
+  public function __construct(ContentNegotiation $negotiation, TitleResolverInterface $title_resolver, HtmlPageRendererInterface $renderer, HtmlFragmentRendererInterface $fragment_renderer, TranslationInterface $string_translation, UrlGeneratorInterface $url_generator, LoggerChannelFactoryInterface $logger_factory) {
     parent::__construct($title_resolver, $url_generator);
     $this->negotiation = $negotiation;
     $this->htmlPageRenderer = $renderer;
     $this->fragmentRenderer = $fragment_renderer;
     $this->stringTranslation = $string_translation;
+    $this->loggerFactory = $logger_factory;
   }
 
   /**
@@ -143,7 +155,7 @@ public function on405Html(FlattenException $exception, Request $request) {
    */
   public function on403Html(FlattenException $exception, Request $request) {
     $system_path = $request->attributes->get('_system_path');
-    watchdog('access denied', $system_path, array(), WATCHDOG_WARNING);
+    $this->loggerFactory->get('access denied')->warning($system_path);
 
     $system_config = $this->container->get('config.factory')->get('system.site');
     $path = $this->container->get('path.alias_manager')->getPathByAlias($system_config->get('page.403'));
@@ -185,7 +197,7 @@ public function on403Html(FlattenException $exception, Request $request) {
    *   A response object.
    */
   public function on404Html(FlattenException $exception, Request $request) {
-    watchdog('page not found', String::checkPlain($request->attributes->get('_system_path')), array(), WATCHDOG_WARNING);
+    $this->loggerFactory->get('page not found')->warning(String::checkPlain($request->attributes->get('_system_path')));
 
     // Check for and return a fast 404 page if configured.
     $config = \Drupal::config('system.performance');
@@ -271,7 +283,7 @@ public function on500Html(FlattenException $exception, Request $request) {
       $number++;
     }
 
-    watchdog('php', '%type: !message in %function (line %line of %file).', $error, $error['severity_level']);
+    $this->loggerFactory->get('php')->log($error['severity_level'], '%type: !message in %function (line %line of %file).', $error);
 
     // Display the message if the current error reporting level allows this type
     // of message to be displayed, and unconditionnaly in update.php.
diff --git a/core/lib/Drupal/Core/Cron.php b/core/lib/Drupal/Core/Cron.php
index 046216e..dd30ec8 100644
--- a/core/lib/Drupal/Core/Cron.php
+++ b/core/lib/Drupal/Core/Cron.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Session\AccountProxyInterface;
 use Drupal\Core\Session\AnonymousUserSession;
 use Drupal\Core\Session\SessionManagerInterface;
+use Psr\Log\LoggerInterface;
 
 /**
  * The Drupal core Cron service.
@@ -63,6 +64,13 @@ class Cron implements CronInterface {
   protected $sessionManager;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a cron object.
    *
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
@@ -77,14 +85,17 @@ class Cron implements CronInterface {
    *    The current user.
    * @param \Drupal\Core\Session\SessionManagerInterface $session_manager
    *   The session manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(ModuleHandlerInterface $module_handler, LockBackendInterface $lock, QueueFactory $queue_factory, StateInterface $state, AccountProxyInterface $current_user, SessionManagerInterface $session_manager) {
+  public function __construct(ModuleHandlerInterface $module_handler, LockBackendInterface $lock, QueueFactory $queue_factory, StateInterface $state, AccountProxyInterface $current_user, SessionManagerInterface $session_manager, LoggerInterface $logger) {
     $this->moduleHandler = $module_handler;
     $this->lock = $lock;
     $this->queueFactory = $queue_factory;
     $this->state = $state;
     $this->currentUser = $current_user;
     $this->sessionManager = $session_manager;
+    $this->logger = $logger;
   }
 
   /**
@@ -111,7 +122,7 @@ public function run() {
     // Try to acquire cron lock.
     if (!$this->lock->acquire('cron', 240.0)) {
       // Cron is still running normally.
-      watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
+      $this->logger->warning('Attempting to re-run cron while it is already running.');
     }
     else {
       $this->invokeCronHandlers();
@@ -142,7 +153,7 @@ public function run() {
   protected function setCronLastTime() {
     // Record cron time.
     $this->state->set('system.cron_last', REQUEST_TIME);
-    watchdog('cron', 'Cron run completed.', array(), WATCHDOG_NOTICE);
+    $this->logger->notice('Cron run completed.');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index 2b788dc..75d794d 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -200,7 +200,7 @@ public function boot() {
     $this->initializeContainer();
     $this->booted = TRUE;
     if ($this->containerNeedsDumping && !$this->dumpDrupalContainer($this->container, static::CONTAINER_BASE_CLASS)) {
-      watchdog('DrupalKernel', 'Container cannot be written to disk');
+      $this->container->get('logger.factory')->get('DrupalKernel')->notice('Container cannot be written to disk');
     }
   }
 
diff --git a/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php
index 8556561..6f00ee1 100644
--- a/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/SpecialAttributesRouteSubscriber.php
@@ -10,6 +10,7 @@
 use Drupal\Component\Utility\String;
 use Drupal\Core\Routing\RouteBuildEvent;
 use Drupal\Core\Routing\RouteSubscriberBase;
+use Psr\Log\LoggerInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\Routing\RouteCollection;
 
@@ -19,6 +20,23 @@
 class SpecialAttributesRouteSubscriber extends RouteSubscriberBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a SpecialAttributesRouteSubscriber object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
    * {@inheritdoc}
    */
   protected function alterRoutes(RouteCollection $collection) {
@@ -38,7 +56,7 @@ protected function alterRoutes(RouteCollection $collection) {
       if ($not_allowed_variables = array_intersect($route->compile()->getVariables(), $special_variables)) {
         $placeholders = array('@variables' => implode(', ', $not_allowed_variables));
         drupal_set_message(String::format('The following variables are reserved names by drupal: @variables', $placeholders));
-        watchdog('error', 'The following variables are reserved names by drupal: @variables', $placeholders);
+        $this->logger->error('The following variables are reserved names by drupal: @variables', $placeholders);
         return FALSE;
       }
     }
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php
index 62cdd06..52260e0 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -11,6 +11,7 @@
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\CacheBackendInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -77,6 +78,13 @@ class ModuleHandler implements ModuleHandlerInterface {
   protected $alterFunctions;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a ModuleHandler object.
    *
    * @param array $module_list
@@ -85,16 +93,19 @@ class ModuleHandler implements ModuleHandlerInterface {
    *   %container.modules% parameter being set up by DrupalKernel.
    * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
    *   Cache backend for storing module hook implementation information.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    *
    * @see \Drupal\Core\DrupalKernel
    * @see \Drupal\Core\CoreServiceProvider
    */
-  public function __construct(array $module_list = array(), CacheBackendInterface $cache_backend) {
+  public function __construct(array $module_list = array(), CacheBackendInterface $cache_backend, LoggerInterface $logger) {
     $this->moduleList = array();
     foreach ($module_list as $name => $module) {
       $this->moduleList[$name] = new Extension($module['type'], $module['pathname'], $module['filename']);
     }
     $this->cacheBackend = $cache_backend;
+    $this->logger = $logger;
   }
 
   /**
@@ -815,7 +826,7 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
         $this->invoke($module, 'install');
 
         // Record the fact that it was installed.
-        watchdog('system', '%module module installed.', array('%module' => $module), WATCHDOG_INFO);
+        $this->logger->info('%module module installed.', array('%module' => $module));
       }
     }
 
@@ -926,7 +937,7 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
       // @see https://drupal.org/node/2208429
       \Drupal::service('theme_handler')->refreshInfo();
 
-      watchdog('system', '%module module uninstalled.', array('%module' => $module), WATCHDOG_INFO);
+      $this->logger->info('%module module uninstalled.', array('%module' => $module));
 
       $schema_store->delete($module);
     }
diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index dbe2c78..7e0da6b 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Config\ConfigInstallerInterface;
 use Drupal\Core\State\StateInterface;
 use Drupal\Core\Routing\RouteBuilder;
+use Psr\Log\LoggerInterface;
 
 /**
  * Default theme handler using the config system for enabled/disabled themes.
@@ -79,6 +80,13 @@ class ThemeHandler implements ThemeHandlerInterface {
   protected $infoParser;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * The route builder to rebuild the routes if a theme is enabled.
    *
    * @var \Drupal\Core\Routing\RouteBuilder
@@ -103,6 +111,8 @@ class ThemeHandler implements ThemeHandlerInterface {
    *   The state store.
    * @param \Drupal\Core\Extension\InfoParserInterface $info_parser
    *   The info parser to parse the theme.info.yml files.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    * @param \Drupal\Core\Config\ConfigInstallerInterface $config_installer
    *   (optional) The config installer to install configuration. This optional
    *   to allow the theme handler to work before Drupal is installed and has a
@@ -112,11 +122,12 @@ class ThemeHandler implements ThemeHandlerInterface {
    * @param \Drupal\Core\Extension\ExtensionDiscovery $extension_discovery
    *   (optional) A extension discovery instance (for unit tests).
    */
-  public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, StateInterface $state, InfoParserInterface $info_parser, ConfigInstallerInterface $config_installer = NULL, RouteBuilder $route_builder = NULL, ExtensionDiscovery $extension_discovery = NULL) {
+  public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, StateInterface $state, InfoParserInterface $info_parser, LoggerInterface $logger, ConfigInstallerInterface $config_installer = NULL, RouteBuilder $route_builder = NULL, ExtensionDiscovery $extension_discovery = NULL) {
     $this->configFactory = $config_factory;
     $this->moduleHandler = $module_handler;
     $this->state = $state;
     $this->infoParser = $info_parser;
+    $this->logger = $logger;
     $this->configInstaller = $config_installer;
     $this->routeBuilder = $route_builder;
     $this->extensionDiscovery = $extension_discovery;
@@ -257,7 +268,7 @@ public function enable(array $theme_list, $enable_dependencies = TRUE) {
       $themes_enabled[] = $key;
 
       // Record the fact that it was enabled.
-      watchdog('system', '%theme theme enabled.', array('%theme' => $key), WATCHDOG_INFO);
+      $this->logger->info('%theme theme enabled.', array('%theme' => $key));
     }
 
     $this->clearCssCache();
diff --git a/core/lib/Drupal/Core/Form/FormValidator.php b/core/lib/Drupal/Core/Form/FormValidator.php
index eda8238..72a951b 100644
--- a/core/lib/Drupal/Core/Form/FormValidator.php
+++ b/core/lib/Drupal/Core/Form/FormValidator.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Render\Element;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\StringTranslation\TranslationInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\HttpFoundation\RequestStack;
 
 /**
@@ -37,6 +38,13 @@ class FormValidator implements FormValidatorInterface {
   protected $requestStack;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new FormValidator.
    *
    * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
@@ -45,11 +53,14 @@ class FormValidator implements FormValidatorInterface {
    *   The string translation service.
    * @param \Drupal\Core\Access\CsrfTokenGenerator $csrf_token
    *   The CSRF token generator.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(RequestStack $request_stack, TranslationInterface $string_translation, CsrfTokenGenerator $csrf_token) {
+  public function __construct(RequestStack $request_stack, TranslationInterface $string_translation, CsrfTokenGenerator $csrf_token, LoggerInterface $logger) {
     $this->requestStack = $request_stack;
     $this->stringTranslation = $string_translation;
     $this->csrfToken = $csrf_token;
+    $this->logger = $logger;
   }
 
   /**
@@ -318,7 +329,7 @@ protected function performRequiredValidation(&$elements, &$form_state) {
         foreach ($value as $v) {
           if (!isset($options[$v])) {
             $this->setError($elements, $form_state, $this->t('An illegal choice has been detected. Please contact the site administrator.'));
-            $this->watchdog('form', 'Illegal choice %choice in !name element.', array('%choice' => $v, '!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']), WATCHDOG_ERROR);
+            $this->logger->error('Illegal choice %choice in !name element.', array('%choice' => $v, '!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']));
           }
         }
       }
@@ -337,7 +348,7 @@ protected function performRequiredValidation(&$elements, &$form_state) {
       }
       elseif (!isset($options[$elements['#value']])) {
         $this->setError($elements, $form_state, $this->t('An illegal choice has been detected. Please contact the site administrator.'));
-        $this->watchdog('form', 'Illegal choice %choice in %name element.', array('%choice' => $elements['#value'], '%name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']), WATCHDOG_ERROR);
+        $this->logger->error('Illegal choice %choice in %name element.', array('%choice' => $elements['#value'], '%name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']));
       }
     }
   }
@@ -500,13 +511,6 @@ public function getAnyErrors() {
   }
 
   /**
-   * Wraps watchdog().
-   */
-  protected function watchdog($type, $message, array $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
-    watchdog($type, $message, $variables, $severity, $link);
-  }
-
-  /**
    * Wraps drupal_set_message().
    *
    * @return array|null
diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
index 4f28a6e..64aef6c 100644
--- a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
@@ -7,9 +7,40 @@
 
 namespace Drupal\Core\ImageToolkit;
 
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
-abstract class ImageToolkitBase extends PluginBase implements ImageToolkitInterface {
+abstract class ImageToolkitBase extends PluginBase implements ImageToolkitInterface, ContainerFactoryPluginInterface {
+
+  /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerInterface $logger) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('logger.factory')->get('image')
+    );
+  }
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/action/lib/Drupal/action/Form/ActionDeleteForm.php b/core/modules/action/lib/Drupal/action/Form/ActionDeleteForm.php
index 968b7f0..f62c016 100644
--- a/core/modules/action/lib/Drupal/action/Form/ActionDeleteForm.php
+++ b/core/modules/action/lib/Drupal/action/Form/ActionDeleteForm.php
@@ -8,6 +8,8 @@
 namespace Drupal\action\Form;
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Builds a form to delete an action.
@@ -15,6 +17,32 @@
 class ActionDeleteForm extends EntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new ActionDeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('user')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -43,7 +71,7 @@ public function getCancelRoute() {
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
 
-    watchdog('user', 'Deleted action %aid (%action)', array('%aid' => $this->entity->id(), '%action' => $this->entity->label()));
+    $this->logger->notice('Deleted action %aid (%action)', array('%aid' => $this->entity->id(), '%action' => $this->entity->label()));
     drupal_set_message($this->t('Action %action was deleted', array('%action' => $this->entity->label())));
 
     $form_state['redirect_route'] = array(
diff --git a/core/modules/action/lib/Drupal/action/Plugin/Action/EmailAction.php b/core/modules/action/lib/Drupal/action/Plugin/Action/EmailAction.php
index 3342fc3..863d5ff 100644
--- a/core/modules/action/lib/Drupal/action/Plugin/Action/EmailAction.php
+++ b/core/modules/action/lib/Drupal/action/Plugin/Action/EmailAction.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Utility\Token;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -39,6 +40,13 @@ class EmailAction extends ConfigurableActionBase implements ContainerFactoryPlug
   protected $storage;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a EmailAction object.
    *
    * @param array $configuration
@@ -51,12 +59,15 @@ class EmailAction extends ConfigurableActionBase implements ContainerFactoryPlug
    *   The token service.
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, Token $token, EntityManagerInterface $entity_manager) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, Token $token, EntityManagerInterface $entity_manager, LoggerInterface $logger) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     $this->token = $token;
     $this->storage = $entity_manager->getStorage('user');
+    $this->logger = $logger;
   }
 
   /**
@@ -65,7 +76,8 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
   public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
     return new static($configuration, $plugin_id, $plugin_definition,
       $container->get('token'),
-      $container->get('entity.manager')
+      $container->get('entity.manager'),
+      $container->get('logger.factory')->get('action')
     );
   }
 
@@ -93,10 +105,10 @@ public function execute($entity = NULL) {
     $params = array('context' => $this->configuration);
 
     if (drupal_mail('system', 'action_send_email', $recipient, $langcode, $params)) {
-      watchdog('action', 'Sent email to %recipient', array('%recipient' => $recipient));
+      $this->logger->notice('Sent email to %recipient', array('%recipient' => $recipient));
     }
     else {
-      watchdog('error', 'Unable to send email to %recipient', array('%recipient' => $recipient));
+      $this->logger->error('Unable to send email to %recipient', array('%recipient' => $recipient));
     }
   }
 
diff --git a/core/modules/aggregator/aggregator.services.yml b/core/modules/aggregator/aggregator.services.yml
index 08347a6..f53abab 100644
--- a/core/modules/aggregator/aggregator.services.yml
+++ b/core/modules/aggregator/aggregator.services.yml
@@ -10,4 +10,9 @@ services:
     arguments: [processor, '@container.namespaces', '@cache.discovery', '@language_manager', '@module_handler']
   aggregator.items.importer:
     class: Drupal\aggregator\ItemsImporter
-    arguments: ['@config.factory', '@plugin.manager.aggregator.fetcher', '@plugin.manager.aggregator.parser', '@plugin.manager.aggregator.processor']
+    arguments: ['@config.factory', '@plugin.manager.aggregator.fetcher', '@plugin.manager.aggregator.parser', '@plugin.manager.aggregator.processor', '@logger.channel.aggregator']
+  logger.channel.aggregator:
+    class: Drupal\Core\Logger\LoggerChannel
+    factory_method: get
+    factory_service: logger.factory
+    arguments: ['aggregator']
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedForm.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedForm.php
index 1770f03..cab41f0 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/FeedForm.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedForm.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\ContentEntityForm;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Language\Language;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -19,6 +20,32 @@
 class FeedForm extends ContentEntityForm {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new FeedForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('aggregator')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function form(array $form, array &$form_state) {
@@ -74,7 +101,7 @@ public function save(array $form, array &$form_state) {
       }
     }
     else {
-      watchdog('aggregator', 'Feed %feed added.', array('%feed' => $feed->label()), WATCHDOG_NOTICE, l($this->t('View'), 'admin/config/services/aggregator'));
+      $this->logger->notice('Feed %feed added.', array('%feed' => $feed->label(), 'link' => l($this->t('View'), 'admin/config/services/aggregator')));
       drupal_set_message($this->t('The feed %feed has been added.', array('%feed' => $feed->label())));
     }
   }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Form/FeedDeleteForm.php b/core/modules/aggregator/lib/Drupal/aggregator/Form/FeedDeleteForm.php
index 7cc3827..f0f6f76 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Form/FeedDeleteForm.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Form/FeedDeleteForm.php
@@ -8,6 +8,8 @@
 namespace Drupal\aggregator\Form;
 
 use Drupal\Core\Entity\ContentEntityConfirmFormBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a form for deleting a feed.
@@ -15,6 +17,32 @@
 class FeedDeleteForm extends ContentEntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new FeedDeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('aggregator')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -42,7 +70,7 @@ public function getConfirmText() {
    */
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
-    watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $this->entity->label()));
+    $this->logger->notice('Feed %feed deleted.', array('%feed' => $this->entity->label()));
     drupal_set_message($this->t('The feed %feed has been deleted.', array('%feed' => $this->entity->label())));
     if (arg(0) == 'admin') {
       $form_state['redirect_route']['route_name'] = 'aggregator.admin_overview';
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php b/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php
index 6148775..95b7e60 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php
@@ -10,6 +10,7 @@
 use Drupal\aggregator\FeedStorageInterface;
 use Drupal\Component\Utility\UrlHelper;
 use Drupal\Core\Form\FormBase;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use GuzzleHttp\Exception\RequestException;
 use GuzzleHttp\ClientInterface;
@@ -34,16 +35,26 @@ class OpmlFeedAdd extends FormBase {
   protected $httpClient;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a database object.
    *
    * @param \Drupal\aggregator\FeedStorageInterface $feed_storage
    *   The feed storage.
    * @param \GuzzleHttp\ClientInterface $http_client
    *   The Guzzle HTTP client.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
   public function __construct(FeedStorageInterface $feed_storage, ClientInterface $http_client) {
     $this->feedStorage = $feed_storage;
     $this->httpClient = $http_client;
+    $this->logger = $logger;
   }
 
   /**
@@ -52,7 +63,8 @@ public function __construct(FeedStorageInterface $feed_storage, ClientInterface
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager')->getStorage('aggregator_feed'),
-      $container->get('http_client')
+      $container->get('http_client'),
+      $container->get('logger.factory')->get('aggregator')
     );
   }
 
@@ -124,7 +136,7 @@ public function submitForm(array &$form, array &$form_state) {
         $data = $response->getBody(TRUE);
       }
       catch (RequestException $e) {
-        watchdog('aggregator', 'Failed to download OPML file due to "%error".', array('%error' => $e->getMessage()), WATCHDOG_WARNING);
+        $this->logger->warning('Failed to download OPML file due to "%error".', array('%error' => $e->getMessage()));
         drupal_set_message($this->t('Failed to download OPML file due to "%error".', array('%error' => $e->getMessage())));
         return;
       }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/ItemsImporter.php b/core/modules/aggregator/lib/Drupal/aggregator/ItemsImporter.php
index ac3277d..af19325 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/ItemsImporter.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/ItemsImporter.php
@@ -10,6 +10,7 @@
 use Drupal\aggregator\Plugin\AggregatorPluginManager;
 use Drupal\Component\Plugin\Exception\PluginException;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Psr\Log\LoggerInterface;
 
 /**
  * Defines an importer of aggregator items.
@@ -45,6 +46,13 @@ class ItemsImporter implements ItemsImporterInterface {
   protected $config;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs an Importer object.
    *
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
@@ -55,12 +63,15 @@ class ItemsImporter implements ItemsImporterInterface {
    *   The aggregator parser plugin manager.
    * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $processor_manager
    *   The aggregator processor plugin manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(ConfigFactoryInterface $config_factory, AggregatorPluginManager $fetcher_manager, AggregatorPluginManager $parser_manager, AggregatorPluginManager $processor_manager) {
+  public function __construct(ConfigFactoryInterface $config_factory, AggregatorPluginManager $fetcher_manager, AggregatorPluginManager $parser_manager, AggregatorPluginManager $processor_manager, LoggerInterface $logger) {
     $this->fetcherManager = $fetcher_manager;
     $this->processorManager = $processor_manager;
     $this->parserManager = $parser_manager;
     $this->config = $config_factory->get('aggregator.settings');
+    $this->logger = $logger;
   }
 
   /**
@@ -118,10 +129,10 @@ public function refresh(FeedInterface $feed) {
 
           // Log if feed URL has changed.
           if ($feed->getUrl() != $feed_url) {
-            watchdog('aggregator', 'Updated URL for feed %title to %url.', array('%title' => $feed->label(), '%url' => $feed->getUrl()));
+            $this->logger->notice('Updated URL for feed %title to %url.', array('%title' => $feed->label(), '%url' => $feed->getUrl()));
           }
 
-          watchdog('aggregator', 'There is new syndicated content from %site.', array('%site' => $feed->label()));
+          $this->logger->notice('There is new syndicated content from %site.', array('%site' => $feed->label()));
 
           // If there are items on the feed, let enabled processors process them.
           if (!empty($feed->items)) {
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php
index 4e8eee9..8082da8 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use GuzzleHttp\ClientInterface;
 use GuzzleHttp\Exception\RequestException;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -35,13 +36,23 @@ class DefaultFetcher implements FetcherInterface, ContainerFactoryPluginInterfac
   protected $httpClient;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a DefaultFetcher object.
    *
    * @param \GuzzleHttp\ClientInterface $http_client
    *   A Guzzle client object.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(ClientInterface $http_client) {
+  public function __construct(ClientInterface $http_client, LoggerInterface $logger) {
     $this->httpClient = $http_client;
+    $this->logger = $logger;
   }
 
   /**
@@ -49,7 +60,8 @@ public function __construct(ClientInterface $http_client) {
    */
   public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
     return new static(
-      $container->get('http_client')
+      $container->get('http_client'),
+      $container->get('logger.factory')->get('aggregator')
     );
   }
 
@@ -90,7 +102,7 @@ public function fetch(FeedInterface $feed) {
       return TRUE;
     }
     catch (RequestException $e) {
-      watchdog('aggregator', 'The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage()), WATCHDOG_WARNING);
+      $this->logger->warning('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage()));
       drupal_set_message(t('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())));
       return FALSE;
     }
diff --git a/core/modules/ban/lib/Drupal/ban/Form/BanDelete.php b/core/modules/ban/lib/Drupal/ban/Form/BanDelete.php
index 69b6e90..ca8635e 100644
--- a/core/modules/ban/lib/Drupal/ban/Form/BanDelete.php
+++ b/core/modules/ban/lib/Drupal/ban/Form/BanDelete.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\ban\BanIpManagerInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 
@@ -25,13 +26,23 @@ class BanDelete extends ConfirmFormBase {
   protected $banIp;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new BanDelete object.
    *
    * @param \Drupal\ban\BanIpManagerInterface $ip_manager
    *   The IP manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(BanIpManagerInterface $ip_manager) {
+  public function __construct(BanIpManagerInterface $ip_manager, LoggerInterface $logger) {
     $this->ipManager = $ip_manager;
+    $this->logger = $logger;
   }
 
   /**
@@ -39,7 +50,8 @@ public function __construct(BanIpManagerInterface $ip_manager) {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('ban.ip_manager')
+      $container->get('ban.ip_manager'),
+      $container->get('logger.factory')->get('user')
     );
   }
 
@@ -91,7 +103,7 @@ public function buildForm(array $form, array &$form_state, $ban_id = '') {
    */
   public function submitForm(array &$form, array &$form_state) {
     $this->ipManager->unbanIp($this->banIp);
-    watchdog('user', 'Deleted %ip', array('%ip' => $this->banIp));
+    $this->logger->notice('Deleted %ip', array('%ip' => $this->banIp));
     drupal_set_message($this->t('The IP address %ip was deleted.', array('%ip' => $this->banIp)));
     $form_state['redirect_route']['route_name'] = 'ban.admin_page';
   }
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockForm.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockForm.php
index f495c4f..6e8a466 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockForm.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockForm.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageManager;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -35,6 +36,13 @@ class CustomBlockForm extends ContentEntityForm {
   protected $languageManager;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a CustomBlockForm object.
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
@@ -43,11 +51,14 @@ class CustomBlockForm extends ContentEntityForm {
    *   The custom block storage.
    * @param \Drupal\Core\Language\LanguageManager $language_manager
    *   The language manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityManagerInterface $entity_manager, EntityStorageInterface $custom_block_storage, LanguageManager $language_manager) {
+  public function __construct(EntityManagerInterface $entity_manager, EntityStorageInterface $custom_block_storage, LanguageManager $language_manager, LoggerInterface $logger) {
     parent::__construct($entity_manager);
     $this->customBlockStorage = $custom_block_storage;
     $this->languageManager = $language_manager;
+    $this->logger = $logger;
   }
 
   /**
@@ -194,16 +205,16 @@ public function save(array $form, array &$form_state) {
     $block = $this->entity;
     $insert = $block->isNew();
     $block->save();
-    $watchdog_args = array('@type' => $block->bundle(), '%info' => $block->label());
+    $context = array('@type' => $block->bundle(), '%info' => $block->label());
     $block_type = entity_load('custom_block_type', $block->bundle());
     $t_args = array('@type' => $block_type->label(), '%info' => $block->label());
 
     if ($insert) {
-      watchdog('content', '@type: added %info.', $watchdog_args, WATCHDOG_NOTICE);
+      $this->logger->notice('@type: added %info.', $context);
       drupal_set_message($this->t('@type %info has been created.', $t_args));
     }
     else {
-      watchdog('content', '@type: updated %info.', $watchdog_args, WATCHDOG_NOTICE);
+      $this->logger->notice('@type: updated %info.', $context);
       drupal_set_message($this->t('@type %info has been updated.', $t_args));
     }
 
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php
index 61567f8..c968503 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php
@@ -94,11 +94,11 @@ public function save(array $form, array &$form_state) {
     $edit_link = \Drupal::linkGenerator()->generateFromUrl($this->t('Edit'), $this->entity->urlInfo());
     if ($status == SAVED_UPDATED) {
       drupal_set_message(t('Custom block type %label has been updated.', array('%label' => $block_type->label())));
-      watchdog('custom_block', 'Custom block type %label has been updated.', array('%label' => $block_type->label()), WATCHDOG_NOTICE, $edit_link);
+      \Drupal::logger('custom_block')->notice('Custom block type %label has been updated.', array('%label' => $block_type->label(), 'link' => $edit_link));
     }
     else {
       drupal_set_message(t('Custom block type %label has been added.', array('%label' => $block_type->label())));
-      watchdog('custom_block', 'Custom block type %label has been added.', array('%label' => $block_type->label()), WATCHDOG_NOTICE, $edit_link);
+      \Drupal::logger('custom_block')->notice('Custom block type %label has been added.', array('%label' => $block_type->label(), 'link' => $edit_link));
     }
 
     $form_state['redirect_route']['route_name'] = 'custom_block.type_list';
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockDeleteForm.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockDeleteForm.php
index 36df166..30197f4 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockDeleteForm.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockDeleteForm.php
@@ -8,6 +8,8 @@
 namespace Drupal\custom_block\Form;
 
 use Drupal\Core\Entity\ContentEntityConfirmFormBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a confirmation form for deleting a custom block entity.
@@ -15,6 +17,32 @@
 class CustomBlockDeleteForm extends ContentEntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new CustomBlockDeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('custom_block')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -57,7 +85,7 @@ public function buildForm(array $form, array &$form_state) {
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
     drupal_set_message($this->t('Custom block %label has been deleted.', array('%label' => $this->entity->label())));
-    watchdog('custom_block', 'Custom block %label has been deleted.', array('%label' => $this->entity->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('Custom block %label has been deleted.', array('%label' => $this->entity->label()));
     $form_state['redirect_route']['route_name'] = 'custom_block.list';
   }
 
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php
index 8b7a681..50c3a1d 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
 use Drupal\Core\Entity\Query\QueryFactory;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -17,6 +18,13 @@
 class CustomBlockTypeDeleteForm extends EntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * The query factory to create entity queries.
    *
    * @var \Drupal\Core\Entity\Query\QueryFactory
@@ -28,9 +36,12 @@ class CustomBlockTypeDeleteForm extends EntityConfirmFormBase {
    *
    * @param \Drupal\Core\Entity\Query\QueryFactory $query_factory
    *   The entity query object.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
   public function __construct(QueryFactory $query_factory) {
     $this->queryFactory = $query_factory;
+    $this->logger = $logger;
   }
 
   /**
@@ -38,7 +49,8 @@ public function __construct(QueryFactory $query_factory) {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('entity.query')
+      $container->get('entity.query'),
+      $container->get('logger.factory')->get('custom_block')
     );
   }
 
@@ -87,7 +99,7 @@ public function submit(array $form, array &$form_state) {
     $this->entity->delete();
     $form_state['redirect_route']['route_name'] = 'custom_block.type_list';
     drupal_set_message(t('Custom block type %label has been deleted.', array('%label' => $this->entity->label())));
-    watchdog('custom_block', 'Custom block type %label has been deleted.', array('%label' => $this->entity->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('Custom block type %label has been deleted.', array('%label' => $this->entity->label()));
   }
 
 }
diff --git a/core/modules/book/lib/Drupal/book/Form/BookAdminEditForm.php b/core/modules/book/lib/Drupal/book/Form/BookAdminEditForm.php
index f76fe90..9148cb3 100644
--- a/core/modules/book/lib/Drupal/book/Form/BookAdminEditForm.php
+++ b/core/modules/book/lib/Drupal/book/Form/BookAdminEditForm.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Render\Element;
 use Drupal\node\NodeInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -35,16 +36,26 @@ class BookAdminEditForm extends FormBase {
   protected $bookManager;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new BookAdminEditForm.
    *
    * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
    *   The custom block storage.
    * @param \Drupal\book\BookManagerInterface $book_manager
    *   The book manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityStorageInterface $node_storage, BookManagerInterface $book_manager) {
+  public function __construct(EntityStorageInterface $node_storage, BookManagerInterface $book_manager, LoggerInterface $logger) {
     $this->nodeStorage = $node_storage;
     $this->bookManager = $book_manager;
+    $this->logger = $logger;
   }
 
   /**
@@ -54,7 +65,8 @@ public static function create(ContainerInterface $container) {
     $entity_manager = $container->get('entity.manager');
     return new static(
       $entity_manager->getStorage('node'),
-      $container->get('book.manager')
+      $container->get('book.manager'),
+      $container->get('logger.factory')->get('content')
     );
   }
 
@@ -119,7 +131,7 @@ public function submitForm(array &$form, array &$form_state) {
           $node->book['link_title'] = $values['title'];
           $node->setNewRevision();
           $node->save();
-          watchdog('content', 'book: updated %title.', array('%title' => $node->label()), WATCHDOG_NOTICE, l($this->t('View'), 'node/' . $node->id()));
+          $this->logger->notice('book: updated %title.', array('%title' => $node->label(), 'link' => l($this->t('View'), 'node/' . $node->id())));
         }
       }
     }
diff --git a/core/modules/comment/lib/Drupal/comment/CommentForm.php b/core/modules/comment/lib/Drupal/comment/CommentForm.php
index 6fd7ff6..7c961ef 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentForm.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentForm.php
@@ -16,6 +16,7 @@
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Session\AccountInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -31,12 +32,20 @@ class CommentForm extends ContentEntityForm {
   protected $currentUser;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * {@inheritdoc}
    */
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager'),
-      $container->get('current_user')
+      $container->get('current_user'),
+      $container->get('logger.factory')->get('content')
     );
   }
 
@@ -49,10 +58,13 @@ public static function create(ContainerInterface $container) {
    *   The field info service.
    * @param \Drupal\Core\Session\AccountInterface $current_user
    *   The current user.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityManagerInterface $entity_manager, AccountInterface $current_user) {
+  public function __construct(EntityManagerInterface $entity_manager, AccountInterface $current_user, LoggerInterface $logger) {
     parent::__construct($entity_manager);
     $this->currentUser = $current_user;
+    $this->logger = $logger;
   }
 
   /**
@@ -380,8 +392,8 @@ public function save(array $form, array &$form_state) {
       $comment->save();
       $form_state['values']['cid'] = $comment->id();
 
-      // Add an entry to the watchdog log.
-      watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->getSubject()), WATCHDOG_NOTICE, l(t('View'), 'comment/' . $comment->id(), array('fragment' => 'comment-' . $comment->id())));
+      // Add a log entry.
+      $this->logger->notice('Comment posted: %subject.', array('%subject' => $comment->getSubject(), 'link' => l(t('View'), 'comment/' . $comment->id(), array('fragment' => 'comment-' . $comment->id()))));
 
       // Explain the approval queue if necessary.
       if (!$comment->isPublished()) {
@@ -404,7 +416,7 @@ public function save(array $form, array &$form_state) {
       $uri->setOption('fragment', 'comment-' . $comment->id());
     }
     else {
-      watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->getSubject()), WATCHDOG_WARNING);
+      $this->logger->warning('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->getSubject()));
       drupal_set_message($this->t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->getSubject())), 'error');
       // Redirect the user to the entity they are commenting on.
     }
diff --git a/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php b/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php
index 4598bd0..fa2ee93 100644
--- a/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php
+++ b/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php
@@ -11,6 +11,7 @@
 use Drupal\Component\Utility\String;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Form\ConfirmFormBase;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -33,13 +34,23 @@ class ConfirmDeleteMultiple extends ConfirmFormBase {
   protected $comments;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Creates an new ConfirmDeleteMultiple form.
    *
    * @param \Drupal\comment\CommentStorageInterface $comment_storage
    *   The comment storage.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(CommentStorageInterface $comment_storage) {
+  public function __construct(CommentStorageInterface $comment_storage, LoggerInterface $logger) {
     $this->commentStorage = $comment_storage;
+    $this->logger = $logger;
   }
 
   /**
@@ -47,7 +58,8 @@ public function __construct(CommentStorageInterface $comment_storage) {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('entity.manager')->getStorage('comment')
+      $container->get('entity.manager')->getStorage('comment'),
+      $container->get('logger.factory')->get('content')
     );
   }
 
@@ -123,7 +135,7 @@ public function submitForm(array &$form, array &$form_state) {
       $this->commentStorage->delete($this->comments);
       Cache::invalidateTags(array('content' => TRUE));
       $count = count($form_state['values']['comments']);
-      watchdog('content', 'Deleted @count comments.', array('@count' => $count));
+      $this->logger->notice('Deleted @count comments.', array('@count' => $count));
       drupal_set_message(format_plural($count, 'Deleted 1 comment.', 'Deleted @count comments.'));
     }
     $form_state['redirect_route']['route_name'] = 'comment.admin';
diff --git a/core/modules/comment/lib/Drupal/comment/Form/DeleteForm.php b/core/modules/comment/lib/Drupal/comment/Form/DeleteForm.php
index 1775513..5d86691 100644
--- a/core/modules/comment/lib/Drupal/comment/Form/DeleteForm.php
+++ b/core/modules/comment/lib/Drupal/comment/Form/DeleteForm.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Entity\ContentEntityConfirmFormBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides the comment delete confirmation form.
@@ -16,6 +18,32 @@
 class DeleteForm extends ContentEntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new DeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('content')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -51,7 +79,7 @@ public function submit(array $form, array &$form_state) {
     // Delete the comment and its replies.
     $this->entity->delete();
     drupal_set_message($this->t('The comment and all its replies have been deleted.'));
-    watchdog('content', 'Deleted comment @cid and its replies.', array('@cid' => $this->entity->id()));
+    $this->logger->notice('Deleted comment @cid and its replies.', array('@cid' => $this->entity->id()));
     // Clear the cache so an anonymous user sees that his comment was deleted.
     Cache::invalidateTags(array('content' => TRUE));
 
diff --git a/core/modules/config/lib/Drupal/config/Form/ConfigSync.php b/core/modules/config/lib/Drupal/config/Form/ConfigSync.php
index b76e690..3036640 100644
--- a/core/modules/config/lib/Drupal/config/Form/ConfigSync.php
+++ b/core/modules/config/lib/Drupal/config/Form/ConfigSync.php
@@ -20,6 +20,7 @@
 use Drupal\Core\Config\StorageComparer;
 use Drupal\Core\Config\TypedConfigManager;
 use Drupal\Core\Routing\UrlGeneratorInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -92,6 +93,13 @@ class ConfigSync extends FormBase {
   protected $themeHandler;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs the object.
    *
    * @param \Drupal\Core\Config\StorageInterface $sourceStorage
@@ -112,8 +120,10 @@ class ConfigSync extends FormBase {
    *   The module handler
    * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
    *   The theme handler
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(StorageInterface $sourceStorage, StorageInterface $targetStorage, LockBackendInterface $lock, EventDispatcherInterface $event_dispatcher, ConfigManagerInterface $config_manager, UrlGeneratorInterface $url_generator, TypedConfigManager $typed_config, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler) {
+  public function __construct(StorageInterface $sourceStorage, StorageInterface $targetStorage, LockBackendInterface $lock, EventDispatcherInterface $event_dispatcher, ConfigManagerInterface $config_manager, UrlGeneratorInterface $url_generator, TypedConfigManager $typed_config, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler, LoggerInterface $logger) {
     $this->sourceStorage = $sourceStorage;
     $this->targetStorage = $targetStorage;
     $this->lock = $lock;
@@ -123,6 +133,7 @@ public function __construct(StorageInterface $sourceStorage, StorageInterface $t
     $this->typedConfigManager = $typed_config;
     $this->moduleHandler = $module_handler;
     $this->themeHandler = $theme_handler;
+    $this->logger = $logger;
   }
 
   /**
@@ -138,7 +149,8 @@ public static function create(ContainerInterface $container) {
       $container->get('url_generator'),
       $container->get('config.typed'),
       $container->get('module_handler'),
-      $container->get('theme_handler')
+      $container->get('theme_handler'),
+      $container->get('logger.factory')->get('config_sync')
     );
   }
 
@@ -348,7 +360,7 @@ public static function finishBatch($success, $results, $operations) {
       if (!empty($results['errors'])) {
         foreach ($results['errors'] as $error) {
           drupal_set_message($error, 'error');
-          watchdog('config_sync', $error, array(), WATCHDOG_ERROR);
+          $this->logger->error($error);
         }
         drupal_set_message(\Drupal::translation()->translate('The configuration was imported with errors.'), 'warning');
       }
diff --git a/core/modules/contact/lib/Drupal/contact/CategoryForm.php b/core/modules/contact/lib/Drupal/contact/CategoryForm.php
index 14c893d..a5835bb 100644
--- a/core/modules/contact/lib/Drupal/contact/CategoryForm.php
+++ b/core/modules/contact/lib/Drupal/contact/CategoryForm.php
@@ -103,11 +103,11 @@ public function save(array $form, array &$form_state) {
 
     if ($status == SAVED_UPDATED) {
       drupal_set_message(t('Category %label has been updated.', array('%label' => $category->label())));
-      watchdog('contact', 'Category %label has been updated.', array('%label' => $category->label()), WATCHDOG_NOTICE, $edit_link);
+      \Drupal::logger('contact')->notice('Category %label has been updated.', array('%label' => $category->label(), 'link' => $edit_link));
     }
     else {
       drupal_set_message(t('Category %label has been added.', array('%label' => $category->label())));
-      watchdog('contact', 'Category %label has been added.', array('%label' => $category->label()), WATCHDOG_NOTICE, $edit_link);
+      \Drupal::logger('contact')->notice('Category %label has been added.', array('%label' => $category->label(), 'link' => $edit_link));
     }
 
     // Update the default category.
diff --git a/core/modules/contact/lib/Drupal/contact/Form/CategoryDeleteForm.php b/core/modules/contact/lib/Drupal/contact/Form/CategoryDeleteForm.php
index dac498e..7ec36af 100644
--- a/core/modules/contact/lib/Drupal/contact/Form/CategoryDeleteForm.php
+++ b/core/modules/contact/lib/Drupal/contact/Form/CategoryDeleteForm.php
@@ -8,6 +8,8 @@
 namespace Drupal\contact\Form;
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Builds the form to delete a contact category.
@@ -15,6 +17,32 @@
 class CategoryDeleteForm extends EntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new ActionDeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('contact')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -43,7 +71,7 @@ public function getConfirmText() {
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
     drupal_set_message(t('Category %label has been deleted.', array('%label' => $this->entity->label())));
-    watchdog('contact', 'Category %label has been deleted.', array('%label' => $this->entity->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('Category %label has been deleted.', array('%label' => $this->entity->label()));
     $form_state['redirect_route']['route_name'] = 'contact.category_list';
   }
 
diff --git a/core/modules/contact/lib/Drupal/contact/MessageForm.php b/core/modules/contact/lib/Drupal/contact/MessageForm.php
index 401291e..5d8b75c 100644
--- a/core/modules/contact/lib/Drupal/contact/MessageForm.php
+++ b/core/modules/contact/lib/Drupal/contact/MessageForm.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Flood\FloodInterface;
 use Drupal\Core\Language\Language;
 use Drupal\user\UserInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -35,17 +36,27 @@ class MessageForm extends ContentEntityForm {
   protected $flood;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a MessageForm object.
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
    * @param \Drupal\Core\Flood\FloodInterface $flood
    *   The flood control mechanism.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityManagerInterface $entity_manager, FloodInterface $flood) {
+  public function __construct(EntityManagerInterface $entity_manager, FloodInterface $flood, LoggerInterface $logger) {
     parent::__construct($entity_manager);
 
     $this->flood = $flood;
+    $this->logger = $logger;
   }
 
   /**
@@ -54,7 +65,8 @@ public function __construct(EntityManagerInterface $entity_manager, FloodInterfa
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager'),
-      $container->get('flood')
+      $container->get('flood'),
+      $container->get('logger.factory')->get('contact')
     );
   }
 
@@ -231,14 +243,14 @@ public function save(array $form, array &$form_state) {
     $config = $this->config('contact.settings');
     $this->flood->register('contact', $config->get('flood.interval'));
     if (!$message->isPersonal()) {
-      watchdog('contact', '%sender-name (@sender-from) sent an e-mail regarding %category.', array(
+      $this->logger->notice('%sender-name (@sender-from) sent an e-mail regarding %category.', array(
         '%sender-name' => $sender->getUsername(),
         '@sender-from' => $sender->getEmail(),
         '%category' => $category->label(),
       ));
     }
     else {
-      watchdog('contact', '%sender-name (@sender-from) sent %recipient-name an e-mail.', array(
+      $this->logger->notice('%sender-name (@sender-from) sent %recipient-name an e-mail.', array(
         '%sender-name' => $sender->getUsername(),
         '@sender-from' => $sender->getEmail(),
         '%recipient-name' => $message->getPersonalRecipient()->getUsername(),
diff --git a/core/modules/dblog/lib/Drupal/dblog/Tests/Views/ViewsIntegrationTest.php b/core/modules/dblog/lib/Drupal/dblog/Tests/Views/ViewsIntegrationTest.php
index 818cfd3..67a6679 100644
--- a/core/modules/dblog/lib/Drupal/dblog/Tests/Views/ViewsIntegrationTest.php
+++ b/core/modules/dblog/lib/Drupal/dblog/Tests/Views/ViewsIntegrationTest.php
@@ -64,29 +64,31 @@ public function testIntegration() {
     // Setup a watchdog entry without tokens.
     $entries[] = array(
       'message' => $this->randomName(),
-      'variables' => array(),
-      'link' => l('Link', 'node/1'),
+      'variables' => array('link' => l('Link', 'node/1')),
     );
     // Setup a watchdog entry with one token.
     $entries[] = array(
       'message' => '@token1',
-      'variables' => array('@token1' => $this->randomName()),
-      'link' => l('Link', 'node/2'),
+      'variables' => array('@token1' => $this->randomName(), 'link' => l('Link', 'node/2')),
     );
     // Setup a watchdog entry with two tokens.
     $entries[] = array(
       'message' => '@token1 !token2',
-      'variables' => array('@token1' => $this->randomName(), '!token2' => $this->randomName()),
       // Setup a link with a tag which is filtered by
       // \Drupal\Component\Utility\Xss::filterAdmin().
-      'link' => l('<object>Link</object>', 'node/2', array('html' => TRUE)),
+      'variables' => array(
+        '@token1' => $this->randomName(),
+        '!token2' => $this->randomName(),
+        'link' => l('<object>Link</object>', 'node/2', array('html' => TRUE)),
+      ),
     );
+    $logger_factory = $this->container->get('logger.factory');
     foreach ($entries as $entry) {
       $entry += array(
         'type' => 'test-views',
         'severity' => WATCHDOG_NOTICE,
       );
-      watchdog($entry['type'], $entry['message'], $entry['variables'], $entry['severity'], $entry['link']);
+      $logger_factory->get($entry['type'])->log($entry['severity'], $entry['message'], $entry['variables']);
     }
 
     $view = Views::getView('test_dblog');
@@ -95,7 +97,7 @@ public function testIntegration() {
 
     foreach ($entries as $index => $entry) {
       $this->assertEqual($view->style_plugin->getField($index, 'message'), String::format($entry['message'], $entry['variables']));
-      $this->assertEqual($view->style_plugin->getField($index, 'link'), Xss::filterAdmin($entry['link']));
+      $this->assertEqual($view->style_plugin->getField($index, 'link'), Xss::filterAdmin($entry['variables']['link']));
     }
 
     // Disable replacing variables and check that the tokens aren't replaced.
diff --git a/core/modules/file/file.api.php b/core/modules/file/file.api.php
index 760f7f9..670569d 100644
--- a/core/modules/file/file.api.php
+++ b/core/modules/file/file.api.php
@@ -99,7 +99,7 @@ function hook_file_insert(Drupal\file\FileInterface $file) {
   // Add a message to the log, if the file is a jpg
   $validate = file_validate_extensions($file, 'jpg');
   if (empty($validate)) {
-    watchdog('file', 'A jpg has been added.');
+    \Drupal::logger('file')->notice('A jpg has been added.');
   }
 }
 
@@ -118,7 +118,7 @@ function hook_file_update(Drupal\file\FileInterface $file) {
     $file->setFilename($file->getOwner()->name . '_' . $file->getFilename());
     $file->save();
 
-    watchdog('file', t('%source has been renamed to %destination', array('%source' => $old_filename, '%destination' => $file->getFilename())));
+    \Drupal::logger('file')->notice(t('%source has been renamed to %destination', array('%source' => $old_filename, '%destination' => $file->getFilename())));
   }
 }
 
@@ -138,7 +138,7 @@ function hook_file_copy(Drupal\file\FileInterface $file, Drupal\file\FileInterfa
     $file->setFilename($file->getOwner()->name . '_' . $file->getFilename());
     $file->save();
 
-    watchdog('file', t('Copied file %source has been renamed to %destination', array('%source' => $source->filename, '%destination' => $file->getFilename())));
+    \Drupal::logger('file')->notice(t('Copied file %source has been renamed to %destination', array('%source' => $source->filename, '%destination' => $file->getFilename())));
   }
 }
 
@@ -158,7 +158,7 @@ function hook_file_move(Drupal\file\FileInterface $file, Drupal\file\FileInterfa
     $file->setFilename($file->getOwner()->name . '_' . $file->getFilename());
     $file->save();
 
-    watchdog('file', t('Moved file %source has been renamed to %destination', array('%source' => $source->filename, '%destination' => $file->getFilename())));
+    \Drupal::logger('file')->notice(t('Moved file %source has been renamed to %destination', array('%source' => $source->filename, '%destination' => $file->getFilename())));
   }
 }
 
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index 47b72ef..b1e67c9 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -173,10 +173,10 @@ function file_usage() {
 function file_copy(File $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
   if (!file_valid_uri($destination)) {
     if (($realpath = drupal_realpath($source->getFileUri())) !== FALSE) {
-      watchdog('file', 'File %file (%realpath) could not be copied because the destination %destination is invalid. This is often caused by improper use of file_copy() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%realpath' => $realpath, '%destination' => $destination));
+      \Drupal::logger('file')->notice('File %file (%realpath) could not be copied because the destination %destination is invalid. This is often caused by improper use of file_copy() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%realpath' => $realpath, '%destination' => $destination));
     }
     else {
-      watchdog('file', 'File %file could not be copied because the destination %destination is invalid. This is often caused by improper use of file_copy() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%destination' => $destination));
+      \Drupal::logger('file')->notice('File %file could not be copied because the destination %destination is invalid. This is often caused by improper use of file_copy() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%destination' => $destination));
     }
     drupal_set_message(t('The specified file %file could not be copied because the destination is invalid. More information is available in the system log.', array('%file' => $source->getFileUri())), 'error');
     return FALSE;
@@ -250,10 +250,10 @@ function file_copy(File $source, $destination = NULL, $replace = FILE_EXISTS_REN
 function file_move(File $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
   if (!file_valid_uri($destination)) {
     if (($realpath = drupal_realpath($source->getFileUri())) !== FALSE) {
-      watchdog('file', 'File %file (%realpath) could not be moved because the destination %destination is invalid. This may be caused by improper use of file_move() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%realpath' => $realpath, '%destination' => $destination));
+      \Drupal::logger('file')->notice('File %file (%realpath) could not be moved because the destination %destination is invalid. This may be caused by improper use of file_move() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%realpath' => $realpath, '%destination' => $destination));
     }
     else {
-      watchdog('file', 'File %file could not be moved because the destination %destination is invalid. This may be caused by improper use of file_move() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%destination' => $destination));
+      \Drupal::logger('file')->notice('File %file could not be moved because the destination %destination is invalid. This may be caused by improper use of file_move() or a missing stream wrapper.', array('%file' => $source->getFileUri(), '%destination' => $destination));
     }
     drupal_set_message(t('The specified file %file could not be moved because the destination is invalid. More information is available in the system log.', array('%file' => $source->getFileUri())), 'error');
     return FALSE;
@@ -525,7 +525,7 @@ function file_save_data($data, $destination = NULL, $replace = FILE_EXISTS_RENAM
     $destination = file_default_scheme() . '://';
   }
   if (!file_valid_uri($destination)) {
-    watchdog('file', 'The data could not be saved because the destination %destination is invalid. This may be caused by improper use of file_save_data() or a missing stream wrapper.', array('%destination' => $destination));
+    \Drupal::logger('file')->notice('The data could not be saved because the destination %destination is invalid. This may be caused by improper use of file_save_data() or a missing stream wrapper.', array('%destination' => $destination));
     drupal_set_message(t('The data could not be saved because the destination is invalid. More information is available in the system log.'), 'error');
     return FALSE;
   }
@@ -733,11 +733,11 @@ function file_cron() {
           $file->delete();
         }
         else {
-          watchdog('file system', 'Could not delete temporary file "%path" during garbage collection', array('%path' => $file->getFileUri()), WATCHDOG_ERROR);
+          \Drupal::logger('file system')->error('Could not delete temporary file "%path" during garbage collection', array('%path' => $file->getFileUri()));
         }
       }
       else {
-        watchdog('file system', 'Did not delete temporary file "%path" during garbage collection because it is in use by the following modules: %modules.', array('%path' => $file->getFileUri(), '%modules' => implode(', ', array_keys($references))), WATCHDOG_INFO);
+        \Drupal::logger('file system')->info('Did not delete temporary file "%path" during garbage collection because it is in use by the following modules: %modules.', array('%path' => $file->getFileUri(), '%modules' => implode(', ', array_keys($references))));
       }
     }
   }
@@ -959,7 +959,7 @@ function file_save_upload($form_field_name, $validators = array(), $destination
     $file->uri = $file->destination;
     if (!drupal_move_uploaded_file($file_info->getRealPath(), $file->getFileUri())) {
       drupal_set_message(t('File upload error. Could not move uploaded file.'), 'error');
-      watchdog('file', 'Upload error. Could not move uploaded file %file to destination %destination.', array('%file' => $file->filename, '%destination' => $file->uri));
+      \Drupal::logger('file')->notice('Upload error. Could not move uploaded file %file to destination %destination.', array('%file' => $file->filename, '%destination' => $file->uri));
       $files[$i] = FALSE;
       continue;
     }
@@ -1511,7 +1511,7 @@ function file_managed_file_save_upload($element, array &$form_state) {
 
   $destination = isset($element['#upload_location']) ? $element['#upload_location'] : NULL;
   if (isset($destination) && !file_prepare_directory($destination, FILE_CREATE_DIRECTORY)) {
-    watchdog('file', 'The upload directory %directory for the file field !name could not be created or is not accessible. A newly uploaded file could not be saved in this directory as a consequence, and the upload was canceled.', array('%directory' => $destination, '!name' => $element['#field_name']));
+    \Drupal::logger('file')->notice('The upload directory %directory for the file field !name could not be created or is not accessible. A newly uploaded file could not be saved in this directory as a consequence, and the upload was canceled.', array('%directory' => $destination, '!name' => $element['#field_name']));
     form_set_error($upload_name, $form_state, t('The file could not be uploaded.'));
     return FALSE;
   }
@@ -1521,7 +1521,7 @@ function file_managed_file_save_upload($element, array &$form_state) {
   $files_uploaded |= !$element['#multiple'] && !empty($file_upload);
   if ($files_uploaded) {
     if (!$files = file_save_upload($upload_name, $element['#upload_validators'], $destination)) {
-      watchdog('file', 'The file upload failed. %upload', array('%upload' => $upload_name));
+      \Drupal::logger('file')->notice('The file upload failed. %upload', array('%upload' => $upload_name));
       form_set_error($upload_name, $form_state, t('Files in the !name field were unable to be uploaded.', array('!name' => $element['#title'])));
       return array();
     }
diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index 3efe9ad..7b596ac 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -358,7 +358,7 @@ function check_markup($text, $format_id = NULL, $langcode = '', $cache = FALSE,
   }
   // If the requested text format does not exist, the text cannot be filtered.
   if (!$format = entity_load('filter_format', $format_id)) {
-    watchdog('filter', 'Missing text format: %format.', array('%format' => $format_id), WATCHDOG_ALERT);
+    \Drupal::logger('filter')->alert('Missing text format: %format.', array('%format' => $format_id));
     return '';
   }
 
diff --git a/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterNull.php b/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterNull.php
index d4fbe62..9870077 100644
--- a/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterNull.php
+++ b/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterNull.php
@@ -39,7 +39,7 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
     // Once per filter, log that a filter plugin was missing.
     if (!$this->logged) {
       $this->logged = TRUE;
-      watchdog('filter', 'Missing filter plugin: %filter.', array('%filter' => $plugin_id), WATCHDOG_ALERT);
+      \Drupal::logger('filter')->alert('Missing filter plugin: %filter.', array('%filter' => $plugin_id));
     }
     parent::__construct($configuration, $plugin_id, $plugin_definition);
   }
diff --git a/core/modules/forum/lib/Drupal/forum/Form/DeleteForm.php b/core/modules/forum/lib/Drupal/forum/Form/DeleteForm.php
index 081919d..b692774 100644
--- a/core/modules/forum/lib/Drupal/forum/Form/DeleteForm.php
+++ b/core/modules/forum/lib/Drupal/forum/Form/DeleteForm.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\taxonomy\TermInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Builds the form to delete a forum term.
@@ -16,6 +18,32 @@
 class DeleteForm extends ConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new DeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('forum')
+    );
+  }
+
+  /**
    * The taxonomy term being deleted.
    *
    * @var \Drupal\taxonomy\TermInterface
@@ -67,7 +95,7 @@ public function buildForm(array $form, array &$form_state, TermInterface $taxono
   public function submitForm(array &$form, array &$form_state) {
     $this->taxonomyTerm->delete();
     drupal_set_message($this->t('The forum %label and all sub-forums have been deleted.', array('%label' => $this->taxonomyTerm->label())));
-    watchdog('forum', 'forum: deleted %label and all its sub-forums.', array('%label' => $this->taxonomyTerm->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('forum: deleted %label and all its sub-forums.', array('%label' => $this->taxonomyTerm->label()));
     $form_state['redirect_route']['route_name'] = 'forum.overview';
   }
 
diff --git a/core/modules/forum/lib/Drupal/forum/Form/ForumForm.php b/core/modules/forum/lib/Drupal/forum/Form/ForumForm.php
index 3592001..2ffe7f6 100644
--- a/core/modules/forum/lib/Drupal/forum/Form/ForumForm.php
+++ b/core/modules/forum/lib/Drupal/forum/Form/ForumForm.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Cache\Cache;
 use Drupal\taxonomy\TermForm;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Base form for forum term edit forms.
@@ -16,6 +18,32 @@
 class ForumForm extends TermForm {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new ForumForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('forum')
+    );
+  }
+
+  /**
    * Reusable type field to use in status messages.
    *
    * @var string
@@ -82,13 +110,13 @@ public function save(array $form, array &$form_state) {
     switch ($status) {
       case SAVED_NEW:
         drupal_set_message($this->t('Created new @type %term.', array('%term' => $term->getName(), '@type' => $this->forumFormType)));
-        watchdog('forum', 'Created new @type %term.', array('%term' => $term->getName(), '@type' => $this->forumFormType), WATCHDOG_NOTICE, l($this->t('Edit'), 'admin/structure/forum/edit/' . $this->urlStub . '/' . $term->id()));
+        $this->logger->notice('Created new @type %term.', array('%term' => $term->getName(), '@type' => $this->forumFormType, 'link' => l($this->t('Edit'), 'admin/structure/forum/edit/' . $this->urlStub . '/' . $term->id())));
         $form_state['values']['tid'] = $term->id();
         break;
 
       case SAVED_UPDATED:
         drupal_set_message($this->t('The @type %term has been updated.', array('%term' => $term->getName(), '@type' => $this->forumFormType)));
-        watchdog('taxonomy', 'Updated @type %term.', array('%term' => $term->getName(), '@type' => $this->forumFormType), WATCHDOG_NOTICE, l($this->t('Edit'), 'admin/structure/forum/edit/' . $this->urlStub . '/' . $term->id()));
+        $this->logger->notice('Updated @type %term.', array('%term' => $term->getName(), '@type' => $this->forumFormType, 'link' => l($this->t('Edit'), 'admin/structure/forum/edit/' . $this->urlStub . '/' . $term->id())));
         // Clear the page and block caches to avoid stale data.
         Cache::invalidateTags(array('content' => TRUE));
         break;
diff --git a/core/modules/image/lib/Drupal/image/Controller/ImageStyleDownloadController.php b/core/modules/image/lib/Drupal/image/Controller/ImageStyleDownloadController.php
index 191a6c7..a18c677 100644
--- a/core/modules/image/lib/Drupal/image/Controller/ImageStyleDownloadController.php
+++ b/core/modules/image/lib/Drupal/image/Controller/ImageStyleDownloadController.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Lock\LockBackendInterface;
 use Drupal\image\ImageStyleInterface;
 use Drupal\system\FileDownloadController;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\BinaryFileResponse;
 use Symfony\Component\HttpFoundation\Request;
@@ -39,16 +40,26 @@ class ImageStyleDownloadController extends FileDownloadController {
   protected $imageFactory;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a ImageStyleDownloadController object.
    *
    * @param \Drupal\Core\Lock\LockBackendInterface $lock
    *   The lock backend.
    * @param \Drupal\Core\Image\ImageFactory $image_factory
    *   The image factory.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(LockBackendInterface $lock, ImageFactory $image_factory) {
+  public function __construct(LockBackendInterface $lock, ImageFactory $image_factory, LoggerInterface $logger) {
     $this->lock = $lock;
     $this->imageFactory = $image_factory;
+    $this->logger = $logger;
   }
 
   /**
@@ -57,7 +68,8 @@ public function __construct(LockBackendInterface $lock, ImageFactory $image_fact
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('lock'),
-      $container->get('image.factory')
+      $container->get('image.factory'),
+      $container->get('logger.factory')->get('image')
     );
   }
 
@@ -118,7 +130,7 @@ public function deliver(Request $request, $scheme, ImageStyleInterface $image_st
 
     // Don't try to generate file if source is missing.
     if (!file_exists($image_uri)) {
-      watchdog('image', 'Source image at %source_image_path not found while trying to generate derivative image at %derivative_path.',  array('%source_image_path' => $image_uri, '%derivative_path' => $derivative_uri));
+      $this->logger->notice('Source image at %source_image_path not found while trying to generate derivative image at %derivative_path.',  array('%source_image_path' => $image_uri, '%derivative_path' => $derivative_uri));
       return new Response($this->t('Error generating image, missing source file.'), 404);
     }
 
@@ -152,7 +164,7 @@ public function deliver(Request $request, $scheme, ImageStyleInterface $image_st
       return new BinaryFileResponse($uri, 200, $headers);
     }
     else {
-      watchdog('image', 'Unable to generate the derived image located at %path.', array('%path' => $derivative_uri));
+      $this->logger->notice('Unable to generate the derived image located at %path.', array('%path' => $derivative_uri));
       return new Response($this->t('Error generating image.'), 500);
     }
   }
diff --git a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
index 4eaa2ec..1573a16 100644
--- a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
+++ b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
@@ -277,7 +277,7 @@ public function createDerivative($original_uri, $derivative_uri) {
 
     // Build the destination folder tree if it doesn't already exist.
     if (!file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
-      watchdog('image', 'Failed to create style directory: %directory', array('%directory' => $directory), WATCHDOG_ERROR);
+      \Drupal::logger('image')->error('Failed to create style directory: %directory', array('%directory' => $directory));
       return FALSE;
     }
 
@@ -292,7 +292,7 @@ public function createDerivative($original_uri, $derivative_uri) {
 
     if (!$image->save($derivative_uri)) {
       if (file_exists($derivative_uri)) {
-        watchdog('image', 'Cached image file %destination already exists. There may be an issue with your rewrite configuration.', array('%destination' => $derivative_uri), WATCHDOG_ERROR);
+        \Drupal::logger('image')->error('Cached image file %destination already exists. There may be an issue with your rewrite configuration.', array('%destination' => $derivative_uri));
       }
       return FALSE;
     }
diff --git a/core/modules/image/lib/Drupal/image/ImageEffectBase.php b/core/modules/image/lib/Drupal/image/ImageEffectBase.php
index ea3208a..75a7d92 100644
--- a/core/modules/image/lib/Drupal/image/ImageEffectBase.php
+++ b/core/modules/image/lib/Drupal/image/ImageEffectBase.php
@@ -7,12 +7,15 @@
 
 namespace Drupal\image;
 
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a base class for image effects.
  */
-abstract class ImageEffectBase extends PluginBase implements ImageEffectInterface {
+abstract class ImageEffectBase extends PluginBase implements ImageEffectInterface, ContainerFactoryPluginInterface {
 
   /**
    * The image effect ID.
@@ -29,12 +32,32 @@
   protected $weight = '';
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * {@inheritdoc}
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerInterface $logger) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     $this->setConfiguration($configuration);
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('logger.factory')->get('image')
+    );
   }
 
   /**
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php
index 8b1857b..f967187 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php
@@ -28,7 +28,7 @@ public function applyEffect(ImageInterface $image) {
     $x = image_filter_keyword($x, $image->getWidth(), $this->configuration['width']);
     $y = image_filter_keyword($y, $image->getHeight(), $this->configuration['height']);
     if (!$image->crop($x, $y, $this->configuration['width'], $this->configuration['height'])) {
-      watchdog('image', 'Image crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
+      $this->logger->error('Image crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()));
       return FALSE;
     }
     return TRUE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php
index 4d899c6..97d31d8 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php
@@ -32,7 +32,7 @@ public function transformDimensions(array &$dimensions) {
    */
   public function applyEffect(ImageInterface $image) {
     if (!$image->desaturate()) {
-      watchdog('image', 'Image desaturate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
+      $this->logger->error('Image desaturate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()));
       return FALSE;
     }
     return TRUE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php
index da9b176..7056d36 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php
@@ -27,7 +27,7 @@ class ResizeImageEffect extends ImageEffectBase implements ConfigurableImageEffe
    */
   public function applyEffect(ImageInterface $image) {
     if (!$image->resize($this->configuration['width'], $this->configuration['height'])) {
-      watchdog('image', 'Image resize failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
+      $this->logger->error('Image resize failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()));
       return FALSE;
     }
     return TRUE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php
index b0e6bf3..5af65bc 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php
@@ -46,7 +46,7 @@ public function applyEffect(ImageInterface $image) {
     }
 
     if (!$image->rotate($this->configuration['degrees'], $this->configuration['bgcolor'])) {
-      watchdog('image', 'Image rotate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
+      $this->logger->error('Image rotate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()));
       return FALSE;
     }
     return TRUE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php
index 7fed9b1..ca9479f 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php
@@ -25,7 +25,7 @@ class ScaleAndCropImageEffect extends ResizeImageEffect {
    */
   public function applyEffect(ImageInterface $image) {
     if (!$image->scaleAndCrop($this->configuration['width'], $this->configuration['height'])) {
-      watchdog('image', 'Image scale and crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
+      $this->logger->error('Image scale and crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()));
       return FALSE;
     }
     return TRUE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php
index 4316bd0..53be1dd 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php
@@ -26,7 +26,7 @@ class ScaleImageEffect extends ResizeImageEffect {
    */
   public function applyEffect(ImageInterface $image) {
     if (!$image->scale($this->configuration['width'], $this->configuration['height'], $this->configuration['upscale'])) {
-      watchdog('image', 'Image scale failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
+      $this->logger->error('Image scale failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()));
       return FALSE;
     }
     return TRUE;
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index f35da4d..ab1e147 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -441,10 +441,10 @@ function language_save($language) {
   $language_entity->save();
   $t_args = array('%language' => $language->name, '%langcode' => $language->id);
   if ($language->is_new) {
-    watchdog('language', 'The %language (%langcode) language has been created.', $t_args);
+    \Drupal::logger('language')->notice('The %language (%langcode) language has been created.', $t_args);
   }
   else {
-    watchdog('language', 'The %language (%langcode) language has been updated.', $t_args);
+    \Drupal::logger('language')->notice('The %language (%langcode) language has been updated.', $t_args);
   }
 
   return $language;
@@ -480,7 +480,7 @@ function language_delete($langcode) {
     }
 
     $t_args = array('%language' => $language->name, '%langcode' => $language->id);
-    watchdog('language', 'The %language (%langcode) language has been removed.', $t_args);
+    \Drupal::logger('language')->notice('The %language (%langcode) language has been removed.', $t_args);
     return TRUE;
   }
   return FALSE;
diff --git a/core/modules/locale/lib/Drupal/locale/Form/TranslateEditForm.php b/core/modules/locale/lib/Drupal/locale/Form/TranslateEditForm.php
index c846026..e4716e8 100644
--- a/core/modules/locale/lib/Drupal/locale/Form/TranslateEditForm.php
+++ b/core/modules/locale/lib/Drupal/locale/Form/TranslateEditForm.php
@@ -9,7 +9,12 @@
 
 use Drupal\Component\Utility\String;
 use Drupal\Core\Render\Element;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\State\StateInterface;
 use Drupal\locale\SourceString;
+use Drupal\locale\StringStorageInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines a translation edit form.
@@ -17,6 +22,42 @@
 class TranslateEditForm extends TranslateFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new TranslateEditForm object.
+   *
+   * @param \Drupal\locale\StringStorageInterface $locale_storage
+   *   The locale storage.
+   * @param \Drupal\Core\State\StateInterface $state
+   *   The state service.
+   * @param \Drupal\Core\Language\LanguageManager $language_manager
+   *   The language manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(StringStorageInterface $locale_storage, StateInterface $state, LanguageManager $language_manager, LoggerInterface $logger) {
+    parent::__construct($locale_storage, $state, $language_manager);
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('locale.storage'),
+      $container->get('state'),
+      $container->get('language_manager'),
+      $container->get('logger.factory')->get('locale')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getFormId() {
@@ -165,7 +206,7 @@ public function validateForm(array &$form, array &$form_state) {
         if (!locale_string_is_safe($value)) {
           $this->setFormError("strings][$lid][translations][$key", $form_state, $this->t('The submitted string contains disallowed HTML: %string', array('%string' => $value)));
           $this->setFormError("translations][$langcode][$key", $form_state, $this->t('The submitted string contains disallowed HTML: %string', array('%string' => $value)));
-          watchdog('locale', 'Attempted submission of a translation string with disallowed HTML: %string', array('%string' => $value), WATCHDOG_WARNING);
+          $this->logger->warning('Attempted submission of a translation string with disallowed HTML: %string', array('%string' => $value));
         }
       }
     }
diff --git a/core/modules/locale/lib/Drupal/locale/PoDatabaseWriter.php b/core/modules/locale/lib/Drupal/locale/PoDatabaseWriter.php
index cdcb0c0..e095c13 100644
--- a/core/modules/locale/lib/Drupal/locale/PoDatabaseWriter.php
+++ b/core/modules/locale/lib/Drupal/locale/PoDatabaseWriter.php
@@ -238,7 +238,7 @@ private function importString(PoItem $item) {
     if (!empty($translation)) {
       // Skip this string unless it passes a check for dangerous code.
       if (!locale_string_is_safe($translation)) {
-        watchdog('locale', 'Import of string "%string" was skipped because of disallowed or malformed HTML.', array('%string' => $translation), WATCHDOG_ERROR);
+        \Drupal::logger('locale')->error('Import of string "%string" was skipped because of disallowed or malformed HTML.', array('%string' => $translation));
         $this->_report['skips']++;
         return 0;
       }
diff --git a/core/modules/locale/locale.batch.inc b/core/modules/locale/locale.batch.inc
index 4e56890..f2e7330 100644
--- a/core/modules/locale/locale.batch.inc
+++ b/core/modules/locale/locale.batch.inc
@@ -228,7 +228,7 @@ function locale_translation_batch_fetch_finished($success, $results) {
  *   TRUE if the file is not found. FALSE if a fault occurred.
  */
 function locale_translation_http_check($uri) {
-
+  $logger = \Drupal::logger('locale');
   try {
     $response = \Drupal::httpClient()->head($uri);
     $result = array();
@@ -250,10 +250,10 @@ function locale_translation_http_check($uri) {
       // theme does not define the location of a translation file. By default
       // the file is checked at the translation server, but it will not be
       // found there.
-      watchdog('locale', 'Translation file not found: @uri.', array('@uri' => $uri));
+      $logger->notice('Translation file not found: @uri.', array('@uri' => $uri));
       return TRUE;
     }
-    watchdog('locale', 'HTTP request to @url failed with error: @error.', array('@url' => $uri, '@error' => $response->getStatusCode() . ' ' . $response->getReasonPhrase()));
+    $logger->notice('HTTP request to @url failed with error: @error.', array('@url' => $uri, '@error' => $response->getStatusCode() . ' ' . $response->getReasonPhrase()));
   }
 
   return FALSE;
@@ -285,6 +285,6 @@ function locale_translation_download_source($source_file, $directory = 'temporar
     $file->timestamp = filemtime($uri);
     return $file;
   }
-  watchdog('locale', 'Unable to download translation file @uri.', array('@uri' => $source_file->uri), WATCHDOG_ERROR);
+  \Drupal::logger('locale')->error('Unable to download translation file @uri.', array('@uri' => $source_file->uri));
   return FALSE;
 }
diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc
index 06c0887..f19e9e6 100644
--- a/core/modules/locale/locale.bulk.inc
+++ b/core/modules/locale/locale.bulk.inc
@@ -255,7 +255,7 @@ function locale_translate_batch_import($file, $options, &$context) {
     catch (Exception $exception) {
       // Import failed. Store the data of the failing file.
       $context['results']['failed_files'][] = $file;
-      watchdog('locale', 'Unable to import translations file: @file', array('@file' => $file->uri));
+      \Drupal::logger('locale')->notice('Unable to import translations file: @file', array('@file' => $file->uri));
     }
   }
 }
@@ -342,6 +342,7 @@ function locale_translate_batch_refresh(array &$context) {
  * Finished callback of system page locale import batch.
  */
 function locale_translate_batch_finished($success, $results) {
+  $logger = \Drupal::logger('locale');
   if ($success) {
     $additions = $updates = $deletes = $skips = $config = 0;
     if (isset($results['failed_files'])) {
@@ -373,7 +374,7 @@ function locale_translate_batch_finished($success, $results) {
         '@count translation files imported. %number translations were added, %update translations were updated and %delete translations were removed.',
         array('%number' => $additions, '%update' => $updates, '%delete' => $deletes)
       ));
-      watchdog('locale', 'Translations imported: %number added, %update updated, %delete removed.', array('%number' => $additions, '%update' => $updates, '%delete' => $deletes));
+      $logger->notice('Translations imported: %number added, %update updated, %delete removed.', array('%number' => $additions, '%update' => $updates, '%delete' => $deletes));
 
       if ($skips) {
         if (\Drupal::moduleHandler()->moduleExists('dblog')) {
@@ -383,7 +384,7 @@ function locale_translate_batch_finished($success, $results) {
           $message = format_plural($skips, 'One translation string was skipped because of disallowed or malformed HTML. See the log for details.', '@count translation strings were skipped because of disallowed or malformed HTML. See the log for details.');
         }
         drupal_set_message($message, 'warning');
-        watchdog('locale', '@count disallowed HTML string(s) in files: @files.', array('@count' => $skips, '@files' => implode(',', $skipped_files)), WATCHDOG_WARNING);
+        $logger->warning('@count disallowed HTML string(s) in files: @files.', array('@count' => $skips, '@files' => implode(',', $skipped_files)));
       }
     }
   }
@@ -605,11 +606,11 @@ function locale_config_batch_finished($success, array $results) {
     $configuration = isset($results['stats']['config']) ? $results['stats']['config'] : 0;
     if ($configuration) {
       drupal_set_message(t('The configuration was successfully updated. There are %number configuration objects updated.', array('%number' => $configuration)));
-      watchdog('locale', 'The configuration was successfully updated. %number configuration objects updated.', array('%number' => $configuration));
+      \Drupal::logger('locale')->notice('The configuration was successfully updated. %number configuration objects updated.', array('%number' => $configuration));
     }
     else {
       drupal_set_message(t('No configuration objects have been updated.'));
-      watchdog('locale', 'No configuration objects have been updated.', array(), WATCHDOG_WARNING);
+      \Drupal::logger('locale')->warning('No configuration objects have been updated.');
     }
   }
 }
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index d3e05dc..443da96 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -1344,23 +1344,24 @@ function _locale_rebuild_js($langcode = NULL) {
   }
 
   // Log the operation and return success flag.
+  $logger = \Drupal::logger('locale');
   switch ($status) {
     case 'updated':
-      watchdog('locale', 'Updated JavaScript translation file for the language %language.', array('%language' => $language->name));
+      $logger->notice('Updated JavaScript translation file for the language %language.', array('%language' => $language->name));
       return TRUE;
 
     case 'rebuilt':
-      watchdog('locale', 'JavaScript translation file %file.js was lost.', array('%file' => $locale_javascripts[$language->id]), WATCHDOG_WARNING);
+      $logger->warning('JavaScript translation file %file.js was lost.', array('%file' => $locale_javascripts[$language->id]));
     // Proceed to the 'created' case as the JavaScript translation file has
     // been created again.
     case 'created':
-      watchdog('locale', 'Created JavaScript translation file for the language %language.', array('%language' => $language->name));
+      $logger->notice('Created JavaScript translation file for the language %language.', array('%language' => $language->name));
       return TRUE;
     case 'deleted':
-      watchdog('locale', 'Removed JavaScript translation file for the language %language because no translations currently exist for that language.', array('%language' => $language->name));
+      $logger->notice('Removed JavaScript translation file for the language %language because no translations currently exist for that language.', array('%language' => $language->name));
       return TRUE;
     case 'error':
-      watchdog('locale', 'An error occurred during creation of the JavaScript translation file for the language %language.', array('%language' => $language->name), WATCHDOG_ERROR);
+      $logger->error('An error occurred during creation of the JavaScript translation file for the language %language.', array('%language' => $language->name));
       return FALSE;
     default:
       // No operation needed.
diff --git a/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuDeleteForm.php b/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuDeleteForm.php
index 98a45db..63cad62 100644
--- a/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuDeleteForm.php
+++ b/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuDeleteForm.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Database\Connection;
 use Drupal\Core\Entity\EntityConfirmFormBase;
 use Drupal\Core\Entity\EntityStorageInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -32,16 +33,26 @@ class MenuDeleteForm extends EntityConfirmFormBase {
   protected $connection;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new MenuDeleteForm.
    *
    * @param \Drupal\Core\Entity\EntityStorageInterface $storage
    *   The menu link storage.
    * @param \Drupal\Core\Database\Connection $connection
    *   The database connection.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityStorageInterface $storage, Connection $connection) {
+  public function __construct(EntityStorageInterface $storage, Connection $connection, LoggerInterface $logger) {
     $this->storage = $storage;
     $this->connection = $connection;
+    $this->logger = $logger;
   }
 
   /**
@@ -50,7 +61,8 @@ public function __construct(EntityStorageInterface $storage, Connection $connect
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager')->getStorage('menu_link'),
-      $container->get('database')
+      $container->get('database'),
+      $container->get('logger.factory')->get('menu')
     );
   }
 
@@ -125,6 +137,6 @@ public function submit(array $form, array &$form_state) {
 
     $t_args = array('%title' => $this->entity->label());
     drupal_set_message(t('The custom menu %title has been deleted.', $t_args));
-    watchdog('menu', 'Deleted custom menu %title and all its menu links.', $t_args, WATCHDOG_NOTICE);
+    $this->logger->notice('Deleted custom menu %title and all its menu links.', $t_args);
   }
 }
diff --git a/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuLinkDeleteForm.php b/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuLinkDeleteForm.php
index eeb40a6..42ed1f7 100644
--- a/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuLinkDeleteForm.php
+++ b/core/modules/menu_ui/lib/Drupal/menu_ui/Form/MenuLinkDeleteForm.php
@@ -40,7 +40,7 @@ public function submit(array $form, array &$form_state) {
     menu_link_delete($this->entity->id());
     $t_args = array('%title' => $this->entity->link_title);
     drupal_set_message(t('The menu link %title has been deleted.', $t_args));
-    watchdog('menu', 'Deleted menu link %title.', $t_args, WATCHDOG_NOTICE);
+    \Drupal::logger('menu')->notice('Deleted menu link %title.', $t_args);
     $form_state['redirect_route'] = array(
       'route_name' => 'menu_ui.menu_edit',
       'route_parameters' => array(
diff --git a/core/modules/menu_ui/lib/Drupal/menu_ui/MenuForm.php b/core/modules/menu_ui/lib/Drupal/menu_ui/MenuForm.php
index 4913b83..d29df99 100644
--- a/core/modules/menu_ui/lib/Drupal/menu_ui/MenuForm.php
+++ b/core/modules/menu_ui/lib/Drupal/menu_ui/MenuForm.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Render\Element;
 use Drupal\menu_link\MenuLinkStorageInterface;
 use Drupal\menu_link\MenuTreeInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -50,6 +51,13 @@ class MenuForm extends EntityForm {
   protected $overviewTreeForm = array('#tree' => TRUE);
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a MenuForm object.
    *
    * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query_factory
@@ -58,11 +66,14 @@ class MenuForm extends EntityForm {
    *   The menu link storage.
    * @param \Drupal\menu_link\MenuTreeInterface $menu_tree
    *   The menu tree service.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(QueryFactory $entity_query_factory, MenuLinkStorageInterface $menu_link_storage, MenuTreeInterface $menu_tree) {
+  public function __construct(QueryFactory $entity_query_factory, MenuLinkStorageInterface $menu_link_storage, MenuTreeInterface $menu_tree, LoggerInterface $logger) {
     $this->entityQueryFactory = $entity_query_factory;
     $this->menuLinkStorage = $menu_link_storage;
     $this->menuTree = $menu_tree;
+    $this->logger = $logger;
   }
 
   /**
@@ -220,11 +231,11 @@ public function save(array $form, array &$form_state) {
     $edit_link = \Drupal::linkGenerator()->generateFromUrl($this->t('Edit'), $this->entity->urlInfo());
     if ($status == SAVED_UPDATED) {
       drupal_set_message(t('Menu %label has been updated.', array('%label' => $menu->label())));
-      watchdog('menu', 'Menu %label has been updated.', array('%label' => $menu->label()), WATCHDOG_NOTICE, $edit_link);
+      $this->logger->notice('Menu %label has been updated.', array('%label' => $menu->label(), 'link' => $edit_link));
     }
     else {
       drupal_set_message(t('Menu %label has been added.', array('%label' => $menu->label())));
-      watchdog('menu', 'Menu %label has been added.', array('%label' => $menu->label()), WATCHDOG_NOTICE, $edit_link);
+      $this->logger->notice('Menu %label has been added.', array('%label' => $menu->label(), 'link' => $edit_link));
     }
 
     $form_state['redirect_route'] = $this->entity->urlInfo('edit-form');
diff --git a/core/modules/migrate/lib/Drupal/migrate/MigrateMessage.php b/core/modules/migrate/lib/Drupal/migrate/MigrateMessage.php
index a9c8916..c35acdd 100644
--- a/core/modules/migrate/lib/Drupal/migrate/MigrateMessage.php
+++ b/core/modules/migrate/lib/Drupal/migrate/MigrateMessage.php
@@ -13,20 +13,10 @@
 class MigrateMessage implements MigrateMessageInterface {
 
   /**
-   * The map between migrate status and watchdog severity.
-   *
-   * @var array
-   */
-  protected $map = array(
-    'status' => WATCHDOG_INFO,
-    'error' => WATCHDOG_ERROR,
-  );
-
-  /**
    * {@inheritdoc}
    */
   public function display($message, $type = 'status') {
-    watchdog('migrate', $message, array(), isset($this->map[$type]) ? $this->map[$type] : WATCHDOG_NOTICE);
+    \Drupal::logger('migrate')->log($type, $message);
   }
 
 }
diff --git a/core/modules/node/lib/Drupal/node/Form/DeleteMultiple.php b/core/modules/node/lib/Drupal/node/Form/DeleteMultiple.php
index fada9bb..c980196 100644
--- a/core/modules/node/lib/Drupal/node/Form/DeleteMultiple.php
+++ b/core/modules/node/lib/Drupal/node/Form/DeleteMultiple.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Component\Utility\String;
 use Drupal\user\TempStoreFactory;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -42,16 +43,26 @@ class DeleteMultiple extends ConfirmFormBase {
   protected $manager;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a DeleteMultiple form object.
    *
    * @param \Drupal\user\TempStoreFactory $temp_store_factory
    *   The tempstore factory.
    * @param \Drupal\Core\Entity\EntityManagerInterface $manager
    *   The entity manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(TempStoreFactory $temp_store_factory, EntityManagerInterface $manager) {
+  public function __construct(TempStoreFactory $temp_store_factory, EntityManagerInterface $manager, LoggerInterface $logger) {
     $this->tempStoreFactory = $temp_store_factory;
     $this->storage = $manager->getStorage('node');
+    $this->logger = $logger;
   }
 
   /**
@@ -60,7 +71,8 @@ public function __construct(TempStoreFactory $temp_store_factory, EntityManagerI
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('user.tempstore'),
-      $container->get('entity.manager')
+      $container->get('entity.manager'),
+      $container->get('logger.factory')->get('content')
     );
   }
 
@@ -121,7 +133,7 @@ public function submitForm(array &$form, array &$form_state) {
       $this->storage->delete($this->nodes);
       $this->tempStoreFactory->get('node_multiple_delete_confirm')->delete(\Drupal::currentUser()->id());
       $count = count($this->nodes);
-      watchdog('content', 'Deleted @count posts.', array('@count' => $count));
+      $thi->logger->notice('Deleted @count posts.', array('@count' => $count));
       drupal_set_message(format_plural($count, 'Deleted 1 post.', 'Deleted @count posts.'));
       Cache::invalidateTags(array('content' => TRUE));
     }
diff --git a/core/modules/node/lib/Drupal/node/Form/NodeDeleteForm.php b/core/modules/node/lib/Drupal/node/Form/NodeDeleteForm.php
index ebc34c9..704fc0a 100644
--- a/core/modules/node/lib/Drupal/node/Form/NodeDeleteForm.php
+++ b/core/modules/node/lib/Drupal/node/Form/NodeDeleteForm.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\ContentEntityConfirmFormBase;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Routing\UrlGeneratorInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -26,16 +27,26 @@ class NodeDeleteForm extends ContentEntityConfirmFormBase {
   protected $urlGenerator;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a NodeDeleteForm object.
    *
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
    * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
    *   The URL generator.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityManagerInterface $entity_manager, UrlGeneratorInterface $url_generator) {
+  public function __construct(EntityManagerInterface $entity_manager, UrlGeneratorInterface $url_generator, LoggerInterface $logger) {
     parent::__construct($entity_manager);
     $this->urlGenerator = $url_generator;
+    $this->logger = $logger;
   }
 
   /**
@@ -44,7 +55,8 @@ public function __construct(EntityManagerInterface $entity_manager, UrlGenerator
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager'),
-      $container->get('url_generator')
+      $container->get('url_generator'),
+      $container->get('logger.factory')->get('content')
     );
   }
 
@@ -74,7 +86,7 @@ public function getConfirmText() {
    */
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
-    watchdog('content', '@type: deleted %title.', array('@type' => $this->entity->bundle(), '%title' => $this->entity->label()));
+    $this->logger->notice('@type: deleted %title.', array('@type' => $this->entity->bundle(), '%title' => $this->entity->label()));
     $node_type_storage = $this->entityManager->getStorage('node_type');
     $node_type = $node_type_storage->load($this->entity->bundle())->label();
     drupal_set_message(t('@type %title has been deleted.', array('@type' => $node_type, '%title' => $this->entity->label())));
diff --git a/core/modules/node/lib/Drupal/node/Form/NodeRevisionDeleteForm.php b/core/modules/node/lib/Drupal/node/Form/NodeRevisionDeleteForm.php
index 8890709..56176c8 100644
--- a/core/modules/node/lib/Drupal/node/Form/NodeRevisionDeleteForm.php
+++ b/core/modules/node/lib/Drupal/node/Form/NodeRevisionDeleteForm.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\node\NodeInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -47,6 +48,13 @@ class NodeRevisionDeleteForm extends ConfirmFormBase {
   protected $connection;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new NodeRevisionDeleteForm.
    *
    * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
@@ -55,11 +63,14 @@ class NodeRevisionDeleteForm extends ConfirmFormBase {
    *   The node type storage.
    * @param \Drupal\Core\Database\Connection $connection
    *   The database connection.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityStorageInterface $node_storage, EntityStorageInterface $node_type_storage, Connection $connection) {
+  public function __construct(EntityStorageInterface $node_storage, EntityStorageInterface $node_type_storage, Connection $connection, LoggerInterface $logger) {
     $this->nodeStorage = $node_storage;
     $this->nodeTypeStorage = $node_type_storage;
     $this->connection = $connection;
+    $this->logger = $logger;
   }
 
   /**
@@ -70,7 +81,8 @@ public static function create(ContainerInterface $container) {
     return new static(
       $entity_manager->getStorage('node'),
       $entity_manager->getStorage('node_type'),
-      $container->get('database')
+      $container->get('database'),
+      $container->get('log.factory')->get('content')
     );
   }
 
@@ -119,7 +131,7 @@ public function buildForm(array $form, array &$form_state, $node_revision = NULL
   public function submitForm(array &$form, array &$form_state) {
     $this->nodeStorage->deleteRevision($this->revision->getRevisionId());
 
-    watchdog('content', '@type: deleted %title revision %revision.', array('@type' => $this->revision->bundle(), '%title' => $this->revision->label(), '%revision' => $this->revision->getRevisionId()));
+    $this->logger->notice('@type: deleted %title revision %revision.', array('@type' => $this->revision->bundle(), '%title' => $this->revision->label(), '%revision' => $this->revision->getRevisionId()));
     $node_type = $this->nodeTypeStorage->load($this->revision->bundle())->label();
     drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($this->revision->getRevisionCreationTime()), '@type' => $node_type, '%title' => $this->revision->label())));
     $form_state['redirect_route'] = array(
diff --git a/core/modules/node/lib/Drupal/node/Form/NodeRevisionRevertForm.php b/core/modules/node/lib/Drupal/node/Form/NodeRevisionRevertForm.php
index b0d717d..dd65394 100644
--- a/core/modules/node/lib/Drupal/node/Form/NodeRevisionRevertForm.php
+++ b/core/modules/node/lib/Drupal/node/Form/NodeRevisionRevertForm.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\node\NodeInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -32,13 +33,23 @@ class NodeRevisionRevertForm extends ConfirmFormBase {
   protected $nodeStorage;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new NodeRevisionRevertForm.
    *
    * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
    *   The node storage.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(EntityStorageInterface $node_storage) {
+  public function __construct(EntityStorageInterface $node_storage, LoggerInterface $logger) {
     $this->nodeStorage = $node_storage;
+    $this->logger = $logger;
   }
 
   /**
@@ -46,7 +57,8 @@ public function __construct(EntityStorageInterface $node_storage) {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('entity.manager')->getStorage('node')
+      $container->get('entity.manager')->getStorage('node'),
+      $container->get('logger.factory')->get('content')
     );
   }
 
@@ -112,7 +124,7 @@ public function submitForm(array &$form, array &$form_state) {
 
     $this->revision->save();
 
-    watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $this->revision->bundle(), '%title' => $this->revision->label(), '%revision' => $this->revision->getRevisionId()));
+    $this->logger->notice('@type: reverted %title revision %revision.', array('@type' => $this->revision->bundle(), '%title' => $this->revision->label(), '%revision' => $this->revision->getRevisionId()));
     drupal_set_message(t('@type %title has been reverted back to the revision from %revision-date.', array('@type' => node_get_type_label($this->revision), '%title' => $this->revision->label(), '%revision-date' => format_date($original_revision_timestamp))));
     $form_state['redirect_route'] = array(
       'route_name' => 'node.revision_overview',
diff --git a/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php b/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php
index 8adc575..66be646 100644
--- a/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php
+++ b/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
 use Drupal\Core\Database\Connection;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -24,13 +25,23 @@ class NodeTypeDeleteConfirm extends EntityConfirmFormBase {
   protected $database;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new NodeTypeDeleteConfirm object.
    *
    * @param \Drupal\Core\Database\Connection $database
    *   The database connection.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(Connection $database) {
+  public function __construct(Connection $database, LoggerInterface $logger) {
     $this->database = $database;
+    $this->logger = $logger;
   }
 
   /**
@@ -38,7 +49,8 @@ public function __construct(Connection $database) {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('database')
+      $container->get('database'),
+      $container->get('logger.factory')->get('node')
     );
   }
 
@@ -87,7 +99,7 @@ public function submit(array $form, array &$form_state) {
     $this->entity->delete();
     $t_args = array('%name' => $this->entity->label());
     drupal_set_message(t('The content type %name has been deleted.', $t_args));
-    watchdog('node', 'Deleted content type %name.', $t_args, WATCHDOG_NOTICE);
+    $this->logger->notice('Deleted content type %name.', $t_args);
 
     $form_state['redirect_route']['route_name'] = 'node.overview_types';
   }
diff --git a/core/modules/node/lib/Drupal/node/NodeForm.php b/core/modules/node/lib/Drupal/node/NodeForm.php
index 37bb7da..a3289ce 100644
--- a/core/modules/node/lib/Drupal/node/NodeForm.php
+++ b/core/modules/node/lib/Drupal/node/NodeForm.php
@@ -13,6 +13,8 @@
 use Drupal\Core\Entity\ContentEntityForm;
 use Drupal\Core\Language\Language;
 use Drupal\Component\Utility\String;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Form controller for the node edit forms.
@@ -27,6 +29,36 @@ class NodeForm extends ContentEntityForm {
   protected $settings;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a NodeForm object.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(EntityManagerInterface $entity_manager, LoggerInterface $logger) {
+    parent::__construct($entity_manager);
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity.manager'),
+      $container->get('log.factory')->get('content')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   protected function prepareEntity() {
@@ -444,15 +476,15 @@ public function save(array $form, array &$form_state) {
     $insert = $node->isNew();
     $node->save();
     $node_link = l(t('View'), 'node/' . $node->id());
-    $watchdog_args = array('@type' => $node->getType(), '%title' => $node->label());
+    $context = array('@type' => $node->getType(), '%title' => $node->label(), 'link' => $node_link);
     $t_args = array('@type' => node_get_type_label($node), '%title' => $node->label());
 
     if ($insert) {
-      watchdog('content', '@type: added %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
+      $this->logger->notice('content', '@type: added %title.', $context);
       drupal_set_message(t('@type %title has been created.', $t_args));
     }
     else {
-      watchdog('content', '@type: updated %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
+      $this->logger->notice('content', '@type: updated %title.', $context);
       drupal_set_message(t('@type %title has been updated.', $t_args));
     }
 
diff --git a/core/modules/node/lib/Drupal/node/NodeTypeForm.php b/core/modules/node/lib/Drupal/node/NodeTypeForm.php
index 4d87e03..4e77232 100644
--- a/core/modules/node/lib/Drupal/node/NodeTypeForm.php
+++ b/core/modules/node/lib/Drupal/node/NodeTypeForm.php
@@ -200,7 +200,8 @@ public function save(array $form, array &$form_state) {
     }
     elseif ($status == SAVED_NEW) {
       drupal_set_message(t('The content type %name has been added.', $t_args));
-      watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l(t('View'), 'admin/structure/types'));
+      $context = array_merge($t_args, array('link' => l(t('View'), 'admin/structure/types')));
+      \Drupal::logger('node')->notice('Added content type %name.', $context);
     }
 
     $form_state['redirect_route']['route_name'] = 'node.overview_types';
diff --git a/core/modules/responsive_image/lib/Drupal/responsive_image/Form/ResponsiveImageMappingDeleteForm.php b/core/modules/responsive_image/lib/Drupal/responsive_image/Form/ResponsiveImageMappingDeleteForm.php
index 2f79f57..d0c47d9 100644
--- a/core/modules/responsive_image/lib/Drupal/responsive_image/Form/ResponsiveImageMappingDeleteForm.php
+++ b/core/modules/responsive_image/lib/Drupal/responsive_image/Form/ResponsiveImageMappingDeleteForm.php
@@ -8,10 +8,38 @@
 namespace Drupal\responsive_image\Form;
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 class ResponsiveImageMappingDeleteForm extends EntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a ResponsiveImageMappingDeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('responsive_image')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -40,7 +68,7 @@ public function getConfirmText() {
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
     drupal_set_message($this->t('Responsive image mapping %label has been deleted.', array('%label' => $this->entity->label())));
-    watchdog('responsive_image', 'Responsive image mapping %label has been deleted.', array('%label' => $this->entity->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('Responsive image mapping %label has been deleted.', array('%label' => $this->entity->label()));
     $form_state['redirect_route']['route_name'] = 'responsive_image.mapping_page';
   }
 
diff --git a/core/modules/responsive_image/lib/Drupal/responsive_image/ResponsiveImageMappingForm.php b/core/modules/responsive_image/lib/Drupal/responsive_image/ResponsiveImageMappingForm.php
index ff62862..de337c8 100644
--- a/core/modules/responsive_image/lib/Drupal/responsive_image/ResponsiveImageMappingForm.php
+++ b/core/modules/responsive_image/lib/Drupal/responsive_image/ResponsiveImageMappingForm.php
@@ -8,6 +8,8 @@
 namespace Drupal\responsive_image;
 
 use Drupal\Core\Entity\EntityForm;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Form controller for the responsive image edit/add forms.
@@ -15,6 +17,32 @@
 class ResponsiveImageMappingForm extends EntityForm {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a ResponsiveImageMappingForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('responsive_image')
+    );
+  }
+
+  /**
    * Overrides Drupal\Core\Entity\EntityForm::form().
    *
    * @param array $form
@@ -122,7 +150,7 @@ public function save(array $form, array &$form_state) {
     $responsive_image_mapping = $this->entity;
     $responsive_image_mapping->save();
 
-    watchdog('responsive_image', 'Responsive image mapping @label saved.', array('@label' => $responsive_image_mapping->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('Responsive image mapping @label saved.', array('@label' => $responsive_image_mapping->label()));
     drupal_set_message($this->t('Responsive image mapping %label saved.', array('%label' => $responsive_image_mapping->label())));
 
     // Redirect to edit form after creating a new mapping or after selecting
diff --git a/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php b/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php
index e54e134..51c9d24 100644
--- a/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php
+++ b/core/modules/rest/lib/Drupal/rest/Plugin/ResourceBase.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginBase;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Routing\Route;
 use Symfony\Component\Routing\RouteCollection;
@@ -26,6 +27,13 @@
   protected $serializerFormats = array();
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a Drupal\rest\Plugin\ResourceBase object.
    *
    * @param array $configuration
@@ -36,10 +44,13 @@
    *   The plugin implementation definition.
    * @param array $serializer_formats
    *   The available serialization formats.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, array $serializer_formats) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, array $serializer_formats, LoggerInterface $logger) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
     $this->serializerFormats = $serializer_formats;
+    $this->logger = $logger;
   }
 
   /**
@@ -50,7 +61,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $configuration,
       $plugin_id,
       $plugin_definition,
-      $container->getParameter('serializer.formats')
+      $container->getParameter('serializer.formats'),
+      $container->get('logger.factory')->get('rest')
     );
   }
 
diff --git a/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php b/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php
index 9b3c792..ff64af0 100644
--- a/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php
+++ b/core/modules/rest/lib/Drupal/rest/Plugin/rest/resource/EntityResource.php
@@ -94,7 +94,7 @@ public function post(EntityInterface $entity = NULL) {
     $this->validate($entity);
     try {
       $entity->save();
-      watchdog('rest', 'Created entity %type with ID %id.', array('%type' => $entity->getEntityTypeId(), '%id' => $entity->id()));
+      $this->logger->notice('Created entity %type with ID %id.', array('%type' => $entity->getEntityTypeId(), '%id' => $entity->id()));
 
       $url = url(strtr($this->pluginId, ':', '/') . '/' . $entity->id(), array('absolute' => TRUE));
       // 201 Created responses have an empty body.
@@ -147,7 +147,7 @@ public function patch(EntityInterface $original_entity, EntityInterface $entity
     $this->validate($original_entity);
     try {
       $original_entity->save();
-      watchdog('rest', 'Updated entity %type with ID %id.', array('%type' => $entity->getEntityTypeId(), '%id' => $entity->id()));
+      $this->logger->notice('rest', 'Updated entity %type with ID %id.', array('%type' => $entity->getEntityTypeId(), '%id' => $entity->id()));
 
       // Update responses have an empty body.
       return new ResourceResponse(NULL, 204);
@@ -174,7 +174,7 @@ public function delete(EntityInterface $entity) {
     }
     try {
       $entity->delete();
-      watchdog('rest', 'Deleted entity %type with ID %id.', array('%type' => $entity->getEntityTypeId(), '%id' => $entity->id()));
+      $this->logger->notice('rest', 'Deleted entity %type with ID %id.', array('%type' => $entity->getEntityTypeId(), '%id' => $entity->id()));
 
       // Delete responses have an empty body.
       return new ResourceResponse(NULL, 204);
diff --git a/core/modules/rest/lib/Drupal/rest/Routing/ResourceRoutes.php b/core/modules/rest/lib/Drupal/rest/Routing/ResourceRoutes.php
index 5605048..db439dc 100644
--- a/core/modules/rest/lib/Drupal/rest/Routing/ResourceRoutes.php
+++ b/core/modules/rest/lib/Drupal/rest/Routing/ResourceRoutes.php
@@ -11,6 +11,7 @@
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Routing\RouteSubscriberBase;
 use Drupal\rest\Plugin\Type\ResourcePluginManager;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\Routing\RouteCollection;
@@ -35,16 +36,26 @@ class ResourceRoutes extends RouteSubscriberBase{
   protected $config;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a RouteSubscriber object.
    *
    * @param \Drupal\rest\Plugin\Type\ResourcePluginManager $manager
    *   The resource plugin manager.
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config
    *   The configuration factory holding resource settings.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(ResourcePluginManager $manager, ConfigFactoryInterface $config) {
+  public function __construct(ResourcePluginManager $manager, ConfigFactoryInterface $config, LoggerInterface $logger) {
     $this->manager = $manager;
     $this->config = $config;
+    $this->logger = $logger;
   }
 
   /**
@@ -70,13 +81,13 @@ protected function alterRoutes(RouteCollection $collection) {
 
           // Check that authentication providers are defined.
           if (empty($enabled_methods[$method]['supported_auth']) || !is_array($enabled_methods[$method]['supported_auth'])) {
-            watchdog('rest', 'At least one authentication provider must be defined for resource @id', array(':id' => $id), WATCHDOG_ERROR);
+            $this->logger->error('At least one authentication provider must be defined for resource @id', array(':id' => $id));
             continue;
           }
 
           // Check that formats are defined.
           if (empty($enabled_methods[$method]['supported_formats']) || !is_array($enabled_methods[$method]['supported_formats'])) {
-            watchdog('rest', 'At least one format must be defined for resource @id', array(':id' => $id), WATCHDOG_ERROR);
+            $this->logger->error('At least one format must be defined for resource @id', array(':id' => $id));
             continue;
           }
 
diff --git a/core/modules/rest/lib/Drupal/rest/Tests/DBLogTest.php b/core/modules/rest/lib/Drupal/rest/Tests/DBLogTest.php
index ca3806e..0afb31c 100644
--- a/core/modules/rest/lib/Drupal/rest/Tests/DBLogTest.php
+++ b/core/modules/rest/lib/Drupal/rest/Tests/DBLogTest.php
@@ -41,7 +41,7 @@ public function setUp() {
    */
   public function testWatchdog() {
     // Write a log message to the DB.
-    watchdog('rest', 'Test message');
+    $this->container->get('logger.factory')->get('rest')->notice('Test message');
     // Get the ID of the written message.
     $id = db_query_range("SELECT wid FROM {watchdog} WHERE type = :type ORDER BY wid DESC", 0, 1, array(':type' => 'rest'))
       ->fetchField();
diff --git a/core/modules/rest/rest.services.yml b/core/modules/rest/rest.services.yml
index e7b43f3..d7dbd68 100644
--- a/core/modules/rest/rest.services.yml
+++ b/core/modules/rest/rest.services.yml
@@ -24,6 +24,11 @@ services:
     arguments: ['@cache.default', '@entity.manager']
   rest.resource_routes:
     class: Drupal\rest\Routing\ResourceRoutes
-    arguments: ['@plugin.manager.rest', '@config.factory']
+    arguments: ['@plugin.manager.rest', '@config.factory', '@logger.channel.rest']
     tags:
       - { name: 'event_subscriber' }
+  logger.channel.rest:
+    class: Drupal\Core\Logger\LoggerChannel
+    factory_method: get
+    factory_service: logger.factory
+    arguments: ['rest']
diff --git a/core/modules/search/lib/Drupal/search/Controller/SearchController.php b/core/modules/search/lib/Drupal/search/Controller/SearchController.php
index 20ce39a..de0edc6 100644
--- a/core/modules/search/lib/Drupal/search/Controller/SearchController.php
+++ b/core/modules/search/lib/Drupal/search/Controller/SearchController.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\search\SearchPageInterface;
 use Drupal\search\SearchPageRepositoryInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -26,13 +27,23 @@ class SearchController extends ControllerBase {
   protected $searchPageRepository;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new search controller.
    *
    * @param \Drupal\search\SearchPageRepositoryInterface $search_page_repository
    *   The search page repository.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(SearchPageRepositoryInterface $search_page_repository) {
+  public function __construct(SearchPageRepositoryInterface $search_page_repository, LoggerInterface $logger) {
     $this->searchPageRepository = $search_page_repository;
+    $this->logger = $logger;
   }
 
   /**
@@ -40,7 +51,8 @@ public function __construct(SearchPageRepositoryInterface $search_page_repositor
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('search.search_page_repository')
+      $container->get('search.search_page_repository'),
+      $container->get('logger.factory')->get('search')
     );
   }
 
@@ -75,7 +87,7 @@ public function view(Request $request, SearchPageInterface $entity) {
     if ($request->query->has('keys')) {
       if ($plugin->isSearchExecutable()) {
         // Log the search.
-        watchdog('search', 'Searched %type for %keys.', array('%keys' => $keys, '%type' => $entity->label()), WATCHDOG_NOTICE);
+        $this->logger->notice('Searched %type for %keys.', array('%keys' => $keys, '%type' => $entity->label()));
 
         // Collect the search results.
         $results = $plugin->buildResults();
diff --git a/core/modules/system/entity.api.php b/core/modules/system/entity.api.php
index 50b9f6a..049c64c 100644
--- a/core/modules/system/entity.api.php
+++ b/core/modules/system/entity.api.php
@@ -345,7 +345,7 @@ function hook_entity_translation_insert(\Drupal\Core\Entity\EntityInterface $tra
     '@language' => $translation->language()->name,
     '@label' => $translation->getUntranslated()->label(),
   );
-  watchdog('example', 'The @language translation of @label has just been stored.', $variables);
+  \Drupal::logger('example')->notice('The @language translation of @label has just been stored.', $variables);
 }
 
 /**
@@ -362,7 +362,7 @@ function hook_entity_translation_delete(\Drupal\Core\Entity\EntityInterface $tra
     '@language' => $languages[$langcode]->name,
     '@label' => $entity->label(),
   );
-  watchdog('example', 'The @language translation of @label has just been deleted.', $variables);
+  \Drupal::logger('example')->notice('The @language translation of @label has just been deleted.', $variables);
 }
 
 /**
diff --git a/core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php b/core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php
index 7aa9a9d..a5cbb88 100644
--- a/core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php
+++ b/core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php
@@ -25,11 +25,11 @@ class CronAccessCheck implements AccessInterface {
    */
   public function access($key) {
     if ($key != \Drupal::state()->get('system.cron_key')) {
-      watchdog('cron', 'Cron could not run because an invalid key was used.', array(), WATCHDOG_NOTICE);
+      \Drupal::logger('cron')->notice('Cron could not run because an invalid key was used.');
       return static::KILL;
     }
     elseif (\Drupal::state()->get('system.maintenance_mode')) {
-      watchdog('cron', 'Cron could not run because the site is in maintenance mode.', array(), WATCHDOG_NOTICE);
+      \Drupal::logger('cron')->notice('Cron could not run because the site is in maintenance mode.');
       return static::KILL;
     }
     return static::ALLOW;
diff --git a/core/modules/system/lib/Drupal/system/Controller/FormAjaxController.php b/core/modules/system/lib/Drupal/system/Controller/FormAjaxController.php
index f1645a7..887e231 100644
--- a/core/modules/system/lib/Drupal/system/Controller/FormAjaxController.php
+++ b/core/modules/system/lib/Drupal/system/Controller/FormAjaxController.php
@@ -7,6 +7,9 @@
 
 namespace Drupal\system\Controller;
 
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
 use Symfony\Component\HttpKernel\Exception\HttpException;
@@ -14,7 +17,33 @@
 /**
  * Defines a controller to respond to form Ajax requests.
  */
-class FormAjaxController {
+class FormAjaxController implements ContainerInjectionInterface {
+
+  /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a FormAjaxController object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('ajax')
+    );
+  }
 
   /**
    * Processes an Ajax form submission.
@@ -81,7 +110,7 @@ protected function getForm(Request $request) {
       // system/ajax without actually viewing the concerned form in the browser.
       // This is likely a hacking attempt as it never happens under normal
       // circumstances.
-      watchdog('ajax', 'Invalid form POST data.', array(), WATCHDOG_WARNING);
+      $this->logger->warning('Invalid form POST data.');
       throw new BadRequestHttpException();
     }
 
diff --git a/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php b/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
index fccff2b..c52a8ce 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
@@ -104,7 +104,7 @@ public function resize(ImageInterface $image, $width, $height) {
   public function rotate(ImageInterface $image, $degrees, $background = NULL) {
     // PHP installations using non-bundled GD do not have imagerotate.
     if (!function_exists('imagerotate')) {
-      watchdog('image', 'The image %file could not be rotated because the imagerotate() function is not available in this PHP installation.', array('%file' => $image->getSource()));
+      $this->logger->notice('The image %file could not be rotated because the imagerotate() function is not available in this PHP installation.', array('%file' => $image->getSource()));
       return FALSE;
     }
 
@@ -177,7 +177,7 @@ public function crop(ImageInterface $image, $x, $y, $width, $height) {
   public function desaturate(ImageInterface $image) {
     // PHP installations using non-bundled GD do not have imagefilter.
     if (!function_exists('imagefilter')) {
-      watchdog('image', 'The image %file could not be desaturated because the imagefilter() function is not available in this PHP installation.', array('%file' => $image->getSource()));
+      $this->logger->notice('The image %file could not be desaturated because the imagefilter() function is not available in this PHP installation.', array('%file' => $image->getSource()));
       return FALSE;
     }
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Pager/PagerTest.php b/core/modules/system/lib/Drupal/system/Tests/Pager/PagerTest.php
index 845aa28..874218a 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Pager/PagerTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Pager/PagerTest.php
@@ -35,8 +35,9 @@ function setUp() {
     parent::setUp();
 
     // Insert 300 log messages.
+    $logger = $this->container->get('logger.factory')->get('pager_test');
     for ($i = 0; $i < 300; $i++) {
-      watchdog('pager_test', $this->randomString(), array(), WATCHDOG_DEBUG);
+      $logger->debug($this->randomString());
     }
 
     $this->admin_user = $this->drupalCreateUser(array(
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 8feb47b..2813e3c 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -1100,16 +1100,17 @@ function system_check_directory($form_element) {
     return $form_element;
   }
 
+  $logger = \Drupal::logger('file system');
   if (!is_dir($directory) && !drupal_mkdir($directory, NULL, TRUE)) {
     // If the directory does not exists and cannot be created.
     form_set_error($form_element['#parents'][0], $form_state, t('The directory %directory does not exist and could not be created.', array('%directory' => $directory)));
-    watchdog('file system', 'The directory %directory does not exist and could not be created.', array('%directory' => $directory), WATCHDOG_ERROR);
+    $logger->error('The directory %directory does not exist and could not be created.', array('%directory' => $directory));
   }
 
   if (is_dir($directory) && !is_writable($directory) && !drupal_chmod($directory)) {
     // If the directory is not writable and cannot be made so.
     form_set_error($form_element['#parents'][0], $form_state, t('The directory %directory exists but is not writable and could not be made writable.', array('%directory' => $directory)));
-    watchdog('file system', 'The directory %directory exists but is not writable and could not be made writable.', array('%directory' => $directory), WATCHDOG_ERROR);
+    $logger->error('The directory %directory exists but is not writable and could not be made writable.', array('%directory' => $directory));
   }
   elseif (is_dir($directory)) {
     if ($form_element['#name'] == 'file_public_path') {
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/TermDeleteForm.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/TermDeleteForm.php
index 58fbb12..d157897 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/TermDeleteForm.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/TermDeleteForm.php
@@ -66,7 +66,7 @@ public function submit(array $form, array &$form_state) {
     taxonomy_check_vocabulary_hierarchy($vocabulary, array('tid' => $this->entity->id()));
 
     drupal_set_message($this->t('Deleted term %name.', array('%name' => $this->entity->getName())));
-    watchdog('taxonomy', 'Deleted term %name.', array('%name' => $this->entity->getName()), WATCHDOG_NOTICE);
+    \Drupal::logger('taxonomy')->notice('Deleted term %name.', array('%name' => $this->entity->getName()));
     $form_state['redirect_route']['route_name'] = 'taxonomy.vocabulary_list';
     Cache::invalidateTags(array('content' => TRUE));
   }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyDeleteForm.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyDeleteForm.php
index 8032901..1133cad 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyDeleteForm.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyDeleteForm.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
 use Drupal\Core\Cache\Cache;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a deletion confirmation form for taxonomy vocabulary.
@@ -16,6 +18,32 @@
 class VocabularyDeleteForm extends EntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new VocabularyDeleteForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('taxonomy')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getFormId() {
@@ -58,7 +86,7 @@ public function getConfirmText() {
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
     drupal_set_message($this->t('Deleted vocabulary %name.', array('%name' => $this->entity->label())));
-    watchdog('taxonomy', 'Deleted vocabulary %name.', array('%name' => $this->entity->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('Deleted vocabulary %name.', array('%name' => $this->entity->label()));
     $form_state['redirect_route']['route_name'] = 'taxonomy.vocabulary_list';
     Cache::invalidateTags(array('content' => TRUE));
   }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyResetForm.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyResetForm.php
index bae776c..e862ed9 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyResetForm.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Form/VocabularyResetForm.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
 use Drupal\taxonomy\TermStorageInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -24,13 +25,23 @@ class VocabularyResetForm extends EntityConfirmFormBase {
   protected $termStorage;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new VocabularyResetForm object.
    *
    * @param \Drupal\taxonomy\TermStorageInterface $term_storage
    *   The term storage.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(TermStorageInterface $term_storage) {
+  public function __construct(TermStorageInterface $term_storage, LoggerInterface $logger) {
     $this->termStorage = $term_storage;
+    $this->logger = $logger;
   }
 
   /**
@@ -38,7 +49,8 @@ public function __construct(TermStorageInterface $term_storage) {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('entity.manager')->getStorage('taxonomy_term')
+      $container->get('entity.manager')->getStorage('taxonomy_term'),
+      $container->get('logger.factory')->get('taxonomy')
     );
   }
 
@@ -83,7 +95,7 @@ public function getConfirmText() {
   public function save(array $form, array &$form_state) {
     $this->termStorage->resetWeights($this->entity->id());
     drupal_set_message($this->t('Reset vocabulary %name to alphabetical order.', array('%name' => $this->entity->label())));
-    watchdog('taxonomy', 'Reset vocabulary %name to alphabetical order.', array('%name' => $this->entity->label()), WATCHDOG_NOTICE);
+    $this->logger->notice('Reset vocabulary %name to alphabetical order.', array('%name' => $this->entity->label()));
     $form_state['redirect_route'] = $this->entity->urlInfo('edit-form');
   }
 
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermForm.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermForm.php
index e3b048a..2e46966 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermForm.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermForm.php
@@ -10,6 +10,8 @@
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Entity\ContentEntityForm;
 use Drupal\Core\Language\Language;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Base for controller for taxonomy term edit forms.
@@ -17,6 +19,36 @@
 class TermForm extends ContentEntityForm {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a TermForm object.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(EntityManagerInterface $entity_manager) {
+    parent::__construct($entity_manager);
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity.manager'),
+      $container->get('logger.factory')->get('taxonomy')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function form(array $form, array &$form_state) {
@@ -141,11 +173,11 @@ public function save(array $form, array &$form_state) {
     switch ($term->save()) {
       case SAVED_NEW:
         drupal_set_message($this->t('Created new term %term.', array('%term' => $term->getName())));
-        watchdog('taxonomy', 'Created new term %term.', array('%term' => $term->getName()), WATCHDOG_NOTICE, l($this->t('Edit'), 'taxonomy/term/' . $term->id() . '/edit'));
+        $this->logger->notice('Created new term %term.', array('%term' => $term->getName(), 'link' => l($this->t('Edit'), 'taxonomy/term/' . $term->id() . '/edit')));
         break;
       case SAVED_UPDATED:
         drupal_set_message($this->t('Updated term %term.', array('%term' => $term->getName())));
-        watchdog('taxonomy', 'Updated term %term.', array('%term' => $term->getName()), WATCHDOG_NOTICE, l($this->t('Edit'), 'taxonomy/term/' . $term->id() . '/edit'));
+        $this->logger->notice('Updated term %term.', array('%term' => $term->getName(), 'link' => l($this->t('Edit'), 'taxonomy/term/' . $term->id() . '/edit')));
         // Clear the page and block caches to avoid stale data.
         Cache::invalidateTags(array('content' => TRUE));
         break;
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyForm.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyForm.php
index 341bcbe..853cf9f 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyForm.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyForm.php
@@ -10,6 +10,8 @@
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Language\Language;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Base form for vocabulary edit forms.
@@ -17,6 +19,32 @@
 class VocabularyForm extends EntityForm {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a VocabularyForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('taxonomy')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function form(array $form, array &$form_state) {
@@ -141,13 +169,13 @@ public function save(array $form, array &$form_state) {
     switch ($status) {
       case SAVED_NEW:
         drupal_set_message($this->t('Created new vocabulary %name.', array('%name' => $vocabulary->name)));
-        watchdog('taxonomy', 'Created new vocabulary %name.', array('%name' => $vocabulary->name), WATCHDOG_NOTICE, $edit_link);
+        $this->logger->notice('Created new vocabulary %name.', array('%name' => $vocabulary->name, 'link' => $edit_link));
         $form_state['redirect_route'] = $vocabulary->urlInfo('overview-form');
         break;
 
       case SAVED_UPDATED:
         drupal_set_message($this->t('Updated vocabulary %name.', array('%name' => $vocabulary->name)));
-        watchdog('taxonomy', 'Updated vocabulary %name.', array('%name' => $vocabulary->name), WATCHDOG_NOTICE, $edit_link);
+        $this->logger->notice('Updated vocabulary %name.', array('%name' => $vocabulary->name, 'link' => $edit_link));
         $form_state['redirect_route']['route_name'] = 'taxonomy.vocabulary_list';
         break;
     }
diff --git a/core/modules/tracker/tracker.module b/core/modules/tracker/tracker.module
index 98042f5..b2cd0b4 100644
--- a/core/modules/tracker/tracker.module
+++ b/core/modules/tracker/tracker.module
@@ -112,7 +112,7 @@ function tracker_cron() {
       // Prepare a starting point for the next run.
       $state->set('tracker.index_nid', $last_nid - 1);
 
-      watchdog('tracker', 'Indexed %count content items for tracking.', array('%count' => $count));
+      \Drupal::logger('tracker')->notice('Indexed %count content items for tracking.', array('%count' => $count));
     }
     else {
       // If all nodes have been indexed, set to zero to skip future cron runs.
diff --git a/core/modules/user/lib/Drupal/user/Form/UserCancelForm.php b/core/modules/user/lib/Drupal/user/Form/UserCancelForm.php
index c453c76..64c5b04 100644
--- a/core/modules/user/lib/Drupal/user/Form/UserCancelForm.php
+++ b/core/modules/user/lib/Drupal/user/Form/UserCancelForm.php
@@ -8,6 +8,9 @@
 namespace Drupal\user\Form;
 
 use Drupal\Core\Entity\ContentEntityConfirmFormBase;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a confirmation form for cancelling user account.
@@ -15,6 +18,13 @@
 class UserCancelForm extends ContentEntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Available account cancellation methods.
    *
    * @var array
@@ -29,6 +39,29 @@ class UserCancelForm extends ContentEntityConfirmFormBase {
   protected $entity;
 
   /**
+   * Constructs a UserCancelForm object.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(EntityManagerInterface $entity_manager, LoggerInterface $logger) {
+    parent::__construct($entity_manager);
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity.manager'),
+      $container->get('logger.factory')->get('user')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -135,7 +168,7 @@ public function submit(array $form, array &$form_state) {
       $this->entity->save();
       _user_mail_notify('cancel_confirm', $this->entity);
       drupal_set_message($this->t('A confirmation request to cancel your account has been sent to your e-mail address.'));
-      watchdog('user', 'Sent account cancellation request to %name %email.', array('%name' => $this->entity->label(), '%email' => '<' . $this->entity->getEmail() . '>'), WATCHDOG_NOTICE);
+      $this->logger->notice('Sent account cancellation request to %name %email.', array('%name' => $this->entity->label(), '%email' => '<' . $this->entity->getEmail() . '>'));
 
       $form_state['redirect_route'] = array(
         'route_name' => 'user.view',
diff --git a/core/modules/user/lib/Drupal/user/Form/UserLoginForm.php b/core/modules/user/lib/Drupal/user/Form/UserLoginForm.php
index 58e0ba2..e7d2cbc 100644
--- a/core/modules/user/lib/Drupal/user/Form/UserLoginForm.php
+++ b/core/modules/user/lib/Drupal/user/Form/UserLoginForm.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Form\FormBase;
 use Drupal\user\UserAuthInterface;
 use Drupal\user\UserStorageInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -40,6 +41,13 @@ class UserLoginForm extends FormBase {
   protected $userAuth;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a new UserLoginForm.
    *
    * @param \Drupal\Core\Flood\FloodInterface $flood
@@ -48,11 +56,14 @@ class UserLoginForm extends FormBase {
    *   The user storage.
    * @param \Drupal\user\UserAuthInterface $user_auth
    *   The user authentication object.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(FloodInterface $flood, UserStorageInterface $user_storage, UserAuthInterface $user_auth) {
+  public function __construct(FloodInterface $flood, UserStorageInterface $user_storage, UserAuthInterface $user_auth, LoggerInterface $logger) {
     $this->flood = $flood;
     $this->userStorage = $user_storage;
     $this->userAuth = $user_auth;
+    $this->logger = $logger;
   }
 
   /**
@@ -62,7 +73,8 @@ public static function create(ContainerInterface $container) {
     return new static(
       $container->get('flood'),
       $container->get('entity.manager')->getStorage('user'),
-      $container->get('user.auth')
+      $container->get('user.auth'),
+      $container->get('logger.factory')->get('user')
     );
   }
 
@@ -216,12 +228,12 @@ public function validateFinal(array &$form, array &$form_state) {
         $this->setFormError('name', $form_state, $this->t('Sorry, unrecognized username or password. <a href="@password">Have you forgotten your password?</a>', array('@password' => url('user/password', array('query' => array('name' => $form_state['values']['name']))))));
         $accounts = $this->userStorage->loadByProperties(array('name' => $form_state['values']['name']));
         if (!empty($accounts)) {
-          watchdog('user', 'Login attempt failed for %user.', array('%user' => $form_state['values']['name']));
+          $this->logger->notice('Login attempt failed for %user.', array('%user' => $form_state['values']['name']));
         }
         else {
           // If the username entered is not a valid user,
           // only store the IP address.
-          watchdog('user', 'Login attempt failed from %ip.', array('%ip' => $this->getRequest()->getClientIp()));
+          $this->logger->notice('Login attempt failed from %ip.', array('%ip' => $this->getRequest()->getClientIp()));
         }
       }
     }
diff --git a/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php b/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php
index 15d48c8..1f57bd6 100644
--- a/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php
+++ b/core/modules/user/lib/Drupal/user/Form/UserPasswordForm.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageManager;
 use Drupal\user\UserStorageInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -35,16 +36,26 @@ class UserPasswordForm extends FormBase {
   protected $languageManager;
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * Constructs a UserPasswordForm object.
    *
    * @param \Drupal\user\UserStorageInterface $user_storage
    *   The user storage.
    * @param \Drupal\Core\Language\LanguageManager $language_manager
    *   The language manager.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
    */
-  public function __construct(UserStorageInterface $user_storage, LanguageManager $language_manager) {
+  public function __construct(UserStorageInterface $user_storage, LanguageManager $language_manager, LoggerInterface $logger) {
     $this->userStorage = $user_storage;
     $this->languageManager = $language_manager;
+    $this->logger = $logger;
   }
 
   /**
@@ -53,7 +64,8 @@ public function __construct(UserStorageInterface $user_storage, LanguageManager
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager')->getStorage('user'),
-      $container->get('language_manager')
+      $container->get('language_manager'),
+      $container->get('logger.factory')->get('user')
     );
   }
 
@@ -134,7 +146,7 @@ public function submitForm(array &$form, array &$form_state) {
     // Mail one time login URL and instructions using current language.
     $mail = _user_mail_notify('password_reset', $account, $langcode);
     if (!empty($mail)) {
-      watchdog('user', 'Password reset instructions mailed to %name at %email.', array('%name' => $account->getUsername(), '%email' => $account->getEmail()));
+      $this->logger->notice('Password reset instructions mailed to %name at %email.', array('%name' => $account->getUsername(), '%email' => $account->getEmail()));
       drupal_set_message($this->t('Further instructions have been sent to your e-mail address.'));
     }
 
diff --git a/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php b/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php
index bbb3614..1763ea6 100644
--- a/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php
+++ b/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php
@@ -8,6 +8,8 @@
 namespace Drupal\user\Form;
 
 use Drupal\Core\Entity\EntityConfirmFormBase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a deletion confirmation form for Role entity.
@@ -15,6 +17,32 @@
 class UserRoleDelete extends EntityConfirmFormBase {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a new UserRoleDelete object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('user')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getQuestion() {
@@ -42,7 +70,7 @@ public function getConfirmText() {
    */
   public function submit(array $form, array &$form_state) {
     $this->entity->delete();
-    watchdog('user', 'Role %name has been deleted.', array('%name' => $this->entity->label()));
+    $this->logger->notice('Role %name has been deleted.', array('%name' => $this->entity->label()));
     drupal_set_message($this->t('Role %name has been deleted.', array('%name' => $this->entity->label())));
     $form_state['redirect_route']['route_name'] = 'user.role_list';
   }
diff --git a/core/modules/user/lib/Drupal/user/RegisterForm.php b/core/modules/user/lib/Drupal/user/RegisterForm.php
index 30f3018..839ff91 100644
--- a/core/modules/user/lib/Drupal/user/RegisterForm.php
+++ b/core/modules/user/lib/Drupal/user/RegisterForm.php
@@ -10,6 +10,8 @@
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Entity\Query\QueryFactory;
 use Drupal\Core\Language\LanguageManager;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 
 /**
@@ -18,10 +20,30 @@
 class RegisterForm extends AccountForm {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
    * {@inheritdoc}
    */
-  public function __construct(EntityManagerInterface $entity_manager, LanguageManager $language_manager, QueryFactory $entity_query) {
+  public function __construct(EntityManagerInterface $entity_manager, LanguageManager $language_manager, QueryFactory $entity_query, LoggerInterface $logger) {
     parent::__construct($entity_manager, $language_manager, $entity_query);
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity.manager'),
+      $container->get('language_manager'),
+      $container->get('entity.query'),
+      $container->get('logger.factory')->get('user')
+    );
   }
 
   /**
@@ -106,7 +128,7 @@ public function save(array $form, array &$form_state) {
     $form_state['user'] = $account;
     $form_state['values']['uid'] = $account->id();
 
-    watchdog('user', 'New user: %name %email.', array('%name' => $form_state['values']['name'], '%email' => '<' . $form_state['values']['mail'] . '>'), WATCHDOG_NOTICE, l($this->t('Edit'), 'user/' . $account->id() . '/edit'));
+    $this->logger->notice('New user: %name %email.', array('%name' => $form_state['values']['name'], '%email' => '<' . $form_state['values']['mail'] . '>', 'type' => l($this->t('Edit'), 'user/' . $account->id() . '/edit')));
 
     // Add plain text password into user account to generate mail tokens.
     $account->password = $pass;
diff --git a/core/modules/user/lib/Drupal/user/RoleForm.php b/core/modules/user/lib/Drupal/user/RoleForm.php
index 2bed647..bfe824a 100644
--- a/core/modules/user/lib/Drupal/user/RoleForm.php
+++ b/core/modules/user/lib/Drupal/user/RoleForm.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityForm;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Form controller for the role entity edit forms.
@@ -16,6 +18,32 @@
 class RoleForm extends EntityForm {
 
   /**
+   * A logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * Constructs a RoleForm object.
+   *
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   */
+  public function __construct(LoggerInterface $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('logger.factory')->get('user')
+    );
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function form(array $form, array &$form_state) {
@@ -61,11 +89,11 @@ public function save(array $form, array &$form_state) {
     $edit_link = \Drupal::linkGenerator()->generateFromUrl($this->t('Edit'), $this->entity->urlInfo());
     if ($status == SAVED_UPDATED) {
       drupal_set_message($this->t('Role %label has been updated.', array('%label' => $entity->label())));
-      watchdog('user', 'Role %label has been updated.', array('%label' => $entity->label()), WATCHDOG_NOTICE, $edit_link);
+      $this->logger->notice('Role %label has been updated.', array('%label' => $entity->label(), 'link' => $edit_link));
     }
     else {
       drupal_set_message($this->t('Role %label has been added.', array('%label' => $entity->label())));
-      watchdog('user', 'Role %label has been added.', array('%label' => $entity->label()), WATCHDOG_NOTICE, $edit_link);
+      $this->logger->notice('Role %label has been added.', array('%label' => $entity->label(), 'link' => $edit_link));
     }
     $form_state['redirect_route']['route_name'] = 'user.role_list';
   }
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 4b28c81..a01cc9c 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -771,7 +771,7 @@ function user_authenticate($name, $password) {
 function user_login_finalize(UserInterface $account) {
   global $user;
   $user = $account;
-  watchdog('user', 'Session opened for %name.', array('%name' => $account->getUsername()));
+  \Drupal::logger('user')->notice('Session opened for %name.', array('%name' => $account->getUsername()));
   // Update the user table timestamp noting user has logged in.
   // This is also used to invalidate one-time login links.
   $account->setLastLoginTime(REQUEST_TIME);
@@ -903,7 +903,7 @@ function user_cancel($edit, $uid, $method) {
 
   if (!$account) {
     drupal_set_message(t('The user account %id does not exist.', array('%id' => $uid)), 'error');
-    watchdog('user', 'Attempted to cancel non-existing user account: %id.', array('%id' => $uid), WATCHDOG_ERROR);
+    \Drupal::logger('user')->error('Attempted to cancel non-existing user account: %id.', array('%id' => $uid));
     return;
   }
 
@@ -953,6 +953,7 @@ function user_cancel($edit, $uid, $method) {
  */
 function _user_cancel($edit, $account, $method) {
   global $user;
+  $logger = \Drupal::logger('user');
 
   switch ($method) {
     case 'user_cancel_block':
@@ -965,7 +966,7 @@ function _user_cancel($edit, $account, $method) {
       $account->block();
       $account->save();
       drupal_set_message(t('%name has been disabled.', array('%name' => $account->getUsername())));
-      watchdog('user', 'Blocked user: %name %email.', array('%name' => $account->getUsername(), '%email' => '<' . $account->getEmail() . '>'), WATCHDOG_NOTICE);
+      $logger->notice('Blocked user: %name %email.', array('%name' => $account->getUsername(), '%email' => '<' . $account->getEmail() . '>'));
       break;
 
     case 'user_cancel_reassign':
@@ -976,7 +977,7 @@ function _user_cancel($edit, $account, $method) {
       }
       $account->delete();
       drupal_set_message(t('%name has been deleted.', array('%name' => $account->getUsername())));
-      watchdog('user', 'Deleted user: %name %email.', array('%name' => $account->getUsername(), '%email' => '<' . $account->getEmail() . '>'), WATCHDOG_NOTICE);
+      $logger->notice('Deleted user: %name %email.', array('%name' => $account->getUsername(), '%email' => '<' . $account->getEmail() . '>'));
       break;
   }
 
@@ -1686,7 +1687,7 @@ function user_toolbar() {
 function user_logout() {
   $user = \Drupal::currentUser();
 
-  watchdog('user', 'Session closed for %name.', array('%name' => $user->getUsername()));
+  \Drupal::logger('user')->notice('Session closed for %name.', array('%name' => $user->getUsername()));
 
   \Drupal::moduleHandler()->invokeAll('user_logout', array($user));
 
diff --git a/core/modules/user/user.pages.inc b/core/modules/user/user.pages.inc
index 964323c..389fab3 100644
--- a/core/modules/user/user.pages.inc
+++ b/core/modules/user/user.pages.inc
@@ -60,7 +60,7 @@ function user_pass_reset($form, &$form_state, $uid, $timestamp, $hashed_pass, $a
           // user_login_finalize() also updates the login timestamp of the
           // user, which invalidates further use of the one-time login link.
           user_login_finalize($account);
-          watchdog('user', 'User %name used one-time login link at time %timestamp.', array('%name' => $account->getUsername(), '%timestamp' => $timestamp));
+          \Drupal::logger('user')->notice('User %name used one-time login link at time %timestamp.', array('%name' => $account->getUsername(), '%timestamp' => $timestamp));
           drupal_set_message(t('You have just used your one-time login link. It is no longer necessary to use this link to log in. Please change your password.'));
           // Let the user's password be changed without the current password check.
           $token = Crypt::randomBytesBase64(55);
diff --git a/core/modules/views/tests/modules/views_test_data/lib/Drupal/views_test_data/Plugin/views/display/DisplayTest.php b/core/modules/views/tests/modules/views_test_data/lib/Drupal/views_test_data/Plugin/views/display/DisplayTest.php
index 1447c67..c0f54cb 100644
--- a/core/modules/views/tests/modules/views_test_data/lib/Drupal/views_test_data/Plugin/views/display/DisplayTest.php
+++ b/core/modules/views/tests/modules/views_test_data/lib/Drupal/views_test_data/Plugin/views/display/DisplayTest.php
@@ -95,7 +95,7 @@ public function buildOptionsForm(&$form, &$form_state) {
    */
   public function validateOptionsForm(&$form, &$form_state) {
     parent::validateOptionsForm($form, $form_state);
-    watchdog('views', $form_state['values']['test_option']);
+    \Drupal::logger('views')->notice($form_state['values']['test_option']);
     switch ($form_state['section']) {
       case 'test_option':
         if (!trim($form_state['values']['test_option'])) {
diff --git a/core/tests/Drupal/Tests/Core/Controller/ExceptionControllerTest.php b/core/tests/Drupal/Tests/Core/Controller/ExceptionControllerTest.php
index 50d0172..f725af5 100644
--- a/core/tests/Drupal/Tests/Core/Controller/ExceptionControllerTest.php
+++ b/core/tests/Drupal/Tests/Core/Controller/ExceptionControllerTest.php
@@ -40,13 +40,14 @@ public function test405HTML() {
     $title_resolver = $this->getMock('Drupal\Core\Controller\TitleResolverInterface');
     $translation = $this->getMock('Drupal\Core\StringTranslation\TranslationInterface');
     $url_generator = $this->getMock('Drupal\Core\Routing\UrlGeneratorInterface');
+    $logger_factory = $this->getMock('Drupal\Core\Logger\LoggerChannelFactoryInterface');
 
     $content_negotiation = $this->getMock('Drupal\Core\ContentNegotiation');
     $content_negotiation->expects($this->any())
       ->method('getContentType')
       ->will($this->returnValue('html'));
 
-    $exception_controller = new ExceptionController($content_negotiation, $title_resolver, $html_page_renderer, $html_fragment_renderer, $translation, $url_generator);
+    $exception_controller = new ExceptionController($content_negotiation, $title_resolver, $html_page_renderer, $html_fragment_renderer, $translation, $url_generator, $logger_factory);
     $response = $exception_controller->execute($flat_exception, new Request());
     $this->assertEquals($response->getStatusCode(), 405, 'HTTP status of response is correct.');
     $this->assertEquals($response->getContent(), 'Method Not Allowed', 'HTTP response body is correct.');
diff --git a/core/tests/Drupal/Tests/Core/EventSubscriber/SpecialAttributesRouteSubscriberTest.php b/core/tests/Drupal/Tests/Core/EventSubscriber/SpecialAttributesRouteSubscriberTest.php
index 65ba07d..512a765 100644
--- a/core/tests/Drupal/Tests/Core/EventSubscriber/SpecialAttributesRouteSubscriberTest.php
+++ b/core/tests/Drupal/Tests/Core/EventSubscriber/SpecialAttributesRouteSubscriberTest.php
@@ -42,7 +42,8 @@ public static function getInfo() {
   protected function setUp() {
     parent::setUp();
 
-    $this->specialAttributesRouteSubscriber = new SpecialAttributesRouteSubscriber();
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
+    $this->specialAttributesRouteSubscriber = new SpecialAttributesRouteSubscriber($logger);
   }
 
   /**
@@ -117,10 +118,6 @@ public function testOnRouteBuildingInvalidVariables(Route $route) {
 }
 
 namespace {
-  if (!function_exists('watchdog')) {
-    function watchdog($type, $message, array $args = array()) {
-    }
-  }
   if (!function_exists('drupal_set_message')) {
     function drupal_set_message($type = NULL, $message = '') {
     }
diff --git a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
index cdbd0f6..aed4414 100644
--- a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
@@ -115,7 +115,8 @@ protected function setUp() {
     $this->extensionDiscovery = $this->getMockBuilder('Drupal\Core\Extension\ExtensionDiscovery')
       ->disableOriginalConstructor()
       ->getMock();
-    $this->themeHandler = new TestThemeHandler($this->configFactory, $this->moduleHandler, $this->state, $this->infoParser, $this->configInstaller, $this->routeBuilder, $this->extensionDiscovery);
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
+    $this->themeHandler = new TestThemeHandler($this->configFactory, $this->moduleHandler, $this->state, $this->infoParser, $logger, $this->configInstaller, $this->routeBuilder, $this->extensionDiscovery);
 
     $cache_backend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
     $this->getContainerWithCacheBins($cache_backend);
diff --git a/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php b/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php
index 03ba5eb..ca5fca4 100644
--- a/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php
+++ b/core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php
@@ -446,8 +446,4 @@ public static function create(ContainerInterface $container) {
 namespace {
   function test_form_id_custom_submit(array &$form, array &$form_state) {
   }
-  // @todo Remove once watchdog() is removed.
-  if (!defined('WATCHDOG_ERROR')) {
-    define('WATCHDOG_ERROR', 3);
-  }
 }
diff --git a/core/tests/Drupal/Tests/Core/Form/FormTestBase.php b/core/tests/Drupal/Tests/Core/Form/FormTestBase.php
index 280e54e..101ee3e 100644
--- a/core/tests/Drupal/Tests/Core/Form/FormTestBase.php
+++ b/core/tests/Drupal/Tests/Core/Form/FormTestBase.php
@@ -114,6 +114,11 @@
    */
   protected $httpKernel;
 
+  /**
+   * @var \PHPUnit_Framework_MockObject_MockObject|\Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
   public function setUp() {
     $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
 
@@ -141,8 +146,9 @@ public function setUp() {
     $this->eventDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
     $this->requestStack = new RequestStack();
     $this->requestStack->push($this->request);
+    $this->logger = $this->getMock('Drupal\Core\Logger\LoggerChannelInterface');
     $this->formValidator = $this->getMockBuilder('Drupal\Core\Form\FormValidator')
-      ->setConstructorArgs(array($this->requestStack, $this->getStringTranslationStub(), $this->csrfToken))
+      ->setConstructorArgs(array($this->requestStack, $this->getStringTranslationStub(), $this->csrfToken, $this->logger))
       ->setMethods(array('drupalSetMessage'))
       ->getMock();
     $this->formSubmitter = $this->getMockBuilder('Drupal\Core\Form\FormSubmitter')
diff --git a/core/tests/Drupal/Tests/Core/Form/FormValidatorTest.php b/core/tests/Drupal/Tests/Core/Form/FormValidatorTest.php
index efb06c4..97f6a10 100644
--- a/core/tests/Drupal/Tests/Core/Form/FormValidatorTest.php
+++ b/core/tests/Drupal/Tests/Core/Form/FormValidatorTest.php
@@ -5,7 +5,7 @@
  * Contains \Drupal\Tests\Core\Form\FormValidatorTest.
  */
 
-namespace Drupal\Tests\Core\Form {
+namespace Drupal\Tests\Core\Form;
 
 use Drupal\Component\Utility\String;
 use Drupal\Tests\UnitTestCase;
@@ -123,9 +123,10 @@ public function testValidateInvalidFormToken() {
     $csrf_token->expects($this->once())
       ->method('validate')
       ->will($this->returnValue(FALSE));
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
 
     $form_validator = $this->getMockBuilder('Drupal\Core\Form\FormValidator')
-      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token))
+      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token, $logger))
       ->setMethods(array('setErrorByName', 'doValidateForm'))
       ->getMock();
     $form_validator->expects($this->once())
@@ -152,9 +153,10 @@ public function testValidateValidFormToken() {
     $csrf_token->expects($this->once())
       ->method('validate')
       ->will($this->returnValue(TRUE));
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
 
     $form_validator = $this->getMockBuilder('Drupal\Core\Form\FormValidator')
-      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token))
+      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token, $logger))
       ->setMethods(array('setErrorByName', 'doValidateForm'))
       ->getMock();
     $form_validator->expects($this->never())
@@ -235,8 +237,10 @@ public function testSetErrorByName($limit_validation_errors, $expected_errors, $
     $csrf_token = $this->getMockBuilder('Drupal\Core\Access\CsrfTokenGenerator')
       ->disableOriginalConstructor()
       ->getMock();
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
+
     $form_validator = $this->getMockBuilder('Drupal\Core\Form\FormValidator')
-      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token))
+      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token, $logger))
       ->setMethods(array('drupalSetMessage'))
       ->getMock();
     $form_validator->expects($set_message ? $this->once() : $this->never())
@@ -274,8 +278,10 @@ public function testSetElementErrorsFromFormState() {
     $csrf_token = $this->getMockBuilder('Drupal\Core\Access\CsrfTokenGenerator')
       ->disableOriginalConstructor()
       ->getMock();
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
+
     $form_validator = $this->getMockBuilder('Drupal\Core\Form\FormValidator')
-      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token))
+      ->setConstructorArgs(array($request_stack, $this->getStringTranslationStub(), $csrf_token, $logger))
       ->setMethods(array('drupalSetMessage'))
       ->getMock();
 
@@ -428,8 +434,10 @@ public function testRequiredErrorMessage($element, $expected_message) {
     $csrf_token = $this->getMockBuilder('Drupal\Core\Access\CsrfTokenGenerator')
       ->disableOriginalConstructor()
       ->getMock();
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
+
     $form_validator = $this->getMockBuilder('Drupal\Core\Form\FormValidator')
-      ->setConstructorArgs(array(new RequestStack(), $this->getStringTranslationStub(), $csrf_token))
+      ->setConstructorArgs(array(new RequestStack(), $this->getStringTranslationStub(), $csrf_token, $logger))
       ->setMethods(array('executeValidateHandlers', 'setErrorByName'))
       ->getMock();
     $form_validator->expects($this->once())
@@ -505,18 +513,20 @@ public function testPerformRequiredValidation($element, $expected_message, $call
     $csrf_token = $this->getMockBuilder('Drupal\Core\Access\CsrfTokenGenerator')
       ->disableOriginalConstructor()
       ->getMock();
+    $logger = $this->getMock('Psr\Log\LoggerInterface');
+
     $form_validator = $this->getMockBuilder('Drupal\Core\Form\FormValidator')
-      ->setConstructorArgs(array(new RequestStack(), $this->getStringTranslationStub(), $csrf_token))
-      ->setMethods(array('setErrorByName', 'watchdog'))
+      ->setConstructorArgs(array(new RequestStack(), $this->getStringTranslationStub(), $csrf_token, $logger))
+      ->setMethods(array('setErrorByName'))
       ->getMock();
     $form_validator->expects($this->once())
       ->method('setErrorByName')
       ->with('test', $this->isType('array'), $expected_message);
 
     if ($call_watchdog) {
-      $form_validator->expects($this->once())
-        ->method('watchdog')
-        ->with('form');
+      $logger->expects($this->once())
+        ->method('error')
+        ->with($this->isType('string'), $this->isType('array'));
     }
 
     $form = array();
@@ -611,14 +621,3 @@ protected function getFormStateDefaults() {
   }
 
 }
-
-}
-
-namespace {
-  if (!defined('WATCHDOG_ERROR')) {
-    define('WATCHDOG_ERROR', 3);
-  }
-  if (!defined('WATCHDOG_NOTICE')) {
-    define('WATCHDOG_NOTICE', 5);
-  }
-}
diff --git a/core/update.php b/core/update.php
index b6accf3..8d80ec5 100644
--- a/core/update.php
+++ b/core/update.php
@@ -226,7 +226,7 @@ function update_info_page() {
 function update_access_denied_page() {
   drupal_add_http_header('Status', '403 Forbidden');
   header(\Drupal::request()->server->get('SERVER_PROTOCOL') . ' 403 Forbidden');
-  watchdog('access denied', 'update.php', array(), WATCHDOG_WARNING);
+  \Drupal::logger('access denied')->warning('update.php');
   $output = '<p>Access denied. You are not authorized to access this page. Log in using either an account with the <em>administer software updates</em> permission or the site maintenance account (the account you created during installation). If you cannot log in, you will have to edit <code>settings.php</code> to bypass this access check. To do this:</p>
 <ol>
  <li>With a text editor find the settings.php file on your system. From the main Drupal directory that you installed all the files into, go to <code>sites/your_site_name</code> if such directory exists, or else to <code>sites/default</code> which applies otherwise.</li>
