diff --git a/includes/common.inc b/includes/common.inc
index 38ea92abea4..4f164267636 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -5538,14 +5538,36 @@ function drupal_cron_run() {
     watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
   }
   else {
+    $queue_name_previous = '';
+
     // Make sure every queue exists. There is no harm in trying to recreate an
     // existing queue.
     foreach ($queues as $queue_name => $info) {
+      // Log a message saying that the queue started.
+      watchdog('cron', 'Starting execution of queue @queue_name.', array(
+        '@queue_name' => $queue_name,
+      ), WATCHDOG_NOTICE);
+
+      timer_start('cron_queue_' . $queue_name);
       DrupalQueue::get($queue_name)->createQueue();
+      timer_stop('cron_queue_' . $queue_name);
+
+      // Log a message saying that the queue ended.
+      watchdog('cron', 'Execution of queue @queue_name took @time.', array(
+        '@queue_name' => $queue_name,
+        '@time' => timer_read('cron_queue_' . $queue_name) . 'ms',
+      ), WATCHDOG_NOTICE);
     }
 
+    $module_previous = '';
+
     // Iterate through the modules calling their cron handlers (if any):
     foreach (module_implements('cron') as $module) {
+      // Log a message saying that the cron event started.
+      watchdog('cron', 'Starting execution of @module_cron().', array('@module' => $module), WATCHDOG_NOTICE);
+
+      timer_start('cron_' . $module);
+
       // Do not let an exception thrown by one module disturb another.
       try {
         module_invoke($module, 'cron');
@@ -5553,6 +5575,14 @@ function drupal_cron_run() {
       catch (Exception $e) {
         watchdog_exception('cron', $e);
       }
+
+      timer_stop('cron_' . $module);
+
+      // Log a message saying that the cron event ended.
+      watchdog('cron', 'Execution of @module_cron() took @time.', array(
+        '@module' => $module,
+        '@time' => timer_read('cron_' . $module) . 'ms',
+      ), WATCHDOG_NOTICE);
     }
 
     // Record cron time.
diff --git a/modules/dblog/dblog.test b/modules/dblog/dblog.test
index 9c266656fd8..4af3cea0286 100644
--- a/modules/dblog/dblog.test
+++ b/modules/dblog/dblog.test
@@ -128,12 +128,23 @@ private function verifyCron($row_limit) {
     $count = db_query('SELECT COUNT(wid) FROM {watchdog}')->fetchField();
     $this->assertTrue($count > $row_limit, format_string('Dblog row count of @count exceeds row limit of @limit', array('@count' => $count, '@limit' => $row_limit)));
 
+    // Get last ID to compare against; log entries get deleted, so we can't
+    // reliably add the number of newly created log entries to the current count
+    // to measure number of log entries created by cron.
+    $last_id = db_query('SELECT MAX(wid) FROM {watchdog}')->fetchField();
+
     // Run a cron job.
     $this->cronRun();
-    // Verify that the database log row count equals the row limit plus one
-    // because cron adds a record after it runs.
-    $count = db_query('SELECT COUNT(wid) FROM {watchdog}')->fetchField();
-    $this->assertTrue($count == $row_limit + 1, format_string('Dblog row count of @count equals row limit of @limit plus one', array('@count' => $count, '@limit' => $row_limit)));
+
+    // Get last ID after cron was run.
+    $current_id = db_query('SELECT MAX(wid) FROM {watchdog}')->fetchField();
+
+    // Get the number of enabled modules. Cron adds a log entry for each module.
+    $list = module_implements('cron');
+    $module_count = count($list);
+
+    $count = $current_id - $last_id;
+    $this->assertTrue(($current_id - $last_id) == $module_count + 2, format_string('Cron added @count of @expected new log entries', array('@count' => $count, '@expected' => $module_count + 2)));
   }
 
   /**
