diff -ru a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -57,10 +57,15 @@
  */
 const ERROR_REPORTING_DISPLAY_ALL = 'all';
 
+/*
+ * Error reporting type of debug information: Add stacktrace or backtrace information to logs.
+ */
+const ERROR_REPORTING_DISPLAY_LOGS = 1;  // Do not start at zero.
+
 /**
- * Error reporting level: display all messages, plus backtrace information.
+ * Error reporting type of debug information: Add stacktrace or backtrace information to messages on page.
  */
-const ERROR_REPORTING_DISPLAY_VERBOSE = 'verbose';
+const ERROR_REPORTING_DISPLAY_MESSAGES = 2;
 
 /**
  * @defgroup logging_severity_levels Logging severity levels
diff -ru a/core/includes/errors.inc b/core/includes/errors.inc
--- a/core/includes/errors.inc
+++ b/core/includes/errors.inc
@@ -73,7 +73,7 @@
       '%file' => $caller['file'],
       '%line' => $caller['line'],
       'severity_level' => $severity_level,
-      'backtrace' => $backtrace,
+      '!backtrace' => $backtrace,
     ), $error_level == E_RECOVERABLE_ERROR);
   }
 }
@@ -122,7 +122,7 @@
     '%file' => $caller['file'],
     '%line' => $caller['line'],
     'severity_level' => WATCHDOG_ERROR,
-    'backtrace' => $backtrace,
+    '!backtrace' => $backtrace,
   );
 }
 
@@ -155,8 +155,7 @@
 function error_displayable($error = NULL) {
   $error_level = config('system.logging')->get('error_level');
   $updating = (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update');
-  $all_errors_displayed = ($error_level == ERROR_REPORTING_DISPLAY_ALL) ||
-    ($error_level == ERROR_REPORTING_DISPLAY_VERBOSE);
+  $all_errors_displayed = ($error_level == ERROR_REPORTING_DISPLAY_ALL);
   $error_needs_display = ($error_level == ERROR_REPORTING_DISPLAY_SOME &&
     isset($error) && $error['%type'] != 'Notice' && $error['%type'] != 'Strict warning');
 
@@ -186,8 +185,11 @@
   }
 
   // Backtrace array is not a valid replacement value for t().
-  $backtrace = $error['backtrace'];
-  unset($error['backtrace']);
+  $backtrace = isset($error['!backtrace']) ? $error['!backtrace'] : '';
+  unset($error['!backtrace']);
+  if (!$backtrace) {
+    $backtrace = debug_backtrace(TRUE);
+  }
 
   // When running inside the testing framework, we relay the errors
   // to the tested site by the way of HTTP headers.
@@ -209,7 +211,29 @@
     $number++;
   }
 
-  watchdog('php', '%type: !message in %function (line %line of %file).', $error, $error['severity_level']);
+  $st_opts=variable_get('error_stacktrace_display', array());
+  if (array_sum($st_opts)) {
+    $error['!stacktrace'] = format_stacktrace($backtrace);
+  }
+  $bt_opts=variable_get('error_backtrace_display', array());
+  if (array_sum($bt_opts)) {
+    $error['!backtrace'] = format_backtrace($backtrace);
+  }
+
+  if ($st_opts[ERROR_REPORTING_DISPLAY_LOGS] || $bt_opts[ERROR_REPORTING_DISPLAY_LOGS]) {
+    $message_line='%type: <pre>!message</pre><br/>LINE: %line<br/>FUNCTION: %function<br/>FILE: %file';
+    if ($st_opts[ERROR_REPORTING_DISPLAY_LOGS]) {
+      $message_line .= ' !stacktrace';
+    }
+    if ($bt_opts[ERROR_REPORTING_DISPLAY_LOGS]) {
+      $message_line .= ' !backtrace';
+    }
+  } else {
+    $message_line='%type: !message in %function (line %line of %file).';
+  }
+  if (!array_has_PDOException($error)) { // If it was a DB error don't write to the DB.
+    watchdog('php', $message_line, $error, $error['severity_level']);
+  }
 
   if (drupal_is_cli()) {
     if ($fatal) {
@@ -256,14 +280,19 @@
       // Check if verbose error reporting is on.
       $error_level = config('system.logging')->get('error_level');
 
-      if ($error_level == ERROR_REPORTING_DISPLAY_VERBOSE) {
-        // First trace is the error itself, already contained in the message.
-        // While the second trace is the error source and also contained in the
-        // message, the message doesn't contain argument values, so we output it
-        // once more in the backtrace.
-        array_shift($backtrace);
-        // Generate a backtrace containing only scalar argument values.
-        $message .= '<pre class="backtrace">' . format_backtrace($backtrace) . '</pre>';
+      if ($error_level != ERROR_REPORTING_HIDE) {
+        if ($st_opts[ERROR_REPORTING_DISPLAY_MESSAGES]) {
+          $message .= $error['!stacktrace'];
+        }
+        if ($bt_opts[ERROR_REPORTING_DISPLAY_MESSAGES]) {
+          // First trace is the error itself, already contained in the message.
+          // While the second trace is the error source and also contained in the
+          // message, the message doesn't contain argument values, so we output it
+          // once more in the backtrace.
+          array_shift($backtrace);
+          // Generate a backtrace containing only scalar argument values.
+          $message .= '<pre class="backtrace">' . format_backtrace($backtrace) . '</pre>';
+        }
       }
       drupal_set_message($message, $class, TRUE);
     }
@@ -295,7 +324,7 @@
  * @return
  *   An associative array with keys 'file', 'line' and 'function'.
  */
-function _drupal_get_last_caller(&$backtrace) {
+function _drupal_get_last_caller($backtrace) {
   // Errors that occur inside PHP internal functions do not generate
   // information about file and line. Ignore black listed functions.
   $blacklist = array('debug', '_drupal_error_handler', '_drupal_exception_handler');
@@ -324,6 +353,28 @@
 }
 
 /**
+ * We don't want to call watchdog if anywhere in the array there is a PDOException since PHP won't let us log a PDOException back to the DB.
+ * The function will check for the exception and return TRUE if it finds it in an array. It checks recursively through the array.
+ *
+ * @param type $array
+ *   The array to check, will likely be $error from calling function
+ *
+ * @return boolean
+ *   TRUE if found.
+ */
+function array_has_PDOException($array) {
+  if (array_key_exists('%type', $array) && stripos($array['%type'], 'PDOException') !== FALSE) {
+    return TRUE;
+  }
+  foreach ($array as $value) {
+    if (is_array($value) && array_has_PDOException($value)) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
  * Formats a backtrace into a plain-text string.
  *
  * The calls show values for scalar arguments and type names for complex ones.
@@ -357,5 +408,64 @@
     }
     $return .= $call['function'] . '(' . implode(', ', $call['args']) . ")\n";
   }
-  return $return;
+  return '<br/><br/>BACKTRACE:<br/>' . $return;
+}
+
+/**
+ * Formats a stacktrace into an HTML table.
+ *
+ * @param array $backtrace
+ *   A standard PHP backtrace.
+ *
+ * @return string
+ *   An HTML string.
+ */
+function format_stacktrace(array $backtrace) {
+  $callstack = array_reverse($backtrace, TRUE);
+  // TODO: Styling should be in CSS or should make use of drupal's existing CSS.
+  $cs =<<<EOT
+<style>
+  .stacktrace td, .stacktrace th {padding: 0 0.5em;}
+  .stacktrace .row-bunch {border-top: 1px solid;}
+  pre.stacktrace {font-family: "Andale Mono","Courier New",Courier,Lucidatypewriter,Fixed,monospace;}
+</style>
+<pre class="stacktrace">
+  <table>
+    <thead>
+      <tr>
+        <th>Index</th>
+        <th>Function called</th>
+        <th>Caller line</th>
+        <th>Caller file</th>
+      </tr>
+    </thead>
+    <tbody>
+EOT
+  ;
+  $row_bunching=3;
+  foreach ($callstack AS $k => &$v) {
+    $row_bunching++;
+    if ($row_bunching >= 3) {
+      $row_class = 'class="row-bunch"';
+      $row_bunching=0;
+    } else {
+      $row_class = '';
+    }
+    $cs .= "<tr $row_class><td>$k</td>";
+    foreach (array('function'=>0, 'line'=>0, 'file'=>0) as $k2 => $v2) {
+      if (isset($v[$k2])) {
+        $data = str_replace(DRUPAL_ROOT . '/', '', $v[$k2]);
+        $data = htmlentities($data);
+        $cs .= "<td>$data</td>";
+      }
+    }
+    $cs .= '</tr>';
+  }
+  $cs .=<<<EOT
+    </tbody>
+  </table>
+</pre>
+EOT
+  ;
+  return '<br/><br/>STACKTRACE:' . $cs;
 }
diff -ru a/core/modules/dblog/dblog.module b/core/modules/dblog/dblog.module
--- a/core/modules/dblog/dblog.module
+++ b/core/modules/dblog/dblog.module
@@ -145,20 +145,24 @@
  * Note: Some values may be truncated to meet database column size restrictions.
  */
 function dblog_watchdog(array $log_entry) {
-  Database::getConnection('default', 'default')->insert('watchdog')
-    ->fields(array(
-      'uid' => $log_entry['uid'],
-      'type' => substr($log_entry['type'], 0, 64),
-      'message' => $log_entry['message'],
-      'variables' => serialize($log_entry['variables']),
-      'severity' => $log_entry['severity'],
-      'link' => substr($log_entry['link'], 0, 255),
-      'location' => $log_entry['request_uri'],
-      'referer' => $log_entry['referer'],
-      'hostname' => substr($log_entry['ip'], 0, 128),
-      'timestamp' => $log_entry['timestamp'],
-    ))
-    ->execute();
+  if (!array_has_PDOException($log_entry)) { // If it was a DB error don't write to the DB.
+    Database::getConnection('default', 'default')->insert('watchdog')
+      ->fields(array(
+        'uid' => $log_entry['uid'],
+        'type' => substr($log_entry['type'], 0, 64),
+        'message' => $log_entry['message'],
+        'variables' => serialize($log_entry['variables']),
+        'severity' => $log_entry['severity'],
+        'link' => substr($log_entry['link'], 0, 255),
+        'location' => $log_entry['request_uri'],
+        'referer' => $log_entry['referer'],
+        'hostname' => substr($log_entry['ip'], 0, 128),
+        'timestamp' => $log_entry['timestamp'],
+      ))
+      ->execute();
+  } else {
+    _drupal_log_error($log_entry, TRUE);
+  }
 }
 
 /**
Only in b/core/modules/dblog: dblog.module.orig
diff -ru a/core/modules/system/lib/Drupal/system/Tests/System/ErrorHandlerTest.php b/core/modules/system/lib/Drupal/system/Tests/System/ErrorHandlerTest.php
--- a/core/modules/system/lib/Drupal/system/Tests/System/ErrorHandlerTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/ErrorHandlerTest.php
@@ -53,14 +53,7 @@
       '%file' => drupal_get_path('module', 'error_test') . '/error_test.module',
     );
 
-    // Set error reporting to display verbose notices.
-    config('system.logging')->set('error_level', ERROR_REPORTING_DISPLAY_VERBOSE)->save();
-    $this->drupalGet('error-test/generate-warnings');
-    $this->assertResponse(200, 'Received expected HTTP status code.');
-    $this->assertErrorMessage($error_notice);
-    $this->assertErrorMessage($error_warning);
-    $this->assertErrorMessage($error_user_notice);
-    $this->assertRaw('<pre class="backtrace">', 'Found pre element with backtrace class.');
+    // TODO: ADD tests for ERROR_REPORTING_DISPLAY_LOGS & ERROR_REPORTING_DISPLAY_MESSAGES
 
     // Set error reporting to collect notices.
     $config->set('error_level', ERROR_REPORTING_DISPLAY_ALL)->save();
diff -ru a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -1607,11 +1607,32 @@
       ERROR_REPORTING_HIDE => t('None'),
       ERROR_REPORTING_DISPLAY_SOME => t('Errors and warnings'),
       ERROR_REPORTING_DISPLAY_ALL => t('All messages'),
-      ERROR_REPORTING_DISPLAY_VERBOSE => t('All messages, with backtrace information'),
     ),
     '#description' => t('It is recommended that sites running on production environments do not display any errors.'),
   );
 
+  $form['error_stacktrace_display'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Choose how to monitor stacktrace information.'),
+    '#default_value' => config('system.logging')->get('error_stacktrace_display'),
+    '#options' => array(
+      ERROR_REPORTING_DISPLAY_MESSAGES => t('Show on page'),
+      ERROR_REPORTING_DISPLAY_LOGS => t('Add to log'),
+    ),
+    '#description' => t('On production environments only use "Add to log" and then only when needed.'),
+  );
+
+  $form['error_backtrace_display'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Choose how to monitor backtrace information.'),
+    '#default_value' => config('system.logging')->get('error_backtrace_display'),
+    '#options' => array(
+      ERROR_REPORTING_DISPLAY_MESSAGES => t('Show on page'),
+      ERROR_REPORTING_DISPLAY_LOGS => t('Add to log'),
+    ),
+    '#description' => t('On production environments only use "Add to log" and then only when needed.'),
+  );
+
   return system_config_form($form, $form_state);
 }
 
@@ -1862,6 +1883,28 @@
     $form['image_toolkit_settings'] = $function();
   }
 
+  $form['error_stacktrace_display'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Choose how to monitor stacktrace information.'),
+    '#default_value' => variable_get('error_stacktrace_display', array()),
+    '#options' => array(
+      ERROR_REPORTING_DISPLAY_MESSAGES => t('Show on page'),
+      ERROR_REPORTING_DISPLAY_LOGS => t('Add to log'),
+    ),
+    '#description' => t('On production environments only use "Add to log" and then only when needed.'),
+  );
+
+  $form['error_backtrace_display'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Choose how to monitor backtrace information.'),
+    '#default_value' => variable_get('error_backtrace_display', array()),
+    '#options' => array(
+      ERROR_REPORTING_DISPLAY_MESSAGES => t('Show on page'),
+      ERROR_REPORTING_DISPLAY_LOGS => t('Add to log'),
+    ),
+    '#description' => t('On production environments only use "Add to log" and then only when needed.'),
+  );
+
   return system_settings_form($form);
 }
