diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 6061569..ba4e23a 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -1638,7 +1638,7 @@ function watchdog_exception($type, Exception $exception, $message = NULL, $varia
 }
 
 /**
- * Log a system message.
+ * Log a system message if its severity level warrants it.
  *
  * @param $type
  *   The category to which this message belongs. Can be any string, but the
@@ -1655,7 +1655,8 @@ function watchdog_exception($type, Exception $exception, $message = NULL, $varia
  *   translate.
  * @param $severity
  *   The severity of the message, as per RFC 3164. Possible values are
- *   WATCHDOG_ERROR, WATCHDOG_WARNING, etc.
+ *   WATCHDOG_ERROR, WATCHDOG_WARNING, etc. Events less severe than the current
+ *   limit will be ignored.
  * @param $link
  *   A link to associate with the message.
  *
@@ -1670,6 +1671,10 @@ function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NO
   // It is possible that the error handling will itself trigger an error. In that case, we could
   // end up in an infinite loop. To avoid that, we implement a simple static semaphore.
   if (!$in_error_state && function_exists('module_implements')) {
+    if ($severity > variable_get('watchdog_limit', WATCHDOG_DEBUG)) {
+      return;
+    }
+
     $in_error_state = TRUE;
 
     // Prepare the fields to be logged
@@ -3105,6 +3110,7 @@ function registry_update() {
  */
 function &drupal_static($name, $default_value = NULL, $reset = FALSE) {
   static $data = array(), $default = array();
+
   // First check if dealing with a previously defined static variable.
   if (isset($data[$name]) || array_key_exists($name, $data)) {
     // Non-NULL $name and both $data[$name] and $default[$name] statics exist.
diff --git a/modules/system/system.test b/modules/system/system.test
index 846653b..3b0274d 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -2515,3 +2515,69 @@ class UuidUnitTestCase extends DrupalUnitTestCase {
 
   }
 }
+
+/**
+ * Test the behaviour of watchdog() without depending on dblog.module.
+ */
+class WatchdogTest extends DrupalWebTestCase {
+  public $module = 'watchdog_test';
+  public $function = 'watchdog_test_watchdog';
+
+  /**
+   * Override the default "standard" profile for this test, we need to include
+   * a test-specific module, which should not be present on a standard install.
+   *
+   * @var string
+   */
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Watchdog_limit observance',
+      'description' => 'Make sure watchdog() applies the watchdog_limit variable',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('watchdog_test');
+  }
+
+  function assertEntry($message) {
+    $logged = variable_get($this->function, NULL);
+    return $this->assertEqual($logged, $message, t('Event is logged and message is unchanged'));
+  }
+
+  function assertNoEntry($message) {
+    $logged = variable_get($this->function, NULL);
+    return $this->assertNull($logged, t('Event is not logged.'));
+  }
+  /**
+   * Test the default and non-default behaviours
+   */
+  function testWatchdogLimit() {
+    $message = $this->randomString(32);
+    $this->pass(t('Logging %message', array('%message' => $message)));
+    // Default limit should be WATCHDOG_DEBUG
+    $this->assertEqual(variable_get('watchdog_limit', WATCHDOG_DEBUG), WATCHDOG_DEBUG,
+      t('watchdog_limit defaults to WATCHDOG_DEBUG'));
+    variable_del($this->function);
+    watchdog($this->module, $message, NULL, WATCHDOG_DEBUG);
+    $this->assertEntry($message);
+
+    // Now request a higher level: unimportant events should be ignored...
+    variable_del($this->function);
+    variable_set('watchdog_limit', WATCHDOG_NOTICE);
+    watchdog($this->module, $message, NULL, WATCHDOG_DEBUG);
+    $this->assertNoEntry($message);
+
+    // ... but events at the limit or more important should be logged
+    variable_del($this->function);
+    watchdog($this->module, $message, NULL, WATCHDOG_NOTICE);
+    $this->assertEntry($message);
+
+    variable_del($this->function);
+    watchdog($this->module, $message, NULL, WATCHDOG_ERROR);
+    $this->assertEntry($message);
+  }
+}
diff --git a/modules/system/tests/watchdog_test.info b/modules/system/tests/watchdog_test.info
new file mode 100644
index 0000000..6d48507
--- /dev/null
+++ b/modules/system/tests/watchdog_test.info
@@ -0,0 +1,6 @@
+name = "Watchdog limit test"
+description = "Support module for testing the watchdog function."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/modules/system/tests/watchdog_test.module b/modules/system/tests/watchdog_test.module
new file mode 100644
index 0000000..bd3e0b5
--- /dev/null
+++ b/modules/system/tests/watchdog_test.module
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * Implements hook_watchdog().
+ */
+function watchdog_test_watchdog(array $log_entry) {
+  variable_set(__FUNCTION__, $log_entry['message']);
+}
\ No newline at end of file
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index 0472f02..34871af 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -358,6 +358,14 @@ ini_set('session.cookie_lifetime', 2000000);
 # $conf['reverse_proxy_addresses'] = array('a.b.c.d', ...);
 
 /**
+ * By default, Drupal logs all events using the watchdog() function, whatever
+ * their severity. By defining a higher severity limit, watchdog will ignore
+ * less important events, reducing its logging workload. Values are those of the
+ * WATCHDOG_* constants from bootstrap.inc.
+ */
+# $conf['watchdog_limit'] = WATCHDOG_DEBUG;
+
+/**
  * Page caching:
  *
  * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page
