diff --git a/core/composer.json b/core/composer.json
index eaf5983..a67760f 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -8,6 +8,7 @@
     "symfony/event-dispatcher": "2.1.*",
     "symfony/http-foundation": "2.1.*",
     "symfony/http-kernel": "2.1.*",
+    "symfony/monolog-bridge": "2.1.1",
     "symfony/routing": "2.1.*",
     "symfony/serializer": "2.1.*",
     "symfony/yaml": "2.1.*",
diff --git a/core/composer.lock b/core/composer.lock
index 5c8cd01..b64b46d 100644
--- a/core/composer.lock
+++ b/core/composer.lock
@@ -26,6 +26,10 @@
             "version": "v2.1.0-RC2"
         },
         {
+            "package": "symfony/monolog-bridge",
+            "version": "v2.1.1"
+        },
+        {
             "package": "symfony/process",
             "version": "v2.1.0-RC2"
         },
@@ -48,6 +52,10 @@
         {
             "package": "kriswallsmith/assetic",
             "version": "v1.1.0-alpha1"
+        },
+        {
+            "package": "monolog/monolog",
+            "version": "v1.2.1"
         }
     ],
     "packages-dev": null,
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 0dd19d5..019d1d8 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -12,6 +12,7 @@
 use Drupal\Core\Language\Language;
 use Drupal\Core\Lock\DatabaseLockBackend;
 use Drupal\Core\Lock\LockBackendInterface;
+use Monolog\Logger;
 
 /**
  * @file
@@ -1715,7 +1716,7 @@ function watchdog_exception($type, Exception $exception, $message = NULL, $varia
  *   A link to associate with the message.
  *
  * @see watchdog_severity_levels()
- * @see hook_watchdog()
+ * @see Monolog\Logger
  */
 function watchdog($type, $message, array $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
   global $user, $base_root;
@@ -1733,7 +1734,6 @@ function watchdog($type, $message, array $variables = array(), $severity = WATCH
     // Prepare the fields to be logged
     $log_entry = array(
       'type'        => $type,
-      'message'     => $message,
       'variables'   => $variables,
       'severity'    => $severity,
       'link'        => $link,
@@ -1746,11 +1746,38 @@ function watchdog($type, $message, array $variables = array(), $severity = WATCH
       'timestamp'   => time(),
     );
 
-    // Call the logging hooks to log/process the message
-    foreach (module_implements('watchdog') as $module) {
-      module_invoke($module, 'watchdog', $log_entry);
+    // Translate the watchdog constant value to a Monolog value.
+    // @todo Switch the WATCHDOG constants to the straight Logger constants?
+    switch ($severity) {
+      case WATCHDOG_EMERGENCY:
+        $severity = Logger::EMERGENCY;
+        break;
+      case WATCHDOG_ALERT:
+        $severity = Logger::ALERT;
+        break;
+      case WATCHDOG_CRITICAL:
+        $severity = Logger::CRITICAL;
+        break;
+      case WATCHDOG_ERROR:
+        $severity = Logger::ERROR;
+        break;
+      case WATCHDOG_WARNING:
+        $severity = Logger::WARNING;
+        break;
+      case WATCHDOG_NOTICE:
+        $severity = Logger::NOTICE;
+        break;
+      case WATCHDOG_INFO:
+        $severity = Logger::INFO;
+        break;
+      case WATCHDOG_DEBUG:
+        $severity = Logger::DEBUG;
+        break;
     }
 
+    // Add the record to the logger.
+    drupal_container()->get('logger')->addRecord($severity, $message, $log_entry);
+
     // It is critical that the semaphore is only cleared here, in the parent
     // watchdog() call (not outside the loop), to prevent recursive execution.
     $in_error_state = FALSE;
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 0225c9b..4042370 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -125,6 +125,10 @@ public function build(ContainerBuilder $container) {
       ->setFactoryClass('Drupal\Core\ExceptionController')
       ->setFactoryMethod('getExceptionListener');
 
+    // Register services needed for the watchdog logging system.
+    $container->register('logger', 'Symfony\Bridge\Monolog\Logger')
+      ->addArgument('Drupal');
+
     $container->addCompilerPass(new RegisterMatchersPass());
     $container->addCompilerPass(new RegisterNestedMatchersPass());
     // Add a compiler pass for registering event subscribers.
diff --git a/core/modules/action/lib/Drupal/action/Tests/LoopTest.php b/core/modules/action/lib/Drupal/action/Tests/LoopTest.php
deleted file mode 100644
index 87fa08e..0000000
--- a/core/modules/action/lib/Drupal/action/Tests/LoopTest.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\action\Tests\LoopTest.
- */
-
-namespace Drupal\action\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests aborting of actions executing in a potential loop.
- */
-class LoopTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('dblog', 'action_loop_test');
-
-  protected $aid;
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Actions executing in a potentially infinite loop',
-      'description' => 'Tests actions executing in a loop, and makes sure they abort properly.',
-      'group' => 'Action',
-    );
-  }
-
-  /**
-   * Sets up a loop with 3 - 12 recursions, and sees if it aborts properly.
-   */
-  function testActionLoop() {
-    $user = $this->drupalCreateUser(array('administer actions'));
-    $this->drupalLogin($user);
-
-    $info = action_loop_test_action_info();
-    $this->aid = action_save('action_loop_test_log', $info['action_loop_test_log']['type'], array(), $info['action_loop_test_log']['label']);
-
-    // Delete any existing watchdog messages to clear the plethora of
-    // "Action added" messages from when Drupal was installed.
-    db_delete('watchdog')->execute();
-    // To prevent this test from failing when xdebug is enabled, the maximum
-    // recursion level should be kept low enough to prevent the xdebug
-    // infinite recursion protection mechanism from aborting the request.
-    // See http://drupal.org/node/587634.
-    config('action.settings')
-      ->set('recursion_limit', 7)
-      ->save();
-    $this->triggerActions();
-  }
-
-  /**
-   * Loops watchdog messages up to actions_max_stack times.
-   *
-   * Creates an infinite loop by causing a watchdog message to be set,
-   * which causes the actions to be triggered again, up to action_max_stack
-   * times.
-   */
-  protected function triggerActions() {
-    $this->drupalGet('<front>', array('query' => array('trigger_action_on_watchdog' => $this->aid)));
-    $expected = array();
-    $expected[] = 'Triggering action loop';
-    $recursion_limit = config('action.settings')->get('recursion_limit');
-    for ($i = 1; $i <= $recursion_limit; $i++) {
-      $expected[] = "Test log #$i";
-    }
-    $expected[] = 'Stack overflow: recursion limit for actions_do() has been reached. Stack is limited by %limit calls.';
-
-    $result = db_query("SELECT message FROM {watchdog} WHERE type = 'action_loop_test' OR type = 'action' ORDER BY wid");
-    $loop_started = FALSE;
-    foreach ($result as $row) {
-      $expected_message = array_shift($expected);
-      $this->assertEqual($row->message, $expected_message, format_string('Expected message %expected, got %message.', array('%expected' => $expected_message, '%message' => $row->message)));
-    }
-    $this->assertTrue(empty($expected), 'All expected messages found.');
-  }
-}
diff --git a/core/modules/action/tests/action_loop_test/action_loop_test.info b/core/modules/action/tests/action_loop_test/action_loop_test.info
deleted file mode 100644
index 82a2810..0000000
--- a/core/modules/action/tests/action_loop_test/action_loop_test.info
+++ /dev/null
@@ -1,7 +0,0 @@
-name = Action loop test
-description = Support module for action loop testing.
-package = Testing
-version = VERSION
-core = 8.x
-hidden = TRUE
-dependencies[] = action
diff --git a/core/modules/action/tests/action_loop_test/action_loop_test.install b/core/modules/action/tests/action_loop_test/action_loop_test.install
deleted file mode 100644
index 7085aed..0000000
--- a/core/modules/action/tests/action_loop_test/action_loop_test.install
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-/**
- * Implements hook_install().
- */
-function action_loop_test_install() {
-  module_set_weight('action_loop_test', 1);
-}
diff --git a/core/modules/action/tests/action_loop_test/action_loop_test.module b/core/modules/action/tests/action_loop_test/action_loop_test.module
deleted file mode 100644
index 8c3b98d..0000000
--- a/core/modules/action/tests/action_loop_test/action_loop_test.module
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/**
- * Implements hook_watchdog().
- */
-function action_loop_test_watchdog(array $log_entry) {
-  // If the triggering actions are not explicitly enabled, abort.
-  if (empty($_GET['trigger_action_on_watchdog'])) {
-    return;
-  }
-  // We can pass in any applicable information in $context. There isn't much in
-  // this case, but we'll pass in the hook name as the bare minimum.
-  $context = array(
-    'hook' => 'watchdog',
-  );
-  // Fire the actions on the associated object ($log_entry) and the context
-  // variable.
-  $aids = (array) $_GET['trigger_action_on_watchdog'];
-  actions_do($aids, $log_entry, $context);
-}
-
-/**
- * Implements hook_init().
- */
-function action_loop_test_init() {
-  if (!empty($_GET['trigger_action_on_watchdog'])) {
-    watchdog_skip_semaphore('action_loop_test', 'Triggering action loop');
-  }
-}
-
-/**
- * Implements hook_action_info().
- */
-function action_loop_test_action_info() {
-  return array(
-    'action_loop_test_log' => array(
-      'label' => t('Write a message to the log.'),
-      'type' => 'system',
-      'configurable' => FALSE,
-      'triggers' => array('any'),
-    ),
-  );
-}
-
-/**
- * Write a message to the log.
- */
-function action_loop_test_log() {
-  $count = &drupal_static(__FUNCTION__, 0);
-  $count++;
-  watchdog_skip_semaphore('action_loop_test', "Test log #$count");
-}
-
-/**
- * Replacement of the watchdog() function that eliminates the use of semaphores
- * so that we can test the abortion of an action loop.
- */
-function watchdog_skip_semaphore($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
-  global $user, $base_root;
-
-  // Prepare the fields to be logged
-  $log_entry = array(
-    'type'        => $type,
-    'message'     => $message,
-    'variables'   => $variables,
-    'severity'    => $severity,
-    'link'        => $link,
-    'user'        => $user,
-    'uid'         => isset($user->uid) ? $user->uid : 0,
-    'request_uri' => $base_root . request_uri(),
-    'referer'     => $_SERVER['HTTP_REFERER'],
-    'ip'          => ip_address(),
-    'timestamp'   => REQUEST_TIME,
-  );
-
-  // Call the logging hooks to log/process the message
-  foreach (module_implements('watchdog') as $module) {
-    module_invoke($module, 'watchdog', $log_entry);
-  }
-}
diff --git a/core/modules/dblog/dblog.module b/core/modules/dblog/dblog.module
index 89efb57..95024a1 100644
--- a/core/modules/dblog/dblog.module
+++ b/core/modules/dblog/dblog.module
@@ -141,28 +141,6 @@ function _dblog_get_message_types() {
 }
 
 /**
- * Implements hook_watchdog().
- *
- * Note: Some values may be truncated to meet database column size restrictions.
- */
-function dblog_watchdog(array $log_entry) {
-  Database::getConnection('default', 'default')->insert('watchdog')
-    ->fields(array(
-      'uid' => $log_entry['uid'],
-      'type' => substr($log_entry['type'], 0, 64),
-      'message' => $log_entry['message'],
-      'variables' => serialize($log_entry['variables']),
-      'severity' => $log_entry['severity'],
-      'link' => substr($log_entry['link'], 0, 255),
-      'location' => $log_entry['request_uri'],
-      'referer' => $log_entry['referer'],
-      'hostname' => substr($log_entry['ip'], 0, 128),
-      'timestamp' => $log_entry['timestamp'],
-    ))
-    ->execute();
-}
-
-/**
  * Implements hook_form_FORM_ID_alter() for system_logging_settings().
  */
 function dblog_form_system_logging_settings_alter(&$form, $form_state) {
diff --git a/core/modules/dblog/lib/Drupal/dblog/DblogBundle.php b/core/modules/dblog/lib/Drupal/dblog/DblogBundle.php
new file mode 100755
index 0000000..e54b148
--- /dev/null
+++ b/core/modules/dblog/lib/Drupal/dblog/DblogBundle.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\dblog\DblogBundle.
+ */
+
+namespace Drupal\dblog;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * Database Logging dependency injection container.
+ */
+class DblogBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the database logging handler.
+    $container->register('logger.dbloghandler', 'Drupal\dblog\DblogHandler');
+
+    // Add the handler to the logging system.
+    $reference = new Reference('logger.dbloghandler');
+    $container->getDefinition('logger')
+      ->addMethodCall('pushHandler', array($reference));
+  }
+
+}
diff --git a/core/modules/dblog/lib/Drupal/dblog/DblogHandler.php b/core/modules/dblog/lib/Drupal/dblog/DblogHandler.php
new file mode 100755
index 0000000..c86e560
--- /dev/null
+++ b/core/modules/dblog/lib/Drupal/dblog/DblogHandler.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\dblog\DatabaseLoggingBundle.
+ */
+
+namespace Drupal\dblog;
+
+use Drupal\Core\Database\Database;
+
+use Monolog\Logger;
+use Monolog\Handler\AbstractProcessingHandler;
+
+/**
+ * Logs and records system events to the database.
+ *
+ * Note: Some values may be truncated to meet database column size restrictions.
+ */
+class DblogHandler extends AbstractProcessingHandler {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function write(array $record) {
+    Database::getConnection('default', 'default')->insert('watchdog')
+      ->fields(array(
+        'uid' => $record['context']['uid'],
+        'type' => substr($record['context']['type'], 0, 64),
+        'message' => $record['message'],
+        'variables' => serialize($record['context']['variables']),
+        'severity' => $record['context']['severity'],
+        'link' => substr($record['context']['link'], 0, 255),
+        'location' => $record['context']['request_uri'],
+        'referer' => $record['context']['referer'],
+        'hostname' => substr($record['context']['ip'], 0, 128),
+        'timestamp' => $record['context']['timestamp'],
+      ))
+      ->execute();
+  }
+}
diff --git a/core/modules/syslog/config/syslog.settings.yml b/core/modules/syslog/config/syslog.settings.yml
index 1aa5b90..7f17a98 100644
--- a/core/modules/syslog/config/syslog.settings.yml
+++ b/core/modules/syslog/config/syslog.settings.yml
@@ -1,3 +1,2 @@
 identity: drupal
-facility: ''
-format: '!base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message'
+facility: 8  # Facility defaults to the value of LOG_USER.
diff --git a/core/modules/syslog/lib/Drupal/syslog/SyslogBundle.php b/core/modules/syslog/lib/Drupal/syslog/SyslogBundle.php
new file mode 100755
index 0000000..f29bb24
--- /dev/null
+++ b/core/modules/syslog/lib/Drupal/syslog/SyslogBundle.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\syslog\SyslogBundle.
+ */
+
+namespace Drupal\syslog;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * Database Logging dependency injection container.
+ */
+class DatabaseLoggingBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the database logging handler.
+    // @todo Retrieve values dynamically from config so that the services can be
+    // compiled correctly.
+    $config = config('syslog.settings');
+    $ident = $config->get('identity');
+    $facility = $config->get('facility');
+    $container->register('logger.sysloghandler', 'Monolog/Handler/SyslogHandler')
+      ->addArgument($ident)
+      ->addArgument('facility');
+
+    // Add the handler to the logging system.
+    $reference = new Reference('logger.sysloghandler');
+    $container->getDefinition('logger')
+      ->addMethodCall('pushHandler', array($reference));
+  }
+
+}
diff --git a/core/modules/syslog/syslog.install b/core/modules/syslog/syslog.install
index 5b2c41a..8c8b03e 100644
--- a/core/modules/syslog/syslog.install
+++ b/core/modules/syslog/syslog.install
@@ -26,7 +26,6 @@ function syslog_update_8000() {
   update_variables_to_config('syslog.settings', array(
     'syslog_identity' => 'identity',
     'syslog_facility' => 'facility',
-    'syslog_format' => 'format',
   ));
 }
 
diff --git a/core/modules/syslog/syslog.module b/core/modules/syslog/syslog.module
index 8af77c1..7426e13 100644
--- a/core/modules/syslog/syslog.module
+++ b/core/modules/syslog/syslog.module
@@ -5,22 +5,6 @@
  * Redirects logging messages to syslog.
  */
 
-if (defined('LOG_LOCAL0')) {
-  /**
-   * Sets the proper logging facility.
-   *
-   * Note that LOG_LOCAL0 through LOG_LOCAL7 are not available on Windows, so we
-   * check for availability. If LOG_LOCAL0 is defined by the PHP environment, we
-   * set that as the default; if not, we use LOG_USER.
-   *
-   * @see http://php.net/manual/function.syslog.php
-   */
-  define('DEFAULT_SYSLOG_FACILITY', LOG_LOCAL0);
-}
-else {
-  define('DEFAULT_SYSLOG_FACILITY', LOG_USER);
-}
-
 /**
  * Implements hook_help().
  */
@@ -62,12 +46,6 @@ function syslog_form_system_logging_settings_alter(&$form, &$form_state) {
       '#description'   => t('Depending on the system configuration, Syslog and other logging tools use this code to identify or filter messages from within the entire system log.') . $help,
      );
   }
-  $form['syslog_format'] = array(
-    '#type'          => 'textarea',
-    '#title'         => t('Syslog format'),
-    '#default_value' => $config->get('format'),
-    '#description'   => t('Specify the format of the syslog entry. Available variables are: <dl><dt><code>!base_url</code></dt><dd>Base URL of the site.</dd><dt><code>!timestamp</code></dt><dd>Unix timestamp of the log entry.</dd><dt><code>!type</code></dt><dd>The category to which this message belongs.</dd><dt><code>!ip</code></dt><dd>IP address of the user triggering the message.</dd><dt><code>!request_uri</code></dt><dd>The requested URI.</dd><dt><code>!referer</code></dt><dd>HTTP Referer if available.</dd><dt><code>!uid</code></dt><dd>User ID.</dd><dt><code>!link</code></dt><dd>A link to associate with the message.</dd><dt><code>!message</code></dt><dd>The message to store in the log.</dd></dl>'),
-  );
 
   $form['#submit'][] = 'syslog_logging_settings_submit';
 }
@@ -81,7 +59,6 @@ function syslog_logging_settings_submit($form, &$form_state) {
   config('syslog.settings')
     ->set('identity', $form_state['values']['syslog_identity'])
     ->set('facility', $form_state['values']['syslog_facility'])
-    ->set('format', $form_state['values']['syslog_format'])
     ->save();
 }
 
@@ -103,36 +80,3 @@ function syslog_facility_list() {
     LOG_LOCAL7 => 'LOG_LOCAL7',
   );
 }
-
-/**
- * Implements hook_watchdog().
- */
-function syslog_watchdog(array $log_entry) {
-  global $base_url;
-
-  $log_init = &drupal_static(__FUNCTION__, FALSE);
-  $config = config('syslog.settings');
-
-  if (!$log_init) {
-    $log_init = TRUE;
-    $facility = $config->get('facility');
-    if ($facility === '') {
-      $facility = defined('LOG_LOCAL0') ? LOG_LOCAL0 : LOG_USER;
-    }
-    openlog($config->get('identity'), LOG_NDELAY, $facility);
-  }
-
-  $message = strtr($config->get('format'), array(
-    '!base_url'    => $base_url,
-    '!timestamp'   => $log_entry['timestamp'],
-    '!type'        => $log_entry['type'],
-    '!ip'          => $log_entry['ip'],
-    '!request_uri' => $log_entry['request_uri'],
-    '!referer'     => $log_entry['referer'],
-    '!uid'         => $log_entry['uid'],
-    '!link'        => strip_tags($log_entry['link']),
-    '!message'     => strip_tags(!isset($log_entry['variables']) ? $log_entry['message'] : strtr($log_entry['message'], $log_entry['variables'])),
-  ));
-
-  syslog($log_entry['severity'], $message);
-}
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 2d09534..c77127c 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1968,94 +1968,6 @@ function hook_custom_theme() {
 }
 
 /**
- * Log an event message.
- *
- * This hook allows modules to route log events to custom destinations, such as
- * SMS, Email, pager, syslog, ...etc.
- *
- * @param array $log_entry
- *   An associative array containing the following keys:
- *   - type: The type of message for this entry.
- *   - user: The user object for the user who was logged in when the event
- *     happened.
- *   - uid: The user ID for the user who was logged in when the event happened.
- *   - request_uri: The request URI for the page the event happened in.
- *   - referer: The page that referred the user to the page where the event
- *     occurred.
- *   - ip: The IP address where the request for the page came from.
- *   - timestamp: The UNIX timestamp of the date/time the event occurred.
- *   - severity: The severity of the message; one of the following values as
- *     defined in @link http://www.faqs.org/rfcs/rfc3164.html RFC 3164: @endlink
- *     - WATCHDOG_EMERGENCY: Emergency, system is unusable.
- *     - WATCHDOG_ALERT: Alert, action must be taken immediately.
- *     - WATCHDOG_CRITICAL: Critical conditions.
- *     - WATCHDOG_ERROR: Error conditions.
- *     - WATCHDOG_WARNING: Warning conditions.
- *     - WATCHDOG_NOTICE: Normal but significant conditions.
- *     - WATCHDOG_INFO: Informational messages.
- *     - WATCHDOG_DEBUG: Debug-level messages.
- *   - link: An optional link provided by the module that called the watchdog()
- *     function.
- *   - message: The text of the message to be logged. Variables in the message
- *     are indicated by using placeholder strings alongside the variables
- *     argument to declare the value of the placeholders. See t() for
- *     documentation on how the message and variable parameters interact.
- *   - variables: An array of variables to be inserted into the message on
- *     display. Will be NULL or missing if a message is already translated or if
- *     the message is not possible to translate.
- */
-function hook_watchdog(array $log_entry) {
-  global $base_url;
-  $language_interface = language(LANGUAGE_TYPE_INTERFACE);
-
-  $severity_list = array(
-    WATCHDOG_EMERGENCY     => t('Emergency'),
-    WATCHDOG_ALERT     => t('Alert'),
-    WATCHDOG_CRITICAL     => t('Critical'),
-    WATCHDOG_ERROR       => t('Error'),
-    WATCHDOG_WARNING   => t('Warning'),
-    WATCHDOG_NOTICE    => t('Notice'),
-    WATCHDOG_INFO      => t('Info'),
-    WATCHDOG_DEBUG     => t('Debug'),
-  );
-
-  $to = 'someone@example.com';
-  $params = array();
-  $params['subject'] = t('[@site_name] @severity_desc: Alert from your web site', array(
-    '@site_name' => config('system.site')->get('name'),
-    '@severity_desc' => $severity_list[$log_entry['severity']],
-  ));
-
-  $params['message']  = "\nSite:         @base_url";
-  $params['message'] .= "\nSeverity:     (@severity) @severity_desc";
-  $params['message'] .= "\nTimestamp:    @timestamp";
-  $params['message'] .= "\nType:         @type";
-  $params['message'] .= "\nIP Address:   @ip";
-  $params['message'] .= "\nRequest URI:  @request_uri";
-  $params['message'] .= "\nReferrer URI: @referer_uri";
-  $params['message'] .= "\nUser:         (@uid) @name";
-  $params['message'] .= "\nLink:         @link";
-  $params['message'] .= "\nMessage:      \n\n@message";
-
-  $params['message'] = t($params['message'], array(
-    '@base_url'      => $base_url,
-    '@severity'      => $log_entry['severity'],
-    '@severity_desc' => $severity_list[$log_entry['severity']],
-    '@timestamp'     => format_date($log_entry['timestamp']),
-    '@type'          => $log_entry['type'],
-    '@ip'            => $log_entry['ip'],
-    '@request_uri'   => $log_entry['request_uri'],
-    '@referer_uri'   => $log_entry['referer'],
-    '@uid'           => $log_entry['uid'],
-    '@name'          => $log_entry['user']->name,
-    '@link'          => strip_tags($log_entry['link']),
-    '@message'       => strip_tags($log_entry['message']),
-  ));
-
-  drupal_mail('emaillog', 'entry', $to, $language_interface->langcode, $params);
-}
-
-/**
  * Prepare a message based on parameters; called from drupal_mail().
  *
  * Note that hook_mail(), unlike hook_mail_alter(), is only called on the
diff --git a/core/vendor/composer/ClassLoader.php b/core/vendor/composer/ClassLoader.php
index 00623e3..a4a0dc5 100644
--- a/core/vendor/composer/ClassLoader.php
+++ b/core/vendor/composer/ClassLoader.php
@@ -162,14 +162,14 @@ public function loadClass($class)
      */
     public function findFile($class)
     {
-        if (isset($this->classMap[$class])) {
-            return $this->classMap[$class];
-        }
-
         if ('\\' == $class[0]) {
             $class = substr($class, 1);
         }
 
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+
         if (false !== $pos = strrpos($class, '\\')) {
             // namespaced class name
             $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)) . DIRECTORY_SEPARATOR;
@@ -202,6 +202,6 @@ public function findFile($class)
             return $file;
         }
 
-        $this->classMap[$class] = false;
+        return $this->classMap[$class] = false;
     }
 }
diff --git a/core/vendor/composer/autoload_namespaces.php b/core/vendor/composer/autoload_namespaces.php
index c278de2..c725e5c 100644
--- a/core/vendor/composer/autoload_namespaces.php
+++ b/core/vendor/composer/autoload_namespaces.php
@@ -16,7 +16,9 @@
     'Symfony\\Component\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/',
     'Symfony\\Component\\DependencyInjection' => $vendorDir . '/symfony/dependency-injection/',
     'Symfony\\Component\\ClassLoader' => $vendorDir . '/symfony/class-loader/',
+    'Symfony\\Bridge\\Monolog' => $vendorDir . '/symfony/monolog-bridge/',
     'SessionHandlerInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs',
+    'Monolog' => $vendorDir . '/monolog/monolog/src/',
     'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
     'Assetic' => $vendorDir . '/kriswallsmith/assetic/src/',
 );
diff --git a/core/vendor/composer/autoload_real.php b/core/vendor/composer/autoload_real.php
index 7d64f49..9028b73 100644
--- a/core/vendor/composer/autoload_real.php
+++ b/core/vendor/composer/autoload_real.php
@@ -6,9 +6,15 @@
 
 class ComposerAutoloaderInit
 {
+    private static $loader;
+
     public static function getLoader()
     {
-        $loader = new \Composer\Autoload\ClassLoader();
+        if (null !== static::$loader) {
+            return static::$loader;
+        }
+
+        static::$loader = $loader = new \Composer\Autoload\ClassLoader();
         $vendorDir = dirname(__DIR__);
         $baseDir = dirname($vendorDir);
 
diff --git a/core/vendor/composer/installed.json b/core/vendor/composer/installed.json
index 3fe9a18..dbbfeda 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -3,7 +3,6 @@
         "name": "twig/twig",
         "version": "v1.8.3",
         "version_normalized": "1.8.3.0",
-        "time": "2012-06-18 18:48:16",
         "source": {
             "type": "git",
             "url": "git://github.com/fabpot/Twig.git",
@@ -18,6 +17,7 @@
         "require": {
             "php": ">=5.2.4"
         },
+        "time": "2012-06-18 18:48:16",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -25,6 +25,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Twig_": "lib/"
+            }
+        },
         "license": [
             "BSD-3"
         ],
@@ -46,19 +51,13 @@
         "homepage": "http://twig.sensiolabs.org",
         "keywords": [
             "templating"
-        ],
-        "autoload": {
-            "psr-0": {
-                "Twig_": "lib/"
-            }
-        }
+        ]
     },
     {
         "name": "symfony/class-loader",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/ClassLoader",
-        "time": "2012-08-27 14:51:49",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/ClassLoader",
@@ -76,6 +75,7 @@
         "require-dev": {
             "symfony/finder": "2.1.*"
         },
+        "time": "2012-08-27 14:51:49",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -83,6 +83,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\ClassLoader": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -101,19 +106,13 @@
             }
         ],
         "description": "Symfony ClassLoader Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\ClassLoader": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/dependency-injection",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/DependencyInjection",
-        "time": "2012-08-28 06:54:42",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/DependencyInjection",
@@ -136,6 +135,7 @@
             "symfony/yaml": "v2.1.0-RC2",
             "symfony/config": "v2.1.0-RC2"
         },
+        "time": "2012-08-28 06:54:42",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -143,6 +143,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\DependencyInjection": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -161,18 +166,12 @@
             }
         ],
         "description": "Symfony DependencyInjection Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\DependencyInjection": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "doctrine/common",
         "version": "2.3.0-RC2",
         "version_normalized": "2.3.0.0-RC2",
-        "time": "2012-08-29 13:06:32",
         "source": {
             "type": "git",
             "url": "https://github.com/doctrine/common",
@@ -187,6 +186,7 @@
         "require": {
             "php": ">=5.3.2"
         },
+        "time": "2012-08-29 13:06:32",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -194,6 +194,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Doctrine\\Common": "lib/"
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -237,19 +242,13 @@
             "eventmanager",
             "annotations",
             "persistence"
-        ],
-        "autoload": {
-            "psr-0": {
-                "Doctrine\\Common": "lib/"
-            }
-        }
+        ]
     },
     {
         "name": "symfony/http-foundation",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/HttpFoundation",
-        "time": "2012-08-22 12:48:41",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/HttpFoundation",
@@ -264,6 +263,7 @@
         "require": {
             "php": ">=5.3.3"
         },
+        "time": "2012-08-22 12:48:41",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -271,6 +271,12 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\HttpFoundation": "",
+                "SessionHandlerInterface": "Symfony/Component/HttpFoundation/Resources/stubs"
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -289,20 +295,13 @@
             }
         ],
         "description": "Symfony HttpFoundation Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\HttpFoundation": "",
-                "SessionHandlerInterface": "Symfony/Component/HttpFoundation/Resources/stubs"
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/event-dispatcher",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/EventDispatcher",
-        "time": "2012-08-22 12:48:41",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/EventDispatcher",
@@ -324,6 +323,7 @@
             "symfony/dependency-injection": "v2.1.0-RC2",
             "symfony/http-kernel": "v2.1.0-RC2"
         },
+        "time": "2012-08-22 12:48:41",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -331,6 +331,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\EventDispatcher": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -349,19 +354,13 @@
             }
         ],
         "description": "Symfony EventDispatcher Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\EventDispatcher": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/http-kernel",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/HttpKernel",
-        "time": "2012-08-28 07:00:18",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/HttpKernel",
@@ -396,6 +395,7 @@
             "symfony/dependency-injection": "v2.1.0-RC2",
             "symfony/finder": "v2.1.0-RC2"
         },
+        "time": "2012-08-28 07:00:18",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -403,6 +403,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\HttpKernel": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -421,19 +426,13 @@
             }
         ],
         "description": "Symfony HttpKernel Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\HttpKernel": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/routing",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/Routing",
-        "time": "2012-08-28 06:54:42",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Routing",
@@ -459,6 +458,7 @@
             "symfony/yaml": "v2.1.0-RC2",
             "doctrine/common": ">=2.2,<2.4-dev"
         },
+        "time": "2012-08-28 06:54:42",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -466,6 +466,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Routing": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -484,19 +489,13 @@
             }
         ],
         "description": "Symfony Routing Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Routing": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/yaml",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/Yaml",
-        "time": "2012-08-22 12:48:41",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Yaml",
@@ -511,6 +510,7 @@
         "require": {
             "php": ">=5.3.3"
         },
+        "time": "2012-08-22 12:48:41",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -518,6 +518,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Yaml": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -536,19 +541,13 @@
             }
         ],
         "description": "Symfony Yaml Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Yaml": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/process",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/Process",
-        "time": "2012-08-26 06:13:51",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Process",
@@ -563,6 +562,7 @@
         "require": {
             "php": ">=5.3.3"
         },
+        "time": "2012-08-26 06:13:51",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -570,6 +570,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Process": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -584,18 +589,12 @@
             }
         ],
         "description": "Symfony Process Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Process": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "kriswallsmith/assetic",
         "version": "v1.1.0-alpha1",
         "version_normalized": "1.1.0.0-alpha1",
-        "time": "2012-08-28 05:33:44",
         "source": {
             "type": "git",
             "url": "http://github.com/kriswallsmith/assetic.git",
@@ -623,6 +622,7 @@
             "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler",
             "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris"
         },
+        "time": "2012-08-28 05:33:44",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -630,6 +630,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Assetic": "src/"
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -646,11 +651,161 @@
             "assets",
             "compression",
             "minification"
+        ]
+    },
+    {
+        "name": "monolog/monolog",
+        "version": "1.2.1",
+        "version_normalized": "1.2.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/Seldaek/monolog",
+            "reference": "1.2.1"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/Seldaek/monolog/zipball/1.2.1",
+            "reference": "1.2.1",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "require-dev": {
+            "mlehner/gelf-php": "1.0.*"
+        },
+        "suggest": {
+            "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server",
+            "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+            "ext-mongo": "Allow sending log messages to a MongoDB server"
+        },
+        "time": "2012-08-29 04:53:20",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.3.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Monolog": "src/"
+            }
+        },
+        "license": [
+            "MIT"
         ],
+        "authors": [
+            {
+                "name": "Jordi Boggiano",
+                "email": "j.boggiano@seld.be",
+                "homepage": "http://seld.be",
+                "role": "Developer"
+            }
+        ],
+        "description": "Logging for PHP 5.3",
+        "homepage": "http://github.com/Seldaek/monolog",
+        "keywords": [
+            "log",
+            "logging"
+        ]
+    },
+    {
+        "name": "symfony/monolog-bridge",
+        "version": "v2.1.1",
+        "version_normalized": "2.1.1.0",
+        "target-dir": "Symfony/Bridge/Monolog",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/MonologBridge",
+            "reference": "v2.1.2"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/symfony/MonologBridge/zipball/v2.1.2",
+            "reference": "v2.1.2",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3",
+            "symfony/http-kernel": "2.1.*",
+            "monolog/monolog": "1.*"
+        },
+        "time": "2012-09-10 03:53:42",
+        "type": "symfony-bridge",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.1-dev"
+            }
+        },
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
-                "Assetic": "src/"
+                "Symfony\\Bridge\\Monolog": ""
+            }
+        },
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
             }
-        }
+        ],
+        "description": "Symfony Monolog Bridge",
+        "homepage": "http://symfony.com"
+    },
+    {
+        "name": "symfony/serializer",
+        "version": "v2.1.2",
+        "version_normalized": "2.1.2.0",
+        "target-dir": "Symfony/Component/Serializer",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/Serializer",
+            "reference": "v2.1.2"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/symfony/Serializer/zipball/v2.1.2",
+            "reference": "v2.1.2",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2012-08-28 00:54:42",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.1-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Serializer": ""
+            }
+        },
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Serializer Component",
+        "homepage": "http://symfony.com"
     }
 ]
diff --git a/core/vendor/monolog/monolog/.gitignore b/core/vendor/monolog/monolog/.gitignore
new file mode 100644
index 0000000..0a3fb55
--- /dev/null
+++ b/core/vendor/monolog/monolog/.gitignore
@@ -0,0 +1,5 @@
+vendor
+composer.phar
+phpunit.xml
+composer.lock
+.DS_Store
diff --git a/core/vendor/monolog/monolog/.travis.yml b/core/vendor/monolog/monolog/.travis.yml
new file mode 100644
index 0000000..eb35049
--- /dev/null
+++ b/core/vendor/monolog/monolog/.travis.yml
@@ -0,0 +1,11 @@
+language: php
+
+php: 
+  - 5.3
+  - 5.4
+
+before_script:
+  - curl -s http://getcomposer.org/installer | php
+  - php composer.phar install --dev
+
+script: phpunit
diff --git a/core/vendor/monolog/monolog/CHANGELOG.mdown b/core/vendor/monolog/monolog/CHANGELOG.mdown
new file mode 100644
index 0000000..b9f93c7
--- /dev/null
+++ b/core/vendor/monolog/monolog/CHANGELOG.mdown
@@ -0,0 +1,60 @@
+* 1.2.1 (2012-08-29)
+
+  Changes:
+
+    * Added new $logopts arg to SyslogHandler to provide custom openlog options
+    * Fixed fatal error in SyslogHandler
+
+* 1.2.0 (2012-08-18)
+
+  Changes:
+
+    * Added AmqpHandler (for use with AMQP servers)
+    * Added CubeHandler
+    * Added NativeMailerHandler::addHeader() to send custom headers in mails
+    * Added the possibility to specify more than one recipient in NativeMailerHandler
+    * Added the possibility to specify float timeouts in SocketHandler
+    * Added NOTICE and EMERGENCY levels to conform with RFC 5424
+    * Fixed the log records to use the php default timezone instead of UTC
+    * Fixed BufferHandler not being flushed properly on PHP fatal errors
+    * Fixed normalization of exotic resource types
+    * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog
+
+* 1.1.0 (2012-04-23)
+
+  Changes:
+
+    * Added Monolog\Logger::isHandling() to check if a handler will
+      handle the given log level
+    * Added ChromePHPHandler
+    * Added MongoDBHandler
+    * Added GelfHandler (for use with Graylog2 servers)
+    * Added SocketHandler (for use with syslog-ng for example)
+    * Added NormalizerFormatter
+    * Added the possibility to change the activation strategy of the FingersCrossedHandler
+    * Added possibility to show microseconds in logs
+    * Added `server` and `referer` to WebProcessor output
+
+* 1.0.2 (2011-10-24)
+
+  Changes:
+
+    * Fixed bug in IE with large response headers and FirePHPHandler
+
+* 1.0.1 (2011-08-25)
+
+  Changes:
+
+    * Added MemoryPeakUsageProcessor and MemoryUsageProcessor
+    * Added Monolog\Logger::getName() to get a logger's channel name
+
+* 1.0.0 (2011-07-06)
+
+  Changes:
+
+    * Added IntrospectionProcessor to get info from where the logger was called
+    * Fixed WebProcessor in CLI
+
+* 1.0.0-RC1 (2011-07-01)
+
+  * Initial release
diff --git a/core/vendor/monolog/monolog/LICENSE b/core/vendor/monolog/monolog/LICENSE
new file mode 100644
index 0000000..5df1c39
--- /dev/null
+++ b/core/vendor/monolog/monolog/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/core/vendor/monolog/monolog/README.mdown b/core/vendor/monolog/monolog/README.mdown
new file mode 100644
index 0000000..c051eb1
--- /dev/null
+++ b/core/vendor/monolog/monolog/README.mdown
@@ -0,0 +1,188 @@
+Monolog - Logging for PHP 5.3
+=============================
+
+[![Build Status](https://secure.travis-ci.org/Seldaek/monolog.png)](http://travis-ci.org/Seldaek/monolog)
+
+Usage
+-----
+
+```php
+<?php
+
+use Monolog\Logger;
+use Monolog\Handler\StreamHandler;
+
+// create a log channel
+$log = new Logger('name');
+$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
+
+// add records to the log
+$log->addWarning('Foo');
+$log->addError('Bar');
+```
+
+Core Concepts
+-------------
+
+Every `Logger` instance has a channel (name) and a stack of handlers. Whenever
+you add a record to the logger, it traverses the handler stack. Each handler
+decides whether it handled fully the record, and if so, the propagation of the
+record ends there.
+
+This allow for flexible logging setups, for example having a `StreamHandler` at
+the bottom of the stack that will log anything to disk, and on top of that add
+a `MailHandler` that will send emails only when an error message is logged.
+Handlers also have a `$bubble` property which defines whether they block the
+record or not if they handled it. In this example, setting the `MailHandler`'s
+`$bubble` argument to true means that all records will propagate to the
+`StreamHandler`, even the errors that are handled by the `MailHandler`.
+
+You can create many `Logger`s, each defining a channel (e.g.: db, request,
+router, ..) and each of them combining various handlers, which can be shared
+or not. The channel is reflected in the logs and allows you to easily see or
+filter records.
+
+Each Handler also has a Formatter, a default one with settings that make sense
+will be created if you don't set one. The formatters normalize and format
+incoming records so that they can be used by the handlers to output useful
+information.
+
+Custom severity levels are not available. Only the eight
+[RFC 5424](http://tools.ietf.org/html/rfc5424) levels (debug, info, notice,
+warning, error, critical, alert, emergency) are present for basic filtering
+purposes, but for sorting and other use cases that would require
+flexibility, you should add Processors to the Logger that can add extra
+information (tags, user ip, ..) to the records before they are handled.
+
+Log Levels
+----------
+
+Monolog supports all 8 logging levels defined in
+[RFC 5424](http://tools.ietf.org/html/rfc5424), but unless you specifically
+need syslog compatibility, it is advised to only use DEBUG, INFO, WARNING,
+ERROR, CRITICAL, ALERT.
+
+- **DEBUG** (100): Detailed debug information.
+
+- **INFO** (200): Interesting events. Examples: User logs in, SQL logs.
+
+- NOTICE (250): Normal but significant events.
+
+- **WARNING** (300): Exceptional occurrences that are not errors. Examples:
+  Use of deprecated APIs, poor use of an API, undesirable things that are not
+  necessarily wrong.
+
+- **ERROR** (400): Runtime errors that do not require immediate action but
+  should typically be logged and monitored.
+
+- **CRITICAL** (500): Critical conditions. Example: Application component
+  unavailable, unexpected exception.
+
+- **ALERT** (550): Action must be taken immediately. Example: Entire website
+  down, database unavailable, etc. This should trigger the SMS alerts and wake
+  you up.
+
+- EMERGENCY (600): Emergency: system is unusable.
+
+Docs
+====
+
+**See the `doc` directory for more detailed documentation.
+The following is only a list of all parts that come with Monolog.**
+
+Handlers
+--------
+
+- _StreamHandler_: Logs records into any PHP stream, use this for log files.
+- _RotatingFileHandler_: Logs records to a file and creates one logfile per day.
+  It will also delete files older than `$maxFiles`. You should use
+  [logrotate](http://linuxcommand.org/man_pages/logrotate8.html) for high profile
+  setups though, this is just meant as a quick and dirty solution.
+- _FirePHPHandler_: Handler for [FirePHP](http://www.firephp.org/), providing
+  inline `console` messages within [FireBug](http://getfirebug.com/).
+- _ChromePHPHandler_: Handler for [ChromePHP](http://www.chromephp.com/), providing
+  inline `console` messages within Chrome.
+- _MongoDBHandler_: Handler to write records in MongoDB via a
+  [Mongo](http://pecl.php.net/package/mongo) extension connection.
+- _NativeMailHandler_: Sends emails using PHP's
+  [`mail()`](http://php.net/manual/en/function.mail.php) function.
+- _SwiftMailerHandler_: Sends emails using a [`Swift_Mailer`](http://swiftmailer.org/) instance.
+- _SyslogHandler_: Logs records to the syslog.
+- _GelfHandler_: Logs records to a [Graylog2](http://www.graylog2.org) server.
+- _SocketHandler_: Logs records to [sockets](http://php.net/fsockopen), use this
+  for UNIX and TCP sockets. See an [example](https://github.com/Seldaek/monolog/blob/master/doc/sockets.md).
+- _AmqpHandler_: Logs records to an [amqp](http://www.amqp.org/) compatible
+  server. Requires the [php-amqp](http://pecl.php.net/package/amqp) extension (1.0+).
+- _CubeHandler_: Logs records to a [Cube](http://square.github.com/cube/) server.
+
+Wrappers / Special Handlers
+---------------------------
+
+- _FingersCrossedHandler_: A very interesting wrapper. It takes a logger as
+  parameter and will accumulate log records of all levels until a record
+  exceeds the defined severity level. At which point it delivers all records,
+  including those of lower severity, to the handler it wraps. This means that
+  until an error actually happens you will not see anything in your logs, but
+  when it happens you will have the full information, including debug and info
+  records. This provides you with all the information you need, but only when
+  you need it.
+- _NullHandler_: Any record it can handle will be thrown away. This can be used
+  to put on top of an existing handler stack to disable it temporarily.
+- _BufferHandler_: This handler will buffer all the log records it receives
+  until `close()` is called at which point it will call `handleBatch()` on the
+  handler it wraps with all the log messages at once. This is very useful to
+  send an email with all records at once for example instead of having one mail
+  for every log record.
+- _GroupHandler_: This handler groups other handlers. Every record received is
+  sent to all the handlers it is configured with.
+- _TestHandler_: Used for testing, it records everything that is sent to it and
+  has accessors to read out the information.
+
+Formatters
+----------
+
+- _LineFormatter_: Formats a log record into a one-line string.
+- _NormalizerFormatter_: Normalizes objects/resources down to strings so a record can easily be serialized/encoded.
+- _JsonFormatter_: Encodes a log record into json.
+- _WildfireFormatter_: Used to format log records into the Wildfire/FirePHP protocol, only useful for the FirePHPHandler.
+- _ChromePHPFormatter_: Used to format log records into the ChromePHP format, only useful for the ChromePHPHandler.
+- _GelfFormatter_: Used to format log records into Gelf message instances, only useful for the GelfHandler.
+
+Processors
+----------
+
+- _IntrospectionProcessor_: Adds the line/file/class/method from which the log call originated.
+- _WebProcessor_: Adds the current request URI, request method and client IP to a log record.
+- _MemoryUsageProcessor_: Adds the current memory usage to a log record.
+- _MemoryPeakUsageProcessor_: Adds the peak memory usage to a log record.
+
+About
+=====
+
+Requirements
+------------
+
+- Any flavor of PHP 5.3 should do
+- [optional] PHPUnit 3.5+ to execute the test suite (phpunit --version)
+
+Submitting bugs and feature requests
+------------------------------------
+
+Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues)
+
+Author
+------
+
+Jordi Boggiano - <j.boggiano@seld.be> - <http://twitter.com/seldaek><br />
+See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) which participated in this project.
+
+License
+-------
+
+Monolog is licensed under the MIT License - see the `LICENSE` file for details
+
+Acknowledgements
+----------------
+
+This library is heavily inspired by Python's [Logbook](http://packages.python.org/Logbook/)
+library, although most concepts have been adjusted to fit to the PHP world.
diff --git a/core/vendor/monolog/monolog/composer.json b/core/vendor/monolog/monolog/composer.json
new file mode 100644
index 0000000..9db9073
--- /dev/null
+++ b/core/vendor/monolog/monolog/composer.json
@@ -0,0 +1,34 @@
+{
+    "name": "monolog/monolog",
+    "description": "Logging for PHP 5.3",
+    "keywords": ["log", "logging"],
+    "homepage": "http://github.com/Seldaek/monolog",
+    "type": "library",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Jordi Boggiano",
+            "email": "j.boggiano@seld.be",
+            "homepage": "http://seld.be"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "require-dev": {
+        "mlehner/gelf-php": "1.0.*"
+    },
+    "suggest": {
+        "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server",
+        "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+        "ext-mongo": "Allow sending log messages to a MongoDB server"
+    },
+    "autoload": {
+        "psr-0": {"Monolog": "src/"}
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.3.x-dev"
+        }
+    }
+}
diff --git a/core/vendor/monolog/monolog/doc/extending.md b/core/vendor/monolog/monolog/doc/extending.md
new file mode 100644
index 0000000..fcd7af2
--- /dev/null
+++ b/core/vendor/monolog/monolog/doc/extending.md
@@ -0,0 +1,76 @@
+Extending Monolog
+=================
+
+Monolog is fully extensible, allowing you to adapt your logger to your needs.
+
+Writing your own handler
+------------------------
+
+Monolog provides many built-in handlers. But if the one you need does not
+exist, you can write it and use it in your logger. The only requirement is
+to implement `Monolog\Handler\HandlerInterface`.
+
+Let's write a PDOHandler to log records to a database. We will extend the
+abstract class provided by Monolog to keep things DRY.
+
+```php
+<?php
+
+use Monolog\Logger;
+use Monolog\Handler\AbstractProcessingHandler;
+
+class PDOHandler extends AbstractProcessingHandler
+{
+    private $initialized = false;
+    private $pdo;
+    private $statement;
+
+    public function __construct(PDO $pdo, $level = Logger::DEBUG, $bubble = true)
+    {
+        $this->pdo = $pdo;
+        parent::__construct($level, $bubble);
+    }
+
+    protected function write(array $record)
+    {
+        if (!$this->initialized) {
+            $this->initialize();
+        }
+
+        $this->statement->execute(array(
+            'channel' => $record['channel'],
+            'level' => $record['level'],
+            'message' => $record['formatted'],
+            'time' => $record['datetime']->format('U'),
+        ));
+    }
+
+    private function initialize()
+    {
+        $this->pdo->exec(
+            'CREATE TABLE IF NOT EXISTS monolog '
+            .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)'
+        );
+        $this->statement = $this->pdo->prepare(
+            'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)'
+        );
+
+        $this->initialized = true;
+    }
+}
+```
+
+You can now use this handler in your logger:
+
+```php
+<?php
+
+$logger->pushHandler(new PDOHandler(new PDO('sqlite:logs.sqlite'));
+
+// You can now use your logger
+$logger->addInfo('My logger is now ready');
+```
+
+The `Monolog\Handler\AbstractProcessingHandler` class provides most of the
+logic needed for the handler, including the use of processors and the formatting
+of the record (which is why we use ``$record['formatted']`` instead of ``$record['message']``).
diff --git a/core/vendor/monolog/monolog/doc/sockets.md b/core/vendor/monolog/monolog/doc/sockets.md
new file mode 100644
index 0000000..fad30a9
--- /dev/null
+++ b/core/vendor/monolog/monolog/doc/sockets.md
@@ -0,0 +1,37 @@
+Sockets Handler
+===============
+
+This handler allows you to write your logs to sockets using [fsockopen](http://php.net/fsockopen)
+or [pfsockopen](http://php.net/pfsockopen).
+
+Persistent sockets are mainly useful in web environments where you gain some performance not closing/opening
+the connections between requests.
+
+Basic Example
+-------------
+
+```php
+<?php
+
+use Monolog\Logger;
+use Monolog\Handler\SocketHandler;
+
+// Create the logger
+$logger = new Logger('my_logger');
+
+// Create the handler
+$handler = new SocketHandler('unix:///var/log/httpd_app_log.socket');
+$handler->setPersistent(true);
+
+// Now add the handler
+$logger->pushHandler($handler, Logger::DEBUG);
+
+// You can now use your logger
+$logger->addInfo('My logger is now ready');
+
+```
+
+In this example, using syslog-ng, you should see the log on the log server:
+
+    cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] []
+
diff --git a/core/vendor/monolog/monolog/doc/usage.md b/core/vendor/monolog/monolog/doc/usage.md
new file mode 100644
index 0000000..98db29a
--- /dev/null
+++ b/core/vendor/monolog/monolog/doc/usage.md
@@ -0,0 +1,123 @@
+Using Monolog
+=============
+
+Installation
+------------
+
+Monolog is available on Packagist ([monolog/monolog](http://packagist.org/packages/monolog/monolog))
+and as such installable via [Composer](http://getcomposer.org/).
+
+If you do not use Composer, you can grab the code from GitHub, and use any
+PSR-0 compatible autoloader (e.g. the [Symfony2 ClassLoader component](https://github.com/symfony/ClassLoader))
+to load Monolog classes.
+
+Configuring a logger
+--------------------
+
+Here is a basic setup to log to a file and to firephp on the DEBUG level:
+
+```php
+<?php
+
+use Monolog\Logger;
+use Monolog\Handler\StreamHandler;
+use Monolog\Handler\FirePHPHandler;
+
+// Create the logger
+$logger = new Logger('my_logger');
+// Now add some handlers
+$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));
+$logger->pushHandler(new FirePHPHandler());
+
+// You can now use your logger
+$logger->addInfo('My logger is now ready');
+```
+
+Let's explain it. The first step is to create the logger instance which will
+be used in your code. The argument is a channel name, which is useful when
+you use several loggers (see below for more details about it).
+
+The logger itself does not know how to handle a record. It delegates it to
+some handlers. The code above registers two handlers in the stack to allow
+handling records in two different ways.
+
+Note that the FirePHPHandler is called first as it is added on top of the
+stack. This allows you to temporarily add a logger with bubbling disabled if
+you want to override other configured loggers.
+
+Adding extra data in the records
+--------------------------------
+
+Monolog provides two different ways to add extra informations along the simple
+textual message.
+
+### Using the logging context
+
+The first way is the context, allowing to pass an array of data along the
+record:
+
+```php
+<?php
+
+$logger->addInfo('Adding a new user', array('username' => 'Seldaek'));
+```
+
+Simple handlers (like the StreamHandler for instance) will simply format
+the array to a string but richer handlers can take advantage of the context
+(FirePHP is able to display arrays in pretty way for instance).
+
+### Using processors
+
+The second way is to add extra data for all records by using a processor.
+Processors can be any callable. They will get the record as parameter and
+must return it after having eventually changed the `extra` part of it. Let's
+write a processor adding some dummy data in the record:
+
+```php
+<?php
+
+$logger->pushProcessor(function ($record) {
+    $record['extra']['dummy'] = 'Hello world!';
+
+    return $record;
+});
+```
+
+Monolog provides some built-in processors that can be used in your project.
+Look at the README file for the list.
+
+> Tip: processors can also be registered on a specific handler instead of
+  the logger to apply only for this handler.
+
+Leveraging channels
+-------------------
+
+Channels are a great way to identify to which part of the application a record
+is related. This is useful in big applications (and is leveraged by
+MonologBundle in Symfony2).
+
+Picture two loggers sharing a handler that writes to a single log file.
+Channels would allow you to identify the logger that issued every record.
+You can easily grep through the log files filtering this or that channel.
+
+```php
+<?php
+
+use Monolog\Logger;
+use Monolog\Handler\StreamHandler;
+use Monolog\Handler\FirePHPHandler;
+
+// Create some handlers
+$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
+$firephp = new FirePHPHandler();
+
+// Create the main logger of the app
+$logger = new Logger('my_logger');
+$logger->pushHandler($stream);
+$logger->pushHandler($firephp);
+
+// Create a logger for the security-related stuff with a different channel
+$securityLogger = new Logger('security');
+$securityLogger->pushHandler($stream);
+$securityLogger->pushHandler($firephp);
+```
diff --git a/core/vendor/monolog/monolog/phpunit.xml.dist b/core/vendor/monolog/monolog/phpunit.xml.dist
new file mode 100644
index 0000000..1754570
--- /dev/null
+++ b/core/vendor/monolog/monolog/phpunit.xml.dist
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit bootstrap="tests/bootstrap.php" colors="true">
+    <testsuites>
+        <testsuite name="Monolog Test Suite">
+            <directory>tests/Monolog/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory suffix=".php">src/Monolog/</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/core/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php b/core/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php
new file mode 100644
index 0000000..56d3e27
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+/**
+ * Formats a log message according to the ChromePHP array format
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class ChromePHPFormatter implements FormatterInterface
+{
+    /**
+     * Translates Monolog log levels to Wildfire levels.
+     */
+    private $logLevels = array(
+        Logger::DEBUG     => 'log',
+        Logger::INFO      => 'info',
+        Logger::NOTICE    => 'info',
+        Logger::WARNING   => 'warn',
+        Logger::ERROR     => 'error',
+        Logger::CRITICAL  => 'error',
+        Logger::ALERT     => 'error',
+        Logger::EMERGENCY => 'error',
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    public function format(array $record)
+    {
+        // Retrieve the line and file if set and remove them from the formatted extra
+        $backtrace = 'unknown';
+        if (isset($record['extra']['file']) && isset($record['extra']['line'])) {
+            $backtrace = $record['extra']['file'].' : '.$record['extra']['line'];
+            unset($record['extra']['file']);
+            unset($record['extra']['line']);
+        }
+
+        $message = array('message' => $record['message']);
+        if ($record['context']) {
+            $message['context'] = $record['context'];
+        }
+        if ($record['extra']) {
+            $message['extra'] = $record['extra'];
+        }
+        if (count($message) === 1) {
+            $message = reset($message);
+        }
+
+        return array(
+            $record['channel'],
+            $message,
+            $backtrace,
+            $this->logLevels[$record['level']],
+        );
+    }
+
+    public function formatBatch(array $records)
+    {
+        $formatted = array();
+
+        foreach ($records as $record) {
+            $formatted[] = $this->format($record);
+        }
+
+        return $formatted;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php b/core/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php
new file mode 100644
index 0000000..b5de751
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * Interface for formatters
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+interface FormatterInterface
+{
+    /**
+     * Formats a log record.
+     *
+     * @param  array $record A record to format
+     * @return mixed The formatted record
+     */
+    public function format(array $record);
+
+    /**
+     * Formats a set of log records.
+     *
+     * @param  array $records A set of records to format
+     * @return mixed The formatted set of records
+     */
+    public function formatBatch(array $records);
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/core/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
new file mode 100644
index 0000000..0856f86
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+use Gelf\Message;
+
+/**
+ * Serializes a log message to GELF
+ * @see http://www.graylog2.org/about/gelf
+ *
+ * @author Matt Lehner <mlehner@gmail.com>
+ */
+class GelfMessageFormatter extends NormalizerFormatter
+{
+    /**
+     * @var string the name of the system for the Gelf log message
+     */
+    protected $systemName;
+
+    /**
+     * @var string a prefix for 'extra' fields from the Monolog record (optional)
+     */
+    protected $extraPrefix;
+
+    /**
+     * @var string a prefix for 'context' fields from the Monolog record (optional)
+     */
+    protected $contextPrefix;
+
+    /**
+     * Translates Monolog log levels to Graylog2 log priorities.
+     */
+    private $logLevels = array(
+        Logger::DEBUG     => LOG_DEBUG,
+        Logger::INFO      => LOG_INFO,
+        Logger::NOTICE    => LOG_NOTICE,
+        Logger::WARNING   => LOG_WARNING,
+        Logger::ERROR     => LOG_ERR,
+        Logger::CRITICAL  => LOG_CRIT,
+        Logger::ALERT     => LOG_ALERT,
+        Logger::EMERGENCY => LOG_EMERG,
+    );
+
+    public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_')
+    {
+        parent::__construct('U.u');
+
+        $this->systemName = $systemName ?: gethostname();
+
+        $this->extraPrefix = $extraPrefix;
+        $this->contextPrefix = $contextPrefix;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function format(array $record)
+    {
+        $record = parent::format($record);
+        $message = new Message();
+        $message
+            ->setTimestamp($record['datetime'])
+            ->setShortMessage((string) $record['message'])
+            ->setFacility($record['channel'])
+            ->setHost($this->systemName)
+            ->setLine(isset($record['extra']['line']) ? $record['extra']['line'] : null)
+            ->setFile(isset($record['extra']['file']) ? $record['extra']['file'] : null)
+            ->setLevel($this->logLevels[$record['level']]);
+
+        // Do not duplicate these values in the additional fields
+        unset($record['extra']['line']);
+        unset($record['extra']['file']);
+
+        foreach ($record['extra'] as $key => $val) {
+            $message->setAdditional($this->extraPrefix . $key, is_scalar($val) ? $val : $this->toJson($val));
+        }
+
+        foreach ($record['context'] as $key => $val) {
+            $message->setAdditional($this->contextPrefix . $key, is_scalar($val) ? $val : $this->toJson($val));
+        }
+
+        return $message;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/core/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
new file mode 100644
index 0000000..822af0e
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * Encodes whatever record data is passed to it as json
+ *
+ * This can be useful to log to databases or remote APIs
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class JsonFormatter implements FormatterInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function format(array $record)
+    {
+        return json_encode($record);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function formatBatch(array $records)
+    {
+        return json_encode($records);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/core/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
new file mode 100644
index 0000000..1054dbb
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * Formats incoming records into a one-line string
+ *
+ * This is especially useful for logging to files
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class LineFormatter extends NormalizerFormatter
+{
+    const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n";
+
+    protected $format;
+
+    /**
+     * @param string $format     The format of the message
+     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format
+     */
+    public function __construct($format = null, $dateFormat = null)
+    {
+        $this->format = $format ?: static::SIMPLE_FORMAT;
+        parent::__construct($dateFormat);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function format(array $record)
+    {
+        $vars = parent::format($record);
+
+        $output = $this->format;
+        foreach ($vars['extra'] as $var => $val) {
+            if (false !== strpos($output, '%extra.'.$var.'%')) {
+                $output = str_replace('%extra.'.$var.'%', $this->convertToString($val), $output);
+                unset($vars['extra'][$var]);
+            }
+        }
+        foreach ($vars as $var => $val) {
+            $output = str_replace('%'.$var.'%', $this->convertToString($val), $output);
+        }
+
+        return $output;
+    }
+
+    public function formatBatch(array $records)
+    {
+        $message = '';
+        foreach ($records as $record) {
+            $message .= $this->format($record);
+        }
+
+        return $message;
+    }
+
+    protected function normalize($data)
+    {
+        if (is_bool($data) || is_null($data)) {
+            return var_export($data, true);
+        }
+
+        return parent::normalize($data);
+    }
+
+    protected function convertToString($data)
+    {
+        if (null === $data || is_scalar($data)) {
+            return (string) $data;
+        }
+
+        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
+            return json_encode($this->normalize($data), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
+        }
+
+        return stripslashes(json_encode($this->normalize($data)));
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/core/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
new file mode 100644
index 0000000..6ce4a2e
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class NormalizerFormatter implements FormatterInterface
+{
+    const SIMPLE_DATE = "Y-m-d H:i:s";
+
+    protected $dateFormat;
+
+    /**
+     * @param string $dateFormat The format of the timestamp: one supported by DateTime::format
+     */
+    public function __construct($dateFormat = null)
+    {
+        $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function format(array $record)
+    {
+        return $this->normalize($record);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function formatBatch(array $records)
+    {
+        foreach ($records as $key => $record) {
+            $records[$key] = $this->format($record);
+        }
+
+        return $records;
+    }
+
+    protected function normalize($data)
+    {
+        if (null === $data || is_scalar($data)) {
+            return $data;
+        }
+
+        if (is_array($data) || $data instanceof \Traversable) {
+            $normalized = array();
+
+            foreach ($data as $key => $value) {
+                $normalized[$key] = $this->normalize($value);
+            }
+
+            return $normalized;
+        }
+
+        if ($data instanceof \DateTime) {
+            return $data->format($this->dateFormat);
+        }
+
+        if (is_object($data)) {
+            return sprintf("[object] (%s: %s)", get_class($data), $this->toJson($data));
+        }
+
+        if (is_resource($data)) {
+            return '[resource]';
+        }
+
+        return '[unknown('.gettype($data).')]';
+    }
+
+    protected function toJson($data)
+    {
+        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
+            return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
+        }
+
+        return json_encode($data);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/core/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
new file mode 100644
index 0000000..8ca6f2b
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+/**
+ * Serializes a log message according to Wildfire's header requirements
+ *
+ * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>
+ * @author Christophe Coevoet <stof@notk.org>
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
+ */
+class WildfireFormatter extends NormalizerFormatter
+{
+    /**
+     * Translates Monolog log levels to Wildfire levels.
+     */
+    private $logLevels = array(
+        Logger::DEBUG     => 'LOG',
+        Logger::INFO      => 'INFO',
+        Logger::NOTICE    => 'INFO',
+        Logger::WARNING   => 'WARN',
+        Logger::ERROR     => 'ERROR',
+        Logger::CRITICAL  => 'ERROR',
+        Logger::ALERT     => 'ERROR',
+        Logger::EMERGENCY => 'ERROR',
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    public function format(array $record)
+    {
+        // Retrieve the line and file if set and remove them from the formatted extra
+        $file = $line = '';
+        if (isset($record['extra']['file'])) {
+            $file = $record['extra']['file'];
+            unset($record['extra']['file']);
+        }
+        if (isset($record['extra']['line'])) {
+            $line = $record['extra']['line'];
+            unset($record['extra']['line']);
+        }
+
+        $record = $this->normalize($record);
+        $message = array('message' => $record['message']);
+        if ($record['context']) {
+            $message['context'] = $record['context'];
+        }
+        if ($record['extra']) {
+            $message['extra'] = $record['extra'];
+        }
+        if (count($message) === 1) {
+            $message = reset($message);
+        }
+
+        // Create JSON object describing the appearance of the message in the console
+        $json = json_encode(array(
+            array(
+                'Type'  => $this->logLevels[$record['level']],
+                'File'  => $file,
+                'Line'  => $line,
+                'Label' => $record['channel'],
+            ),
+            $message,
+        ));
+
+        // The message itself is a serialization of the above JSON object + it's length
+        return sprintf(
+            '%s|%s|',
+            strlen($json),
+            $json
+        );
+    }
+
+    public function formatBatch(array $records)
+    {
+        throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter');
+    }
+
+    protected function normalize($data)
+    {
+        if (is_object($data) && !$data instanceof \DateTime) {
+            return $data;
+        }
+
+        return parent::normalize($data);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
new file mode 100644
index 0000000..2ea9f55
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
@@ -0,0 +1,174 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\Formatter\FormatterInterface;
+use Monolog\Formatter\LineFormatter;
+
+/**
+ * Base Handler class providing the Handler structure
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+abstract class AbstractHandler implements HandlerInterface
+{
+    protected $level = Logger::DEBUG;
+    protected $bubble = false;
+
+    /**
+     * @var FormatterInterface
+     */
+    protected $formatter;
+    protected $processors = array();
+
+    /**
+     * @param integer $level  The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct($level = Logger::DEBUG, $bubble = true)
+    {
+        $this->level = $level;
+        $this->bubble = $bubble;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isHandling(array $record)
+    {
+        return $record['level'] >= $this->level;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handleBatch(array $records)
+    {
+        foreach ($records as $record) {
+            $this->handle($record);
+        }
+    }
+
+    /**
+     * Closes the handler.
+     *
+     * This will be called automatically when the object is destroyed
+     */
+    public function close()
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function pushProcessor($callback)
+    {
+        if (!is_callable($callback)) {
+            throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
+        }
+        array_unshift($this->processors, $callback);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function popProcessor()
+    {
+        if (!$this->processors) {
+            throw new \LogicException('You tried to pop from an empty processor stack.');
+        }
+
+        return array_shift($this->processors);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(FormatterInterface $formatter)
+    {
+        $this->formatter = $formatter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter()
+    {
+        if (!$this->formatter) {
+            $this->formatter = $this->getDefaultFormatter();
+        }
+
+        return $this->formatter;
+    }
+
+    /**
+     * Sets minimum logging level at which this handler will be triggered.
+     *
+     * @param integer $level
+     */
+    public function setLevel($level)
+    {
+        $this->level = $level;
+    }
+
+    /**
+     * Gets minimum logging level at which this handler will be triggered.
+     *
+     * @return integer
+     */
+    public function getLevel()
+    {
+        return $this->level;
+    }
+
+    /**
+     * Sets the bubbling behavior.
+     *
+     * @param Boolean $bubble True means that bubbling is not permitted.
+     *                        False means that this handler allows bubbling.
+     */
+    public function setBubble($bubble)
+    {
+        $this->bubble = $bubble;
+    }
+
+    /**
+     * Gets the bubbling behavior.
+     *
+     * @return Boolean True means that bubbling is not permitted.
+     *                 False means that this handler allows bubbling.
+     */
+    public function getBubble()
+    {
+        return $this->bubble;
+    }
+
+    public function __destruct()
+    {
+        try {
+            $this->close();
+        } catch (\Exception $e) {
+            // do nothing
+        }
+    }
+
+    /**
+     * Gets the default formatter.
+     *
+     * @return FormatterInterface
+     */
+    protected function getDefaultFormatter()
+    {
+        return new LineFormatter();
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
new file mode 100644
index 0000000..e1e5b89
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+/**
+ * Base Handler class providing the Handler structure
+ *
+ * Classes extending it should (in most cases) only implement write($record)
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+abstract class AbstractProcessingHandler extends AbstractHandler
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(array $record)
+    {
+        if ($record['level'] < $this->level) {
+            return false;
+        }
+
+        $record = $this->processRecord($record);
+
+        $record['formatted'] = $this->getFormatter()->format($record);
+
+        $this->write($record);
+
+        return false === $this->bubble;
+    }
+
+    /**
+     * Writes the record down to the log of the implementing handler
+     *
+     * @param  array $record
+     * @return void
+     */
+    abstract protected function write(array $record);
+
+    /**
+     * Processes a record.
+     *
+     * @param  array $record
+     * @return array
+     */
+    protected function processRecord(array $record)
+    {
+        if ($this->processors) {
+            foreach ($this->processors as $processor) {
+                $record = call_user_func($processor, $record);
+            }
+        }
+
+        return $record;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php
new file mode 100644
index 0000000..0070343
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\Formatter\JsonFormatter;
+
+class AmqpHandler extends AbstractProcessingHandler
+{
+    /**
+     * @var \AMQPExchange $exchange
+     */
+    protected $exchange;
+
+    /**
+     * @param \AMQPExchange $exchange     AMQP exchange, ready for use
+     * @param string        $exchangeName
+     * @param int           $level
+     * @param bool          $bubble       Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct(\AMQPExchange $exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = true)
+    {
+        $this->exchange = $exchange;
+        $this->exchange->setName($exchangeName);
+
+        parent::__construct($level, $bubble);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function write(array $record)
+    {
+        $data = $record["formatted"];
+
+        $routingKey = sprintf(
+            '%s.%s',
+            substr($record['level_name'], 0, 4),
+            $record['channel']
+        );
+
+        $this->exchange->publish(
+            $data,
+            strtolower($routingKey),
+            0,
+            array(
+                'delivery_mode' => 2,
+                'Content-type' => 'application/json'
+            )
+        );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getDefaultFormatter()
+    {
+        return new JsonFormatter();
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
new file mode 100644
index 0000000..afbb4a6
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Buffers all records until closing the handler and then pass them as batch.
+ *
+ * This is useful for a MailHandler to send only one mail per request instead of
+ * sending one per log message.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class BufferHandler extends AbstractHandler
+{
+    protected $handler;
+    protected $bufferSize;
+    protected $buffer = array();
+
+    /**
+     * @param HandlerInterface $handler    Handler.
+     * @param integer          $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
+     * @param integer          $level      The minimum logging level at which this handler will be triggered
+     * @param Boolean          $bubble     Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct(HandlerInterface $handler, $bufferSize = 0, $level = Logger::DEBUG, $bubble = true)
+    {
+        parent::__construct($level, $bubble);
+        $this->handler = $handler;
+        $this->bufferSize = $bufferSize;
+
+        // __destructor() doesn't get called on Fatal errors
+        register_shutdown_function(array($this, 'close'));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(array $record)
+    {
+        if ($record['level'] < $this->level) {
+            return false;
+        }
+
+        $this->buffer[] = $record;
+        if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) {
+            array_shift($this->buffer);
+        }
+
+        return false === $this->bubble;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        if ($this->buffer) {
+            $this->handler->handleBatch($this->buffer);
+            $this->buffer = array();
+        }
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
new file mode 100644
index 0000000..86d7feb
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
@@ -0,0 +1,126 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Formatter\ChromePHPFormatter;
+
+/**
+ * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/)
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class ChromePHPHandler extends AbstractProcessingHandler
+{
+    /**
+     * Version of the extension
+     */
+    const VERSION = '3.0';
+
+    /**
+     * Header name
+     */
+    const HEADER_NAME = 'X-ChromePhp-Data';
+
+    protected static $initialized = false;
+
+    protected static $json = array(
+        'version' => self::VERSION,
+        'columns' => array('label', 'log', 'backtrace', 'type'),
+        'rows' => array(),
+    );
+
+    protected $sendHeaders = true;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handleBatch(array $records)
+    {
+        $messages = array();
+
+        foreach ($records as $record) {
+            if ($record['level'] < $this->level) {
+                continue;
+            }
+            $messages[] = $this->processRecord($record);
+        }
+
+        if (!empty($messages)) {
+            $messages = $this->getFormatter()->formatBatch($messages);
+            self::$json['rows'] = array_merge(self::$json['rows'], $messages);
+            $this->send();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getDefaultFormatter()
+    {
+        return new ChromePHPFormatter();
+    }
+
+    /**
+     * Creates & sends header for a record
+     *
+     * @see sendHeader()
+     * @see send()
+     * @param array $record
+     */
+    protected function write(array $record)
+    {
+        self::$json['rows'][] = $record['formatted'];
+
+        $this->send();
+    }
+
+    /**
+     * Sends the log header
+     *
+     * @see sendHeader()
+     */
+    protected function send()
+    {
+        if (!self::$initialized) {
+            $this->sendHeaders = $this->headersAccepted();
+            self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
+
+            self::$initialized = true;
+        }
+
+        $this->sendHeader(self::HEADER_NAME, base64_encode(utf8_encode(json_encode(self::$json))));
+    }
+
+    /**
+     * Send header string to the client
+     *
+     * @param string $header
+     * @param string $content
+     */
+    protected function sendHeader($header, $content)
+    {
+        if (!headers_sent() && $this->sendHeaders) {
+            header(sprintf('%s: %s', $header, $content));
+        }
+    }
+
+    /**
+     * Verifies if the headers are accepted by the current user agent
+     *
+     * @return Boolean
+     */
+    protected function headersAccepted()
+    {
+        return !isset($_SERVER['HTTP_USER_AGENT'])
+               || preg_match('{\bChrome/\d+[\.\d+]*\b}', $_SERVER['HTTP_USER_AGENT']);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
new file mode 100644
index 0000000..c21e0e3
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
@@ -0,0 +1,145 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Logs to Cube.
+ *
+ * @link http://square.github.com/cube/
+ * @author Wan Chen <kami@kamisama.me>
+ */
+class CubeHandler extends AbstractProcessingHandler
+{
+    private $udpConnection = null;
+    private $httpConnection = null;
+    private $scheme = null;
+    private $host = null;
+    private $port = null;
+    private $acceptedSchemes = array('http', 'udp');
+
+    /**
+     * Create a Cube handler
+     *
+     * @throws UnexpectedValueException when given url is not a valid url.
+     * A valid url must consists of three parts : protocol://host:port
+     * Only valid protocol used by Cube are http and udp
+     */
+    public function __construct($url, $level = Logger::DEBUG, $bubble = true)
+    {
+        $urlInfos = parse_url($url);
+
+        if (!isset($urlInfos['scheme']) || !isset($urlInfos['host']) || !isset($urlInfos['port'])) {
+            throw new \UnexpectedValueException('URL "'.$url.'" is not valid');
+        }
+
+        if (!in_array($urlInfos['scheme'], $this->acceptedSchemes)) {
+            throw new \UnexpectedValueException(
+                'Invalid protocol (' . $urlInfos['scheme']  . ').'
+                . ' Valid options are ' . implode(', ', $this->acceptedSchemes));
+        }
+
+        $this->scheme = $urlInfos['scheme'];
+        $this->host = $urlInfos['host'];
+        $this->port = $urlInfos['port'];
+
+        parent::__construct($level, $bubble);
+    }
+
+    /**
+     * Establish a connection to an UDP socket
+     *
+     * @throws LogicException when unable to connect to the socket
+     */
+    protected function connectUdp()
+    {
+        if (!extension_loaded('sockets')) {
+            throw new \LogicException('The sockets extension is needed to use udp URLs with the CubeHandler');
+        }
+
+        $this->udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0);
+        if (!$this->udpConnection) {
+            throw new \LogicException('Unable to create a socket');
+        }
+
+        if (!socket_connect($this->udpConnection, $this->host, $this->port)) {
+            throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port);
+        }
+    }
+
+    /**
+     * Establish a connection to a http server
+     */
+    protected function connectHttp()
+    {
+        if (!extension_loaded('curl')) {
+            throw new \LogicException('The curl extension is needed to use http URLs with the CubeHandler');
+        }
+
+        $this->httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put');
+
+        if (!$this->httpConnection) {
+            throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port);
+        }
+
+        curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST");
+        curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        $date = $record['datetime'];
+
+        $data = array('time' => $date->format('Y-m-d H:i:s'));
+        unset($record['datetime']);
+
+        if (isset($record['context']['type'])) {
+            $data['type'] = $record['context']['type'];
+            unset($record['context']['type']);
+        } else {
+            $data['type'] = $record['channel'];
+        }
+
+        $data['data'] = $record['context'];
+        $data['data']['level'] = $record['level'];
+
+        $this->{'write'.$this->scheme}(json_encode($data));
+    }
+
+    private function writeUdp($data)
+    {
+        if (!$this->udpConnection) {
+            $this->connectUdp();
+        }
+
+        socket_send($this->udpConnection, $data, strlen($data), 0);
+    }
+
+    private function writeHttp($data)
+    {
+        if (!$this->httpConnection) {
+            $this->connectHttp();
+        }
+
+        curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']');
+        curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, array(
+                'Content-Type: application/json',
+                'Content-Length: ' . strlen('['.$data.']'))
+        );
+
+        return curl_exec($this->httpConnection);
+    }
+}
\ No newline at end of file
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
new file mode 100644
index 0000000..c3e42ef
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler\FingersCrossed;
+
+/**
+ * Interface for activation strategies for the FingersCrossedHandler.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+interface ActivationStrategyInterface
+{
+    /**
+     * Returns whether the given record activates the handler.
+     *
+     * @param  array   $record
+     * @return Boolean
+     */
+    public function isHandlerActivated(array $record);
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php b/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
new file mode 100644
index 0000000..7cd8ef1
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler\FingersCrossed;
+
+/**
+ * Error level based activation strategy.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ErrorLevelActivationStrategy implements ActivationStrategyInterface
+{
+    private $actionLevel;
+
+    public function __construct($actionLevel)
+    {
+        $this->actionLevel = $actionLevel;
+    }
+
+    public function isHandlerActivated(array $record)
+    {
+        return $record['level'] >= $this->actionLevel;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
new file mode 100644
index 0000000..561ee7c
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
+use Monolog\Handler\FingersCrossed\ActivationStrategyInterface;
+use Monolog\Logger;
+
+/**
+ * Buffers all records until a certain level is reached
+ *
+ * The advantage of this approach is that you don't get any clutter in your log files.
+ * Only requests which actually trigger an error (or whatever your actionLevel is) will be
+ * in the logs, but they will contain all records, not only those above the level threshold.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class FingersCrossedHandler extends AbstractHandler
+{
+    protected $handler;
+    protected $activationStrategy;
+    protected $buffering = true;
+    protected $bufferSize;
+    protected $buffer = array();
+    protected $stopBuffering;
+
+    /**
+     * @param callback|HandlerInterface       $handler            Handler or factory callback($record, $fingersCrossedHandler).
+     * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action
+     * @param int                             $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
+     * @param Boolean                         $bubble             Whether the messages that are handled can bubble up the stack or not
+     * @param Boolean                         $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
+     */
+    public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true)
+    {
+        if (null === $activationStrategy) {
+            $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING);
+        }
+        if (!$activationStrategy instanceof ActivationStrategyInterface) {
+            $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy);
+        }
+
+        $this->handler = $handler;
+        $this->activationStrategy = $activationStrategy;
+        $this->bufferSize = $bufferSize;
+        $this->bubble = $bubble;
+        $this->stopBuffering = $stopBuffering;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isHandling(array $record)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(array $record)
+    {
+        if ($this->buffering) {
+            $this->buffer[] = $record;
+            if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) {
+                array_shift($this->buffer);
+            }
+            if ($this->activationStrategy->isHandlerActivated($record)) {
+                if ($this->stopBuffering) {
+                    $this->buffering = false;
+                }
+                if (!$this->handler instanceof HandlerInterface) {
+                    $this->handler = call_user_func($this->handler, $record, $this);
+                }
+                if (!$this->handler instanceof HandlerInterface) {
+                    throw new \RuntimeException("The factory callback should return a HandlerInterface");
+                }
+                $this->handler->handleBatch($this->buffer);
+                $this->buffer = array();
+            }
+        } else {
+            $this->handler->handle($record);
+        }
+
+        return false === $this->bubble;
+    }
+
+    /**
+     * Resets the state of the handler. Stops forwarding records to the wrapped handler.
+     */
+    public function reset()
+    {
+        $this->buffering = true;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
new file mode 100644
index 0000000..0909218
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Formatter\WildfireFormatter;
+
+/**
+ * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol.
+ *
+ * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>
+ */
+class FirePHPHandler extends AbstractProcessingHandler
+{
+    /**
+     * WildFire JSON header message format
+     */
+    const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2';
+
+    /**
+     * FirePHP structure for parsing messages & their presentation
+     */
+    const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1';
+
+    /**
+     * Must reference a "known" plugin, otherwise headers won't display in FirePHP
+     */
+    const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3';
+
+    /**
+     * Header prefix for Wildfire to recognize & parse headers
+     */
+    const HEADER_PREFIX = 'X-Wf';
+
+    /**
+     * Whether or not Wildfire vendor-specific headers have been generated & sent yet
+     */
+    protected static $initialized = false;
+
+    /**
+     * Shared static message index between potentially multiple handlers
+     * @var int
+     */
+    protected static $messageIndex = 1;
+
+    protected $sendHeaders = true;
+
+    /**
+     * Base header creation function used by init headers & record headers
+     *
+     * @param  array  $meta    Wildfire Plugin, Protocol & Structure Indexes
+     * @param  string $message Log message
+     * @return array  Complete header string ready for the client as key and message as value
+     */
+    protected function createHeader(array $meta, $message)
+    {
+        $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta));
+
+        return array($header => $message);
+    }
+
+    /**
+     * Creates message header from record
+     *
+     * @see createHeader()
+     * @param  array  $record
+     * @return string
+     */
+    protected function createRecordHeader(array $record)
+    {
+        // Wildfire is extensible to support multiple protocols & plugins in a single request,
+        // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake.
+        return $this->createHeader(
+            array(1, 1, 1, self::$messageIndex++),
+            $record['formatted']
+        );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getDefaultFormatter()
+    {
+        return new WildfireFormatter();
+    }
+
+    /**
+     * Wildfire initialization headers to enable message parsing
+     *
+     * @see createHeader()
+     * @see sendHeader()
+     * @return array
+     */
+    protected function getInitHeaders()
+    {
+        // Initial payload consists of required headers for Wildfire
+        return array_merge(
+            $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI),
+            $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI),
+            $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI)
+        );
+    }
+
+    /**
+     * Send header string to the client
+     *
+     * @param string $header
+     * @param string $content
+     */
+    protected function sendHeader($header, $content)
+    {
+        if (!headers_sent() && $this->sendHeaders) {
+            header(sprintf('%s: %s', $header, $content));
+        }
+    }
+
+    /**
+     * Creates & sends header for a record, ensuring init headers have been sent prior
+     *
+     * @see sendHeader()
+     * @see sendInitHeaders()
+     * @param array $record
+     */
+    protected function write(array $record)
+    {
+        // WildFire-specific headers must be sent prior to any messages
+        if (!self::$initialized) {
+            $this->sendHeaders = $this->headersAccepted();
+
+            foreach ($this->getInitHeaders() as $header => $content) {
+                $this->sendHeader($header, $content);
+            }
+
+            self::$initialized = true;
+        }
+
+        $header = $this->createRecordHeader($record);
+        $this->sendHeader(key($header), current($header));
+    }
+
+    /**
+     * Verifies if the headers are accepted by the current user agent
+     *
+     * @return Boolean
+     */
+    protected function headersAccepted()
+    {
+        return !isset($_SERVER['HTTP_USER_AGENT'])
+               || preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])
+               || isset($_SERVER['HTTP_X_FIREPHP_VERSION']);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
new file mode 100644
index 0000000..34d48e7
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Gelf\IMessagePublisher;
+use Monolog\Logger;
+use Monolog\Handler\AbstractProcessingHandler;
+use Monolog\Formatter\GelfMessageFormatter;
+
+/**
+ * Handler to send messages to a Graylog2 (http://www.graylog2.org) server
+ *
+ * @author Matt Lehner <mlehner@gmail.com>
+ */
+class GelfHandler extends AbstractProcessingHandler
+{
+    /**
+     * @var Gelf\IMessagePublisher the publisher object that sends the message to the server
+     */
+    protected $publisher;
+
+    /**
+     * @param Gelf\IMessagePublisher $publisher a publisher object
+     * @param integer                $level     The minimum logging level at which this handler will be triggered
+     * @param Boolean                $bubble    Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct(IMessagePublisher $publisher, $level = Logger::DEBUG, $bubble = true)
+    {
+        parent::__construct($level, $bubble);
+
+        $this->publisher = $publisher;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        $this->publisher = null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        $this->publisher->publish($record['formatted']);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getDefaultFormatter()
+    {
+        return new GelfMessageFormatter();
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
new file mode 100644
index 0000000..cd29531
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+/**
+ * Forwards records to multiple handlers
+ *
+ * @author Lenar Lõhmus <lenar@city.ee>
+ */
+class GroupHandler extends AbstractHandler
+{
+    protected $handlers;
+
+    /**
+     * @param array   $handlers Array of Handlers.
+     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct(array $handlers, $bubble = true)
+    {
+        foreach ($handlers as $handler) {
+            if (!$handler instanceof HandlerInterface) {
+                throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.');
+            }
+        }
+
+        $this->handlers = $handlers;
+        $this->bubble = $bubble;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isHandling(array $record)
+    {
+        foreach ($this->handlers as $handler) {
+            if ($handler->isHandling($record)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(array $record)
+    {
+        foreach ($this->handlers as $handler) {
+            $handler->handle($record);
+        }
+
+        return false === $this->bubble;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handleBatch(array $records)
+    {
+        foreach ($this->handlers as $handler) {
+            $handler->handleBatch($records);
+        }
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/core/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
new file mode 100644
index 0000000..d24dc77
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Formatter\FormatterInterface;
+
+/**
+ * Interface that all Monolog Handlers must implement
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+interface HandlerInterface
+{
+    /**
+     * Checks whether the given record will be handled by this handler.
+     *
+     * This is mostly done for performance reasons, to avoid calling processors for nothing.
+     *
+     * @return Boolean
+     */
+    public function isHandling(array $record);
+
+    /**
+     * Handles a record.
+     *
+     * The return value of this function controls the bubbling process of the handler stack.
+     *
+     * @param  array   $record The record to handle
+     * @return Boolean True means that this handler handled the record, and that bubbling is not permitted.
+     *                 False means the record was either not processed or that this handler allows bubbling.
+     */
+    public function handle(array $record);
+
+    /**
+     * Handles a set of records at once.
+     *
+     * @param array $records The records to handle (an array of record arrays)
+     */
+    public function handleBatch(array $records);
+
+    /**
+     * Adds a processor in the stack.
+     *
+     * @param callable $callback
+     */
+    public function pushProcessor($callback);
+
+    /**
+     * Removes the processor on top of the stack and returns it.
+     *
+     * @return callable
+     */
+    public function popProcessor();
+
+    /**
+     * Sets the formatter.
+     *
+     * @param FormatterInterface $formatter
+     */
+    public function setFormatter(FormatterInterface $formatter);
+
+    /**
+     * Gets the formatter.
+     *
+     * @return FormatterInterface
+     */
+    public function getFormatter();
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
new file mode 100644
index 0000000..8629272
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+/**
+ * Base class for all mail handlers
+ *
+ * @author Gyula Sallai
+ */
+abstract class MailHandler extends AbstractProcessingHandler
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function handleBatch(array $records)
+    {
+        $messages = array();
+
+        foreach ($records as $record) {
+            if ($record['level'] < $this->level) {
+                continue;
+            }
+            $messages[] = $this->processRecord($record);
+        }
+
+        if (!empty($messages)) {
+            $this->send((string) $this->getFormatter()->formatBatch($messages), $messages);
+        }
+    }
+
+    /**
+     * Send a mail with the given content
+     *
+     * @param string $content
+     * @param array  $records the array of log records that formed this content
+     */
+    abstract protected function send($content, array $records);
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        $this->send((string) $record['formatted'], array($record));
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php
new file mode 100644
index 0000000..210bb19
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Thomas Tourlourat <thomas@tourlourat.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\Formatter\NormalizerFormatter;
+
+/**
+ * Logs to a MongoDB database.
+ *
+ * usage example:
+ *
+ *   $log = new Logger('application');
+ *   $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod");
+ *   $log->pushHandler($mongodb);
+ *
+ * @author Thomas Tourlourat <thomas@tourlourat.com>
+ */
+class MongoDBHandler extends AbstractProcessingHandler
+{
+    private $mongoCollection;
+
+    public function __construct(\Mongo $mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true)
+    {
+        $this->mongoCollection = $mongo->selectCollection($database, $collection);
+
+        parent::__construct($level, $bubble);
+    }
+
+    protected function write(array $record)
+    {
+        $this->mongoCollection->save($record["formatted"]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getDefaultFormatter()
+    {
+        return new NormalizerFormatter();
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
new file mode 100644
index 0000000..c954de5
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * NativeMailerHandler uses the mail() function to send the emails
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class NativeMailerHandler extends MailHandler
+{
+    protected $to;
+    protected $subject;
+    protected $headers = array(
+        'Content-type: text/plain; charset=utf-8'
+    );
+
+    /**
+     * @param string|array $to      The receiver of the mail
+     * @param string       $subject The subject of the mail
+     * @param string       $from    The sender of the mail
+     * @param integer      $level   The minimum logging level at which this handler will be triggered
+     * @param boolean      $bubble  Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true)
+    {
+        parent::__construct($level, $bubble);
+        $this->to = is_array($to) ? $to : array($to);
+        $this->subject = $subject;
+        $this->headers[] = sprintf('From: %s', $from);
+    }
+
+    /**
+     * @param string|array $header Custom added headers
+     */
+    public function addHeader($headers)
+    {
+        if (is_array($headers)) {
+            $this->headers = array_merge($this->headers, $headers);
+        } else {
+            $this->headers[] = $headers;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function send($content, array $records)
+    {
+        foreach ($this->to as $to) {
+            mail($to, $this->subject, wordwrap($content, 70), implode("\r\n", $this->headers) . "\r\n");
+        }
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php
new file mode 100644
index 0000000..3754e45
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Blackhole
+ *
+ * Any record it can handle will be thrown away. This can be used
+ * to put on top of an existing stack to override it temporarily.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class NullHandler extends AbstractHandler
+{
+    /**
+     * @param integer $level The minimum logging level at which this handler will be triggered
+     */
+    public function __construct($level = Logger::DEBUG)
+    {
+        parent::__construct($level, false);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(array $record)
+    {
+        if ($record['level'] < $this->level) {
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
new file mode 100644
index 0000000..682542c
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Stores logs to files that are rotated every day and a limited number of files are kept.
+ *
+ * This rotation is only intended to be used as a workaround. Using logrotate to
+ * handle the rotation is strongly encouraged when you can use it.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class RotatingFileHandler extends StreamHandler
+{
+    protected $filename;
+    protected $maxFiles;
+    protected $mustRotate;
+
+    /**
+     * @param string  $filename
+     * @param integer $maxFiles The maximal amount of files to keep (0 means unlimited)
+     * @param integer $level    The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true)
+    {
+        $this->filename = $filename;
+        $this->maxFiles = (int) $maxFiles;
+
+        $fileInfo = pathinfo($this->filename);
+        $timedFilename = $fileInfo['dirname'].'/'.$fileInfo['filename'].'-'.date('Y-m-d');
+        if (!empty($fileInfo['extension'])) {
+            $timedFilename .= '.'.$fileInfo['extension'];
+        }
+
+        // disable rotation upfront if files are unlimited
+        if (0 === $this->maxFiles) {
+            $this->mustRotate = false;
+        }
+
+        parent::__construct($timedFilename, $level, $bubble);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        parent::close();
+
+        if (true === $this->mustRotate) {
+            $this->rotate();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        // on the first record written, if the log is new, we should rotate (once per day)
+        if (null === $this->mustRotate) {
+            $this->mustRotate = !file_exists($this->url);
+        }
+
+        parent::write($record);
+    }
+
+    /**
+     * Rotates the files.
+     */
+    protected function rotate()
+    {
+        $fileInfo = pathinfo($this->filename);
+        $glob = $fileInfo['dirname'].'/'.$fileInfo['filename'].'-*';
+        if (!empty($fileInfo['extension'])) {
+            $glob .= '.'.$fileInfo['extension'];
+        }
+        $iterator = new \GlobIterator($glob);
+        $count = $iterator->count();
+        if ($this->maxFiles >= $count) {
+            // no files to remove
+            return;
+        }
+
+        // Sorting the files by name to remove the older ones
+        $array = iterator_to_array($iterator);
+        usort($array, function($a, $b) {
+            return strcmp($b->getFilename(), $a->getFilename());
+        });
+
+        foreach (array_slice($array, $this->maxFiles) as $file) {
+            if ($file->isWritable()) {
+                unlink($file->getRealPath());
+            }
+        }
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
new file mode 100644
index 0000000..1aaa22a
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
@@ -0,0 +1,279 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Stores to any socket - uses fsockopen() or pfsockopen().
+ *
+ * @author Pablo de Leon Belloc <pablolb@gmail.com>
+ * @see    http://php.net/manual/en/function.fsockopen.php
+ */
+class SocketHandler extends AbstractProcessingHandler
+{
+    private $connectionString;
+    private $connectionTimeout;
+    private $resource;
+    private $timeout = 0;
+    private $persistent = false;
+    private $errno;
+    private $errstr;
+
+    /**
+     * @param string  $connectionString Socket connection string
+     * @param integer $level            The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble           Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true)
+    {
+        parent::__construct($level, $bubble);
+        $this->connectionString = $connectionString;
+        $this->connectionTimeout = (float) ini_get('default_socket_timeout');
+    }
+
+    /**
+     * Connect (if necessary) and write to the socket
+     *
+     * @param array $record
+     *
+     * @throws \UnexpectedValueException
+     * @throws \RuntimeException
+     */
+    public function write(array $record)
+    {
+        $this->connectIfNotConnected();
+        $this->writeToSocket((string) $record['formatted']);
+    }
+
+    /**
+     * We will not close a PersistentSocket instance so it can be reused in other requests.
+     */
+    public function close()
+    {
+        if (!$this->isPersistent()) {
+            $this->closeSocket();
+        }
+    }
+
+    /**
+     * Close socket, if open
+     */
+    public function closeSocket()
+    {
+        if (is_resource($this->resource)) {
+            fclose($this->resource);
+            $this->resource = null;
+        }
+    }
+
+    /**
+     * Set socket connection to nbe persistent. It only has effect before the connection is initiated.
+     *
+     * @param type $boolean
+     */
+    public function setPersistent($boolean)
+    {
+        $this->persistent = (boolean) $boolean;
+    }
+
+    /**
+     * Set connection timeout.  Only has effect before we connect.
+     *
+     * @param float $seconds
+     *
+     * @see http://php.net/manual/en/function.fsockopen.php
+     */
+    public function setConnectionTimeout($seconds)
+    {
+        $this->validateTimeout($seconds);
+        $this->connectionTimeout = (float) $seconds;
+    }
+
+    /**
+     * Set write timeout. Only has effect before we connect.
+     *
+     * @param float $seconds
+     *
+     * @see http://php.net/manual/en/function.stream-set-timeout.php
+     */
+    public function setTimeout($seconds)
+    {
+        $this->validateTimeout($seconds);
+        $this->timeout = (float) $seconds;
+    }
+
+    /**
+     * Get current connection string
+     *
+     * @return string
+     */
+    public function getConnectionString()
+    {
+        return $this->connectionString;
+    }
+
+    /**
+     * Get persistent setting
+     *
+     * @return boolean
+     */
+    public function isPersistent()
+    {
+        return $this->persistent;
+    }
+
+    /**
+     * Get current connection timeout setting
+     *
+     * @return float
+     */
+    public function getConnectionTimeout()
+    {
+        return $this->connectionTimeout;
+    }
+
+    /**
+     * Get current in-transfer timeout
+     *
+     * @return float
+     */
+    public function getTimeout()
+    {
+        return $this->timeout;
+    }
+
+    /**
+     * Check to see if the socket is currently available.
+     *
+     * UDP might appear to be connected but might fail when writing.  See http://php.net/fsockopen for details.
+     *
+     * @return boolean
+     */
+    public function isConnected()
+    {
+        return is_resource($this->resource)
+            && !feof($this->resource);  // on TCP - other party can close connection.
+    }
+
+    /**
+     * Wrapper to allow mocking
+     */
+    protected function pfsockopen()
+    {
+        return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);
+    }
+
+    /**
+     * Wrapper to allow mocking
+     */
+    protected function fsockopen()
+    {
+        return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);
+    }
+
+    /**
+     * Wrapper to allow mocking
+     *
+     * @see http://php.net/manual/en/function.stream-set-timeout.php
+     */
+    protected function streamSetTimeout()
+    {
+        $seconds = floor($this->timeout);
+        $microseconds = round(($this->timeout - $seconds)*1e6);
+        
+        return stream_set_timeout($this->resource, $seconds, $microseconds);
+    }
+
+    /**
+     * Wrapper to allow mocking
+     */
+    protected function fwrite($data)
+    {
+        return @fwrite($this->resource, $data);
+    }
+
+    /**
+     * Wrapper to allow mocking
+     */
+    protected function streamGetMetadata()
+    {
+        return stream_get_meta_data($this->resource);
+    }
+
+    private function validateTimeout($value)
+    {
+        $ok = filter_var($value, FILTER_VALIDATE_FLOAT);
+        if ($ok === false || $value < 0) {
+            throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)");
+        }
+    }
+
+    private function connectIfNotConnected()
+    {
+        if ($this->isConnected()) {
+            return;
+        }
+        $this->connect();
+    }
+
+    private function connect()
+    {
+        $this->createSocketResource();
+        $this->setSocketTimeout();
+    }
+
+    private function createSocketResource()
+    {
+        if ($this->isPersistent()) {
+            $resource = $this->pfsockopen();
+        } else {
+            $resource = $this->fsockopen();
+        }
+        if (!$resource) {
+            throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)");
+        }
+        $this->resource = $resource;
+    }
+
+    private function setSocketTimeout()
+    {
+        if (!$this->streamSetTimeout()) {
+            throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()");
+        }
+    }
+
+    private function writeToSocket($data)
+    {
+        $length = strlen($data);
+        $sent = 0;
+        while ($this->isConnected() && $sent < $length) {
+            if (0 == $sent) {
+                $chunk = $this->fwrite($data);
+            } else {
+                $chunk = $this->fwrite(substr($data, $sent));
+            }
+            if ($chunk === false) {
+                throw new \RuntimeException("Could not write to socket");
+            }
+            $sent += $chunk;
+            $socketInfo = $this->streamGetMetadata();
+            if ($socketInfo['timed_out']) {
+                throw new \RuntimeException("Write timed-out");
+            }
+        }
+        if (!$this->isConnected() && $sent < $length) {
+            throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)");
+        }
+    }
+
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
new file mode 100644
index 0000000..96ce7fc
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Stores to any stream resource
+ *
+ * Can be used to store into php://stderr, remote and local files, etc.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class StreamHandler extends AbstractProcessingHandler
+{
+    protected $stream;
+    protected $url;
+
+    /**
+     * @param string  $stream
+     * @param integer $level  The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct($stream, $level = Logger::DEBUG, $bubble = true)
+    {
+        parent::__construct($level, $bubble);
+        if (is_resource($stream)) {
+            $this->stream = $stream;
+        } else {
+            $this->url = $stream;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        if (is_resource($this->stream)) {
+            fclose($this->stream);
+        }
+        $this->stream = null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        if (null === $this->stream) {
+            if (!$this->url) {
+                throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().');
+            }
+            $errorMessage = null;
+            set_error_handler(function ($code, $msg) use (&$errorMessage) {
+                $errorMessage = preg_replace('{^fopen\(.*?\): }', '', $msg);
+            });
+            $this->stream = fopen($this->url, 'a');
+            restore_error_handler();
+            if (!is_resource($this->stream)) {
+                $this->stream = null;
+                throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$errorMessage, $this->url));
+            }
+        }
+        fwrite($this->stream, (string) $record['formatted']);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
new file mode 100644
index 0000000..56bf9a2
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * SwiftMailerHandler uses Swift_Mailer to send the emails
+ *
+ * @author Gyula Sallai
+ */
+class SwiftMailerHandler extends MailHandler
+{
+    protected $mailer;
+    protected $message;
+
+    /**
+     * @param \Swift_Mailer           $mailer  The mailer to use
+     * @param callback|\Swift_Message $message An example message for real messages, only the body will be replaced
+     * @param integer                 $level   The minimum logging level at which this handler will be triggered
+     * @param Boolean                 $bubble  Whether the messages that are handled can bubble up the stack or not
+     */
+    public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true)
+    {
+        parent::__construct($level, $bubble);
+        $this->mailer  = $mailer;
+        if (!$message instanceof \Swift_Message && is_callable($message)) {
+            $message = call_user_func($message);
+        }
+        if (!$message instanceof \Swift_Message) {
+            throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callback returning it');
+        }
+        $this->message = $message;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function send($content, array $records)
+    {
+        $message = clone $this->message;
+        $message->setBody($content);
+
+        $this->mailer->send($message);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
new file mode 100644
index 0000000..023b881
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\Formatter\LineFormatter;
+
+
+/**
+ * Logs to syslog service.
+ *
+ * usage example:
+ *
+ *   $log = new Logger('application');
+ *   $syslog = new SyslogHandler('myfacility', 'local6');
+ *   $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%");
+ *   $syslog->setFormatter($formatter);
+ *   $log->pushHandler($syslog);
+ *
+ * @author Sven Paulus <sven@karlsruhe.org>
+ */
+class SyslogHandler extends AbstractProcessingHandler
+{
+    /**
+     * Translates Monolog log levels to syslog log priorities.
+     */
+    private $logLevels = array(
+        Logger::DEBUG     => LOG_DEBUG,
+        Logger::INFO      => LOG_INFO,
+        Logger::NOTICE    => LOG_NOTICE,
+        Logger::WARNING   => LOG_WARNING,
+        Logger::ERROR     => LOG_ERR,
+        Logger::CRITICAL  => LOG_CRIT,
+        Logger::ALERT     => LOG_ALERT,
+        Logger::EMERGENCY => LOG_EMERG,
+    );
+
+    /**
+     * List of valid log facility names.
+     */
+    private $facilities = array(
+        'auth'     => LOG_AUTH,
+        'authpriv' => LOG_AUTHPRIV,
+        'cron'     => LOG_CRON,
+        'daemon'   => LOG_DAEMON,
+        'kern'     => LOG_KERN,
+        'lpr'      => LOG_LPR,
+        'mail'     => LOG_MAIL,
+        'news'     => LOG_NEWS,
+        'syslog'   => LOG_SYSLOG,
+        'user'     => LOG_USER,
+        'uucp'     => LOG_UUCP,
+    );
+
+    /**
+     * @param string  $ident
+     * @param mixed   $facility
+     * @param integer $level    The minimum logging level at which this handler will be triggered
+     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param int     $logopts  Option flags for the openlog() call, defaults to LOG_PID
+     */
+    public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID)
+    {
+        parent::__construct($level, $bubble);
+
+        if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
+            $this->facilities['local0'] = LOG_LOCAL0;
+            $this->facilities['local1'] = LOG_LOCAL1;
+            $this->facilities['local2'] = LOG_LOCAL2;
+            $this->facilities['local3'] = LOG_LOCAL3;
+            $this->facilities['local4'] = LOG_LOCAL4;
+            $this->facilities['local5'] = LOG_LOCAL5;
+            $this->facilities['local6'] = LOG_LOCAL6;
+            $this->facilities['local7'] = LOG_LOCAL7;
+        }
+
+        // convert textual description of facility to syslog constant
+        if (array_key_exists(strtolower($facility), $this->facilities)) {
+            $facility = $this->facilities[strtolower($facility)];
+        } elseif (!in_array($facility, array_values($this->facilities), true)) {
+            throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given');
+        }
+
+        if (!openlog($ident, $logopts, $facility)) {
+            throw new \LogicException('Can\'t open syslog for ident "'.$ident.'" and facility "'.$facility.'"');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        closelog();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        syslog($this->logLevels[$record['level']], (string) $record['formatted']);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDefaultFormatter()
+    {
+        return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%\n');
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/core/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
new file mode 100644
index 0000000..085d9e1
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
@@ -0,0 +1,140 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Used for testing purposes.
+ *
+ * It records all records and gives you access to them for verification.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class TestHandler extends AbstractProcessingHandler
+{
+    protected $records = array();
+    protected $recordsByLevel = array();
+
+    public function getRecords()
+    {
+        return $this->records;
+    }
+
+    public function hasEmergency($record)
+    {
+        return $this->hasRecord($record, Logger::EMERGENCY);
+    }
+
+    public function hasAlert($record)
+    {
+        return $this->hasRecord($record, Logger::ALERT);
+    }
+
+    public function hasCritical($record)
+    {
+        return $this->hasRecord($record, Logger::CRITICAL);
+    }
+
+    public function hasError($record)
+    {
+        return $this->hasRecord($record, Logger::ERROR);
+    }
+
+    public function hasWarning($record)
+    {
+        return $this->hasRecord($record, Logger::WARNING);
+    }
+
+    public function hasNotice($record)
+    {
+        return $this->hasRecord($record, Logger::NOTICE);
+    }
+
+    public function hasInfo($record)
+    {
+        return $this->hasRecord($record, Logger::INFO);
+    }
+
+    public function hasDebug($record)
+    {
+        return $this->hasRecord($record, Logger::DEBUG);
+    }
+
+    public function hasEmergencyRecords()
+    {
+        return isset($this->recordsByLevel[Logger::EMERGENCY]);
+    }
+
+    public function hasAlertRecords()
+    {
+        return isset($this->recordsByLevel[Logger::ALERT]);
+    }
+
+    public function hasCriticalRecords()
+    {
+        return isset($this->recordsByLevel[Logger::CRITICAL]);
+    }
+
+    public function hasErrorRecords()
+    {
+        return isset($this->recordsByLevel[Logger::ERROR]);
+    }
+
+    public function hasWarningRecords()
+    {
+        return isset($this->recordsByLevel[Logger::WARNING]);
+    }
+
+    public function hasNoticeRecords()
+    {
+        return isset($this->recordsByLevel[Logger::NOTICE]);
+    }
+
+    public function hasInfoRecords()
+    {
+        return isset($this->recordsByLevel[Logger::INFO]);
+    }
+
+    public function hasDebugRecords()
+    {
+        return isset($this->recordsByLevel[Logger::DEBUG]);
+    }
+
+    protected function hasRecord($record, $level)
+    {
+        if (!isset($this->recordsByLevel[$level])) {
+            return false;
+        }
+
+        if (is_array($record)) {
+            $record = $record['message'];
+        }
+
+        foreach ($this->recordsByLevel[$level] as $rec) {
+            if ($rec['message'] === $record) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        $this->recordsByLevel[$record['level']][] = $record;
+        $this->records[] = $record;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Logger.php b/core/vendor/monolog/monolog/src/Monolog/Logger.php
new file mode 100644
index 0000000..0ff2aa8
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Logger.php
@@ -0,0 +1,466 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+use Monolog\Handler\HandlerInterface;
+use Monolog\Handler\StreamHandler;
+
+/**
+ * Monolog log channel
+ *
+ * It contains a stack of Handlers and a stack of Processors,
+ * and uses them to store records that are added to it.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class Logger
+{
+    /**
+     * Detailed debug information
+     */
+    const DEBUG = 100;
+
+    /**
+     * Interesting events
+     *
+     * Examples: User logs in, SQL logs.
+     */
+    const INFO = 200;
+
+    /**
+     * Uncommon events
+     */
+    const NOTICE = 250;
+
+    /**
+     * Exceptional occurrences that are not errors
+     *
+     * Examples: Use of deprecated APIs, poor use of an API,
+     * undesirable things that are not necessarily wrong.
+     */
+    const WARNING = 300;
+
+    /**
+     * Runtime errors
+     */
+    const ERROR = 400;
+
+    /**
+     * Critical conditions
+     *
+     * Example: Application component unavailable, unexpected exception.
+     */
+    const CRITICAL = 500;
+
+    /**
+     * Action must be taken immediately
+     *
+     * Example: Entire website down, database unavailable, etc.
+     * This should trigger the SMS alerts and wake you up.
+     */
+    const ALERT = 550;
+
+    /**
+     * Urgent alert.
+     */
+    const EMERGENCY = 600;
+
+    protected static $levels = array(
+        100 => 'DEBUG',
+        200 => 'INFO',
+        250 => 'NOTICE',
+        300 => 'WARNING',
+        400 => 'ERROR',
+        500 => 'CRITICAL',
+        550 => 'ALERT',
+        600 => 'EMERGENCY',
+    );
+
+    /**
+     * @var DateTimeZone
+     */
+    protected static $timezone;
+
+    protected $name;
+
+    /**
+     * The handler stack
+     *
+     * @var array of Monolog\Handler\HandlerInterface
+     */
+    protected $handlers = array();
+
+    protected $processors = array();
+
+    /**
+     * @param string $name The logging channel
+     */
+    public function __construct($name)
+    {
+        $this->name = $name;
+
+        if (!self::$timezone) {
+            self::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC');
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Pushes a handler on to the stack.
+     *
+     * @param HandlerInterface $handler
+     */
+    public function pushHandler(HandlerInterface $handler)
+    {
+        array_unshift($this->handlers, $handler);
+    }
+
+    /**
+     * Pops a handler from the stack
+     *
+     * @return HandlerInterface
+     */
+    public function popHandler()
+    {
+        if (!$this->handlers) {
+            throw new \LogicException('You tried to pop from an empty handler stack.');
+        }
+
+        return array_shift($this->handlers);
+    }
+
+    /**
+     * Adds a processor on to the stack.
+     *
+     * @param callable $callback
+     */
+    public function pushProcessor($callback)
+    {
+        if (!is_callable($callback)) {
+            throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
+        }
+        array_unshift($this->processors, $callback);
+    }
+
+    /**
+     * Removes the processor on top of the stack and returns it.
+     *
+     * @return callable
+     */
+    public function popProcessor()
+    {
+        if (!$this->processors) {
+            throw new \LogicException('You tried to pop from an empty processor stack.');
+        }
+
+        return array_shift($this->processors);
+    }
+
+    /**
+     * Adds a log record.
+     *
+     * @param  integer $level   The logging level
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addRecord($level, $message, array $context = array())
+    {
+        if (!$this->handlers) {
+            $this->pushHandler(new StreamHandler('php://stderr', self::DEBUG));
+        }
+        $record = array(
+            'message' => (string) $message,
+            'context' => $context,
+            'level' => $level,
+            'level_name' => self::getLevelName($level),
+            'channel' => $this->name,
+            'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)))->setTimeZone(self::$timezone),
+            'extra' => array(),
+        );
+        // check if any message will handle this message
+        $handlerKey = null;
+        foreach ($this->handlers as $key => $handler) {
+            if ($handler->isHandling($record)) {
+                $handlerKey = $key;
+                break;
+            }
+        }
+        // none found
+        if (null === $handlerKey) {
+            return false;
+        }
+        // found at least one, process message and dispatch it
+        foreach ($this->processors as $processor) {
+            $record = call_user_func($processor, $record);
+        }
+        while (isset($this->handlers[$handlerKey]) &&
+            false === $this->handlers[$handlerKey]->handle($record)) {
+            $handlerKey++;
+        }
+
+        return true;
+    }
+
+    /**
+     * Adds a log record at the DEBUG level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addDebug($message, array $context = array())
+    {
+        return $this->addRecord(self::DEBUG, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the INFO level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addInfo($message, array $context = array())
+    {
+        return $this->addRecord(self::INFO, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the NOTICE level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addNotice($message, array $context = array())
+    {
+        return $this->addRecord(self::NOTICE, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the WARNING level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addWarning($message, array $context = array())
+    {
+        return $this->addRecord(self::WARNING, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the ERROR level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addError($message, array $context = array())
+    {
+        return $this->addRecord(self::ERROR, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the CRITICAL level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addCritical($message, array $context = array())
+    {
+        return $this->addRecord(self::CRITICAL, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the ALERT level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addAlert($message, array $context = array())
+    {
+        return $this->addRecord(self::ALERT, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the EMERGENCY level.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function addEmergency($message, array $context = array())
+    {
+      return $this->addRecord(self::EMERGENCY, $message, $context);
+    }
+
+    /**
+     * Gets the name of the logging level.
+     *
+     * @param  integer $level
+     * @return string
+     */
+    public static function getLevelName($level)
+    {
+        return self::$levels[$level];
+    }
+
+    /**
+     * Checks whether the Logger has a handler that listens on the given level
+     *
+     * @param  integer $level
+     * @return Boolean
+     */
+    public function isHandling($level)
+    {
+        $record = array(
+            'message' => '',
+            'context' => array(),
+            'level' => $level,
+            'level_name' => self::getLevelName($level),
+            'channel' => $this->name,
+            'datetime' => new \DateTime(),
+            'extra' => array(),
+        );
+
+        foreach ($this->handlers as $key => $handler) {
+            if ($handler->isHandling($record)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Adds a log record at the DEBUG level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function debug($message, array $context = array())
+    {
+        return $this->addRecord(self::DEBUG, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the INFO level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function info($message, array $context = array())
+    {
+        return $this->addRecord(self::INFO, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the INFO level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function notice($message, array $context = array())
+    {
+        return $this->addRecord(self::NOTICE, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the WARNING level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function warn($message, array $context = array())
+    {
+        return $this->addRecord(self::WARNING, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the ERROR level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function err($message, array $context = array())
+    {
+        return $this->addRecord(self::ERROR, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the CRITICAL level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function crit($message, array $context = array())
+    {
+        return $this->addRecord(self::CRITICAL, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the ALERT level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function alert($message, array $context = array())
+    {
+        return $this->addRecord(self::ALERT, $message, $context);
+    }
+
+    /**
+     * Adds a log record at the EMERGENCY level.
+     *
+     * This method allows for compatibility with common interfaces.
+     *
+     * @param  string  $message The log message
+     * @param  array   $context The log context
+     * @return Boolean Whether the record has been processed
+     */
+    public function emerg($message, array $context = array())
+    {
+        return $this->addRecord(self::EMERGENCY, $message, $context);
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/core/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
new file mode 100644
index 0000000..b126218
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+/**
+ * Injects line/file:class/function where the log message came from
+ *
+ * Warning: This only works if the handler processes the logs directly.
+ * If you put the processor on a handler that is behind a FingersCrossedHandler
+ * for example, the processor will only be called once the trigger level is reached,
+ * and all the log records will have the same file/line/.. data from the call that
+ * triggered the FingersCrossedHandler.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class IntrospectionProcessor
+{
+    /**
+     * @param  array $record
+     * @return array
+     */
+    public function __invoke(array $record)
+    {
+        $trace = debug_backtrace();
+
+        // skip first since it's always the current method
+        array_shift($trace);
+        // the call_user_func call is also skipped
+        array_shift($trace);
+
+        $i = 0;
+        while (isset($trace[$i]['class']) && false !== strpos($trace[$i]['class'], 'Monolog\\')) {
+            $i++;
+        }
+
+        // we should have the call source now
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'file'      => isset($trace[$i-1]['file']) ? $trace[$i-1]['file'] : null,
+                'line'      => isset($trace[$i-1]['line']) ? $trace[$i-1]['line'] : null,
+                'class'     => isset($trace[$i]['class']) ? $trace[$i]['class'] : null,
+                'function'  => isset($trace[$i]['function']) ? $trace[$i]['function'] : null,
+            )
+        );
+
+        return $record;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php
new file mode 100644
index 0000000..e48672b
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+/**
+ * Injects memory_get_peak_usage in all records
+ *
+ * @see Monolog\Processor\MemoryProcessor::__construct() for options
+ * @author Rob Jensen
+ */
+class MemoryPeakUsageProcessor extends MemoryProcessor
+{
+    /**
+     * @param  array $record
+     * @return array
+     */
+    public function __invoke(array $record)
+    {
+        $bytes = memory_get_peak_usage($this->realUsage);
+        $formatted = self::formatBytes($bytes);
+
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'memory_peak_usage' => $formatted,
+            )
+        );
+
+        return $record;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
new file mode 100644
index 0000000..7551043
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+/**
+ * Some methods that are common for all memory processors
+ *
+ * @author Rob Jensen
+ */
+abstract class MemoryProcessor
+{
+    protected $realUsage;
+
+    /**
+     * @param boolean $realUsage
+     */
+    public function __construct($realUsage = true)
+    {
+        $this->realUsage = (boolean) $realUsage;
+    }
+
+    /**
+     * Formats bytes into a human readable string
+     *
+     * @param  int    $bytes
+     * @return string
+     */
+    protected static function formatBytes($bytes)
+    {
+        $bytes = (int) $bytes;
+
+        if ($bytes > 1024*1024) {
+            return round($bytes/1024/1024, 2).' MB';
+        } elseif ($bytes > 1024) {
+            return round($bytes/1024, 2).' KB';
+        }
+
+        return $bytes . ' B';
+    }
+
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php
new file mode 100644
index 0000000..2c4a807
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+/**
+ * Injects memory_get_usage in all records
+ *
+ * @see Monolog\Processor\MemoryProcessor::__construct() for options
+ * @author Rob Jensen
+ */
+class MemoryUsageProcessor extends MemoryProcessor
+{
+    /**
+     * @param  array $record
+     * @return array
+     */
+    public function __invoke(array $record)
+    {
+        $bytes = memory_get_usage($this->realUsage);
+        $formatted = self::formatBytes($bytes);
+
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'memory_usage' => $formatted,
+            )
+        );
+
+        return $record;
+    }
+}
diff --git a/core/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/core/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
new file mode 100644
index 0000000..e297c23
--- /dev/null
+++ b/core/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+/**
+ * Injects url/method and remote IP of the current web request in all records
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class WebProcessor
+{
+    protected $serverData;
+
+    /**
+     * @param mixed $serverData array or object w/ ArrayAccess that provides access to the $_SERVER data
+     */
+    public function __construct($serverData = null)
+    {
+        if (null === $serverData) {
+            $this->serverData =& $_SERVER;
+        } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) {
+            $this->serverData = $serverData;
+        } else {
+            throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.');
+        }
+    }
+
+    /**
+     * @param  array $record
+     * @return array
+     */
+    public function __invoke(array $record)
+    {
+        // skip processing if for some reason request data
+        // is not present (CLI or wonky SAPIs)
+        if (!isset($this->serverData['REQUEST_URI'])) {
+            return $record;
+        }
+
+        if (!isset($this->serverData['HTTP_REFERER'])) {
+            $this->serverData['HTTP_REFERER'] = null;
+        }
+
+        $record['extra'] = array_merge(
+            $record['extra'],
+            array(
+                'url'         => $this->serverData['REQUEST_URI'],
+                'ip'          => $this->serverData['REMOTE_ADDR'],
+                'http_method' => $this->serverData['REQUEST_METHOD'],
+                'server'      => $this->serverData['SERVER_NAME'],
+                'referrer'    => $this->serverData['HTTP_REFERER'],
+            )
+        );
+
+        return $record;
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php b/core/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php
new file mode 100644
index 0000000..e7f7334
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php
@@ -0,0 +1,158 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+class ChromePHPFormatterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Monolog\Formatter\ChromePHPFormatter::format
+     */
+    public function testDefaultFormat()
+    {
+        $formatter = new ChromePHPFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array('from' => 'logger'),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array('ip' => '127.0.0.1'),
+            'message' => 'log',
+        );
+
+        $message = $formatter->format($record);
+
+        $this->assertEquals(
+            array(
+                'meh',
+                array(
+                    'message' => 'log',
+                    'context' => array('from' => 'logger'),
+                    'extra' => array('ip' => '127.0.0.1'),
+                ),
+                'unknown',
+                'error'
+            ),
+            $message
+        );
+    }
+
+    /**
+     * @covers Monolog\Formatter\ChromePHPFormatter::format
+     */
+    public function testFormatWithFileAndLine()
+    {
+        $formatter = new ChromePHPFormatter();
+        $record = array(
+            'level' => Logger::CRITICAL,
+            'level_name' => 'CRITICAL',
+            'channel' => 'meh',
+            'context' => array('from' => 'logger'),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14),
+            'message' => 'log',
+        );
+
+        $message = $formatter->format($record);
+
+        $this->assertEquals(
+            array(
+                'meh',
+                array(
+                    'message' => 'log',
+                    'context' => array('from' => 'logger'),
+                    'extra' => array('ip' => '127.0.0.1'),
+                ),
+                'test : 14',
+                'error'
+            ),
+            $message
+        );
+    }
+
+    /**
+     * @covers Monolog\Formatter\ChromePHPFormatter::format
+     */
+    public function testFormatWithoutContext()
+    {
+        $formatter = new ChromePHPFormatter();
+        $record = array(
+            'level' => Logger::DEBUG,
+            'level_name' => 'DEBUG',
+            'channel' => 'meh',
+            'context' => array(),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array(),
+            'message' => 'log',
+        );
+
+        $message = $formatter->format($record);
+
+        $this->assertEquals(
+            array(
+                'meh',
+                'log',
+                'unknown',
+                'log'
+            ),
+            $message
+        );
+    }
+
+    /**
+     * @covers Monolog\Formatter\ChromePHPFormatter::formatBatch
+     */
+    public function testBatchFormatThrowException()
+    {
+        $formatter = new ChromePHPFormatter();
+        $records = array(
+            array(
+                'level' => Logger::INFO,
+                'level_name' => 'INFO',
+                'channel' => 'meh',
+                'context' => array(),
+                'datetime' => new \DateTime("@0"),
+                'extra' => array(),
+                'message' => 'log',
+            ),
+            array(
+                'level' => Logger::WARNING,
+                'level_name' => 'WARNING',
+                'channel' => 'foo',
+                'context' => array(),
+                'datetime' => new \DateTime("@0"),
+                'extra' => array(),
+                'message' => 'log2',
+            ),
+        );
+
+        $this->assertEquals(
+            array(
+                array(
+                    'meh',
+                    'log',
+                    'unknown',
+                    'info'
+                ),
+                array(
+                    'foo',
+                    'log2',
+                    'unknown',
+                    'warn'
+                ),
+            ),
+            $formatter->formatBatch($records)
+        );
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php b/core/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php
new file mode 100644
index 0000000..f82113c
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php
@@ -0,0 +1,158 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+use Monolog\Formatter\GelfMessageFormatter;
+
+class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        if (!class_exists("Gelf\Message")) {
+            $this->markTestSkipped("mlehner/gelf-php not installed");
+        }
+    }
+
+    /**
+     * @covers Monolog\Formatter\GelfMessageFormatter::format
+     */
+    public function testDefaultFormatter()
+    {
+        $formatter = new GelfMessageFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array(),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array(),
+            'message' => 'log',
+        );
+
+        $message = $formatter->format($record);
+
+        $this->assertInstanceOf('Gelf\Message', $message);
+        $this->assertEquals(0, $message->getTimestamp());
+        $this->assertEquals('log', $message->getShortMessage());
+        $this->assertEquals('meh', $message->getFacility());
+        $this->assertEquals(null, $message->getLine());
+        $this->assertEquals(null, $message->getFile());
+        $this->assertEquals(LOG_ERR, $message->getLevel());
+        $this->assertNotEmpty($message->getHost());
+
+        $formatter = new GelfMessageFormatter('mysystem');
+
+        $message = $formatter->format($record);
+
+        $this->assertInstanceOf('Gelf\Message', $message);
+        $this->assertEquals('mysystem', $message->getHost());
+    }
+
+    /**
+     * @covers Monolog\Formatter\GelfMessageFormatter::format
+     */
+    public function testFormatWithFileAndLine()
+    {
+        $formatter = new GelfMessageFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array('from' => 'logger'),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array('file' => 'test', 'line' => 14),
+            'message' => 'log',
+        );
+
+        $message = $formatter->format($record);
+
+        $this->assertInstanceOf('Gelf\Message', $message);
+        $this->assertEquals('test', $message->getFile());
+        $this->assertEquals(14, $message->getLine());
+    }
+
+    /**
+     * @covers Monolog\Formatter\GelfMessageFormatter::format
+     */
+    public function testFormatWithContext()
+    {
+        $formatter = new GelfMessageFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array('from' => 'logger'),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array('key' => 'pair'),
+            'message' => 'log'
+        );
+
+        $message = $formatter->format($record);
+
+        $this->assertInstanceOf('Gelf\Message', $message);
+
+        $message_array = $message->toArray();
+
+        $this->assertArrayHasKey('_ctxt_from', $message_array);
+        $this->assertEquals('logger', $message_array['_ctxt_from']);
+
+        // Test with extraPrefix
+        $formatter = new GelfMessageFormatter(null, null, 'CTX');
+        $message = $formatter->format($record);
+
+        $this->assertInstanceOf('Gelf\Message', $message);
+
+        $message_array = $message->toArray();
+
+        $this->assertArrayHasKey('_CTXfrom', $message_array);
+        $this->assertEquals('logger', $message_array['_CTXfrom']);
+
+    }
+
+    /**
+     * @covers Monolog\Formatter\GelfMessageFormatter::format
+     */
+    public function testFormatWithExtra()
+    {
+        $formatter = new GelfMessageFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array('from' => 'logger'),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array('key' => 'pair'),
+            'message' => 'log'
+        );
+
+        $message = $formatter->format($record);
+
+        $this->assertInstanceOf('Gelf\Message', $message);
+
+        $message_array = $message->toArray();
+
+        $this->assertArrayHasKey('_key', $message_array);
+        $this->assertEquals('pair', $message_array['_key']);
+
+        // Test with extraPrefix
+        $formatter = new GelfMessageFormatter(null, 'EXT');
+        $message = $formatter->format($record);
+
+        $this->assertInstanceOf('Gelf\Message', $message);
+
+        $message_array = $message->toArray();
+
+        $this->assertArrayHasKey('_EXTkey', $message_array);
+        $this->assertEquals('pair', $message_array['_EXTkey']);
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php b/core/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php
new file mode 100644
index 0000000..ba6152c
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+use Monolog\TestCase;
+
+class JsonFormatterTest extends TestCase
+{
+    /**
+     * @covers Monolog\Formatter\JsonFormatter::format
+     */
+    public function testFormat()
+    {
+        $formatter = new JsonFormatter();
+        $record = $this->getRecord();
+        $this->assertEquals(json_encode($record), $formatter->format($record));
+    }
+
+    /**
+     * @covers Monolog\Formatter\JsonFormatter::formatBatch
+     */
+    public function testFormatBatch()
+    {
+        $formatter = new JsonFormatter();
+        $records = array(
+            $this->getRecord(Logger::WARNING),
+            $this->getRecord(Logger::DEBUG),
+        );
+        $this->assertEquals(json_encode($records), $formatter->formatBatch($records));
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php b/core/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php
new file mode 100644
index 0000000..9e80917
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php
@@ -0,0 +1,132 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * @covers Monolog\Formatter\LineFormatter
+ */
+class LineFormatterTest extends \PHPUnit_Framework_TestCase
+{
+    public function testDefFormatWithString()
+    {
+        $formatter = new LineFormatter(null, 'Y-m-d');
+        $message = $formatter->format(array(
+            'level_name' => 'WARNING',
+            'channel' => 'log',
+            'context' => array(),
+            'message' => 'foo',
+            'datetime' => new \DateTime,
+            'extra' => array(),
+        ));
+        $this->assertEquals('['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message);
+    }
+
+    public function testDefFormatWithArrayContext()
+    {
+        $formatter = new LineFormatter(null, 'Y-m-d');
+        $message = $formatter->format(array(
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'message' => 'foo',
+            'datetime' => new \DateTime,
+            'extra' => array(),
+            'context' => array(
+                'foo' => 'bar',
+                'baz' => 'qux',
+            )
+        ));
+        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foo {"foo":"bar","baz":"qux"} []'."\n", $message);
+    }
+
+    public function testDefFormatExtras()
+    {
+        $formatter = new LineFormatter(null, 'Y-m-d');
+        $message = $formatter->format(array(
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array(),
+            'datetime' => new \DateTime,
+            'extra' => array('ip' => '127.0.0.1'),
+            'message' => 'log',
+        ));
+        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] {"ip":"127.0.0.1"}'."\n", $message);
+    }
+
+    public function testFormatExtras()
+    {
+        $formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra.file% %extra%\n", 'Y-m-d');
+        $message = $formatter->format(array(
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array(),
+            'datetime' => new \DateTime,
+            'extra' => array('ip' => '127.0.0.1', 'file' => 'test'),
+            'message' => 'log',
+        ));
+        $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] test {"ip":"127.0.0.1"}'."\n", $message);
+    }
+
+    public function testDefFormatWithObject()
+    {
+        $formatter = new LineFormatter(null, 'Y-m-d');
+        $message = $formatter->format(array(
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array(),
+            'datetime' => new \DateTime,
+            'extra' => array('foo' => new TestFoo, 'bar' => new TestBar, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),
+            'message' => 'foobar',
+        ));
+        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
+            $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foobar [] {"foo":"[object] (Monolog\\\\Formatter\\\\TestFoo: {\\"foo\\":\\"foo\\"})","bar":"[object] (Monolog\\\\Formatter\\\\TestBar: {})","baz":[],"res":"[resource]"}'."\n", $message);
+        } else {
+            $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foobar [] {"foo":"[object] (Monolog\\Formatter\\TestFoo: {"foo":"foo"})","bar":"[object] (Monolog\\Formatter\\TestBar: {})","baz":[],"res":"[resource]"}'."\n", $message);
+        }
+    }
+
+    public function testBatchFormat()
+    {
+        $formatter = new LineFormatter(null, 'Y-m-d');
+        $message = $formatter->formatBatch(array(
+            array(
+                'level_name' => 'CRITICAL',
+                'channel' => 'test',
+                'message' => 'bar',
+                'context' => array(),
+                'datetime' => new \DateTime,
+                'extra' => array(),
+            ),
+            array(
+                'level_name' => 'WARNING',
+                'channel' => 'log',
+                'message' => 'foo',
+                'context' => array(),
+                'datetime' => new \DateTime,
+                'extra' => array(),
+            ),
+        ));
+        $this->assertEquals('['.date('Y-m-d').'] test.CRITICAL: bar [] []'."\n".'['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message);
+    }
+}
+
+class TestFoo
+{
+    public $foo = 'foo';
+}
+
+class TestBar
+{
+    public function __toString()
+    {
+        return 'bar';
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php b/core/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php
new file mode 100644
index 0000000..1e65e64
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * @covers Monolog\Formatter\NormalizerFormatter
+ */
+class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
+{
+    public function testFormat()
+    {
+        $formatter = new NormalizerFormatter('Y-m-d');
+        $formatted = $formatter->format(array(
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'message' => 'foo',
+            'datetime' => new \DateTime,
+            'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')),
+            'context' => array(
+                'foo' => 'bar',
+                'baz' => 'qux',
+            )
+        ));
+
+        $this->assertEquals(array(
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'message' => 'foo',
+            'datetime' => date('Y-m-d'),
+            'extra' => array(
+                'foo' => '[object] (Monolog\\Formatter\\TestFooNorm: {"foo":"foo"})',
+                'bar' => '[object] (Monolog\\Formatter\\TestBarNorm: {})',
+                'baz' => array(),
+                'res' => '[resource]',
+            ),
+            'context' => array(
+                'foo' => 'bar',
+                'baz' => 'qux',
+            )
+        ), $formatted);
+    }
+
+    public function testBatchFormat()
+    {
+        $formatter = new NormalizerFormatter('Y-m-d');
+        $formatted = $formatter->formatBatch(array(
+            array(
+                'level_name' => 'CRITICAL',
+                'channel' => 'test',
+                'message' => 'bar',
+                'context' => array(),
+                'datetime' => new \DateTime,
+                'extra' => array(),
+            ),
+            array(
+                'level_name' => 'WARNING',
+                'channel' => 'log',
+                'message' => 'foo',
+                'context' => array(),
+                'datetime' => new \DateTime,
+                'extra' => array(),
+            ),
+        ));
+        $this->assertEquals(array(
+            array(
+                'level_name' => 'CRITICAL',
+                'channel' => 'test',
+                'message' => 'bar',
+                'context' => array(),
+                'datetime' => date('Y-m-d'),
+                'extra' => array(),
+            ),
+            array(
+                'level_name' => 'WARNING',
+                'channel' => 'log',
+                'message' => 'foo',
+                'context' => array(),
+                'datetime' => date('Y-m-d'),
+                'extra' => array(),
+            ),
+        ), $formatted);
+    }
+}
+
+class TestFooNorm
+{
+    public $foo = 'foo';
+}
+
+class TestBarNorm
+{
+    public function __toString()
+    {
+        return 'bar';
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php b/core/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php
new file mode 100644
index 0000000..0b07e33
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php
@@ -0,0 +1,111 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+class WildfireFormatterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Monolog\Formatter\WildfireFormatter::format
+     */
+    public function testDefaultFormat()
+    {
+        $wildfire = new WildfireFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array('from' => 'logger'),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array('ip' => '127.0.0.1'),
+            'message' => 'log',
+        );
+
+        $message = $wildfire->format($record);
+
+        $this->assertEquals(
+            '125|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},'
+                .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|',
+            $message
+        );
+    }
+
+    /**
+     * @covers Monolog\Formatter\WildfireFormatter::format
+     */
+    public function testFormatWithFileAndLine()
+    {
+        $wildfire = new WildfireFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array('from' => 'logger'),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14),
+            'message' => 'log',
+        );
+
+        $message = $wildfire->format($record);
+
+        $this->assertEquals(
+            '129|[{"Type":"ERROR","File":"test","Line":14,"Label":"meh"},'
+                .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|',
+            $message
+        );
+    }
+
+    /**
+     * @covers Monolog\Formatter\WildfireFormatter::format
+     */
+    public function testFormatWithoutContext()
+    {
+        $wildfire = new WildfireFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array(),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array(),
+            'message' => 'log',
+        );
+
+        $message = $wildfire->format($record);
+
+        $this->assertEquals(
+            '58|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},"log"]|',
+            $message
+        );
+    }
+
+    /**
+     * @covers Monolog\Formatter\WildfireFormatter::formatBatch
+     * @expectedException BadMethodCallException
+     */
+    public function testBatchFormatThrowException()
+    {
+        $wildfire = new WildfireFormatter();
+        $record = array(
+            'level' => Logger::ERROR,
+            'level_name' => 'ERROR',
+            'channel' => 'meh',
+            'context' => array(),
+            'datetime' => new \DateTime("@0"),
+            'extra' => array(),
+            'message' => 'log',
+        );
+
+        $wildfire->formatBatch(array($record));
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Functional/Handler/FirePHPHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Functional/Handler/FirePHPHandlerTest.php
new file mode 100644
index 0000000..65b5309
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Functional/Handler/FirePHPHandlerTest.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+spl_autoload_register(function($class) {
+    $file = __DIR__.'/../../../../src/'.strtr($class, '\\', '/').'.php';
+    if (file_exists($file)) {
+        require $file;
+
+        return true;
+    }
+});
+
+use Monolog\Logger;
+use Monolog\Handler\FirePHPHandler;
+use Monolog\Handler\ChromePHPHandler;
+
+$logger = new Logger('firephp');
+$logger->pushHandler(new FirePHPHandler);
+$logger->pushHandler(new ChromePHPHandler());
+
+$logger->addDebug('Debug');
+$logger->addInfo('Info');
+$logger->addWarning('Warning');
+$logger->addError('Error');
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php
new file mode 100644
index 0000000..01d522f
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+use Monolog\Formatter\LineFormatter;
+use Monolog\Processor\WebProcessor;
+
+class AbstractHandlerTest extends TestCase
+{
+    /**
+     * @covers Monolog\Handler\AbstractHandler::__construct
+     * @covers Monolog\Handler\AbstractHandler::getLevel
+     * @covers Monolog\Handler\AbstractHandler::setLevel
+     * @covers Monolog\Handler\AbstractHandler::getBubble
+     * @covers Monolog\Handler\AbstractHandler::setBubble
+     * @covers Monolog\Handler\AbstractHandler::getFormatter
+     * @covers Monolog\Handler\AbstractHandler::setFormatter
+     */
+    public function testConstructAndGetSet()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false));
+        $this->assertEquals(Logger::WARNING, $handler->getLevel());
+        $this->assertEquals(false, $handler->getBubble());
+
+        $handler->setLevel(Logger::ERROR);
+        $handler->setBubble(true);
+        $handler->setFormatter($formatter = new LineFormatter);
+        $this->assertEquals(Logger::ERROR, $handler->getLevel());
+        $this->assertEquals(true, $handler->getBubble());
+        $this->assertSame($formatter, $handler->getFormatter());
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractHandler::handleBatch
+     */
+    public function testHandleBatch()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
+        $handler->expects($this->exactly(2))
+            ->method('handle');
+        $handler->handleBatch(array($this->getRecord(), $this->getRecord()));
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractHandler::isHandling
+     */
+    public function testIsHandling()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false));
+        $this->assertTrue($handler->isHandling($this->getRecord()));
+        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractHandler::getFormatter
+     * @covers Monolog\Handler\AbstractHandler::getDefaultFormatter
+     */
+    public function testGetFormatterInitializesDefault()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
+        $this->assertInstanceOf('Monolog\Formatter\LineFormatter', $handler->getFormatter());
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractHandler::pushProcessor
+     * @covers Monolog\Handler\AbstractHandler::popProcessor
+     * @expectedException LogicException
+     */
+    public function testPushPopProcessor()
+    {
+        $logger = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
+        $processor1 = new WebProcessor;
+        $processor2 = new WebProcessor;
+
+        $logger->pushProcessor($processor1);
+        $logger->pushProcessor($processor2);
+
+        $this->assertEquals($processor2, $logger->popProcessor());
+        $this->assertEquals($processor1, $logger->popProcessor());
+        $logger->popProcessor();
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractHandler::pushProcessor
+     * @expectedException InvalidArgumentException
+     */
+    public function testPushProcessorWithNonCallable()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler');
+
+        $handler->pushProcessor(new \stdClass());
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php
new file mode 100644
index 0000000..d36132f
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+use Monolog\Processor\WebProcessor;
+
+class AbstractProcessingHandlerTest extends TestCase
+{
+    /**
+     * @covers Monolog\Handler\AbstractProcessingHandler::handle
+     */
+    public function testHandleLowerLevelMessage()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, true));
+        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractProcessingHandler::handle
+     */
+    public function testHandleBubbling()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, true));
+        $this->assertFalse($handler->handle($this->getRecord()));
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractProcessingHandler::handle
+     */
+    public function testHandleNotBubbling()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, false));
+        $this->assertTrue($handler->handle($this->getRecord()));
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractProcessingHandler::handle
+     */
+    public function testHandleIsFalseWhenNotHandled()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, false));
+        $this->assertTrue($handler->handle($this->getRecord()));
+        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
+    }
+
+    /**
+     * @covers Monolog\Handler\AbstractProcessingHandler::processRecord
+     */
+    public function testProcessRecord()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler');
+        $handler->pushProcessor(new WebProcessor(array(
+            'REQUEST_URI' => '',
+            'REQUEST_METHOD' => '',
+            'REMOTE_ADDR' => '',
+            'SERVER_NAME' => '',
+        )));
+        $handledRecord = null;
+        $handler->expects($this->once())
+            ->method('write')
+            ->will($this->returnCallback(function($record) use (&$handledRecord){
+                $handledRecord = $record;
+            }))
+        ;
+        $handler->handle($this->getRecord());
+        $this->assertEquals(5, count($handledRecord['extra']));
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/AmqpExchangeMock.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/AmqpExchangeMock.php
new file mode 100644
index 0000000..3415c82
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/AmqpExchangeMock.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+class AmqpExchangeMock extends \AMQPExchange
+{
+    protected $messages = array();
+
+    public function __construct()
+    {
+    }
+
+    public function publish($message, $routing_key, $params = 0, $attributes = array())
+    {
+        $this->messages[] = array($message, $routing_key, $params, $attributes);
+
+        return true;
+    }
+
+    public function getMessages()
+    {
+        return $this->messages;
+    }
+
+    public function setName($name)
+    {
+        return true;
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php
new file mode 100644
index 0000000..7369091
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+/**
+ * @covers Monolog\Handler\RotatingFileHandler
+ */
+class AmqpHandlerTest extends TestCase
+{
+    public function setUp()
+    {
+        if (!class_exists('AMQPConnection') || !class_exists('AMQPExchange')) {
+            $this->markTestSkipped("amqp-php not installed");
+        }
+
+        if (!class_exists('AMQPChannel')) {
+            $this->markTestSkipped("Please update AMQP to version >= 1.0");
+        }
+    }
+
+    public function testHandle()
+    {
+        $exchange = $this->getExchange();
+
+        $handler = new AmqpHandler($exchange, 'log');
+
+        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
+
+        $expected = array(
+            array(
+                'message' => 'test',
+                'context' => array(
+                    'data' => array(),
+                    'foo' => 34,
+                ),
+                'level' => 300,
+                'level_name' => 'WARNING',
+                'channel' => 'test',
+                'extra' => array(),
+            ),
+            'warn.test',
+            0,
+            array(
+                'delivery_mode' => 2,
+                'Content-type' => 'application/json'
+            )
+        );
+
+        $handler->handle($record);
+
+        $messages = $exchange->getMessages();
+        $this->assertCount(1, $messages);
+        $messages[0][0] = json_decode($messages[0][0], true);
+        unset($messages[0][0]['datetime']);
+        $this->assertEquals($expected, $messages[0]);
+    }
+
+    protected function getExchange()
+    {
+        return new AmqpExchangeMock();
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php
new file mode 100644
index 0000000..5b3c4c8
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+class BufferHandlerTest extends TestCase
+{
+    /**
+     * @covers Monolog\Handler\BufferHandler::__construct
+     * @covers Monolog\Handler\BufferHandler::handle
+     * @covers Monolog\Handler\BufferHandler::close
+     */
+    public function testHandleBuffers()
+    {
+        $test = new TestHandler();
+        $handler = new BufferHandler($test);
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $this->assertFalse($test->hasDebugRecords());
+        $this->assertFalse($test->hasInfoRecords());
+        $handler->close();
+        $this->assertTrue($test->hasInfoRecords());
+        $this->assertTrue(count($test->getRecords()) === 2);
+    }
+
+    /**
+     * @covers Monolog\Handler\BufferHandler::close
+     */
+    public function testDestructPropagatesRecords()
+    {
+        $test = new TestHandler();
+        $handler = new BufferHandler($test);
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->__destruct();
+        $this->assertTrue($test->hasWarningRecords());
+        $this->assertTrue($test->hasDebugRecords());
+    }
+
+    /**
+     * @covers Monolog\Handler\BufferHandler::handle
+     */
+    public function testHandleBufferLimit()
+    {
+        $test = new TestHandler();
+        $handler = new BufferHandler($test, 2);
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $handler->close();
+        $this->assertTrue($test->hasWarningRecords());
+        $this->assertTrue($test->hasInfoRecords());
+        $this->assertFalse($test->hasDebugRecords());
+    }
+
+    /**
+     * @covers Monolog\Handler\BufferHandler::handle
+     */
+    public function testHandleLevel()
+    {
+        $test = new TestHandler();
+        $handler = new BufferHandler($test, 0, Logger::INFO);
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->close();
+        $this->assertTrue($test->hasWarningRecords());
+        $this->assertTrue($test->hasInfoRecords());
+        $this->assertFalse($test->hasDebugRecords());
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php
new file mode 100644
index 0000000..eb8e8b4
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+/**
+ * @covers Monolog\Handler\ChromePHPHandler
+ */
+class ChromePHPHandlerTest extends TestCase
+{
+    protected function setUp()
+    {
+        TestChromePHPHandler::reset();
+    }
+
+    public function testHeaders()
+    {
+        $handler = new TestChromePHPHandler();
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::WARNING));
+
+        $expected = array(
+            'X-ChromePhp-Data'   => base64_encode(utf8_encode(json_encode(array(
+                'version' => ChromePHPHandler::VERSION,
+                'columns' => array('label', 'log', 'backtrace', 'type'),
+                'rows' => array(
+                    'test',
+                    'test',
+                ),
+                'request_uri' => '',
+            ))))
+        );
+
+        $this->assertEquals($expected, $handler->getHeaders());
+    }
+
+    public function testConcurrentHandlers()
+    {
+        $handler = new TestChromePHPHandler();
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::WARNING));
+
+        $handler2 = new TestChromePHPHandler();
+        $handler2->setFormatter($this->getIdentityFormatter());
+        $handler2->handle($this->getRecord(Logger::DEBUG));
+        $handler2->handle($this->getRecord(Logger::WARNING));
+
+        $expected = array(
+            'X-ChromePhp-Data'   => base64_encode(utf8_encode(json_encode(array(
+                'version' => ChromePHPHandler::VERSION,
+                'columns' => array('label', 'log', 'backtrace', 'type'),
+                'rows' => array(
+                    'test',
+                    'test',
+                    'test',
+                    'test',
+                ),
+                'request_uri' => '',
+            ))))
+        );
+
+        $this->assertEquals($expected, $handler2->getHeaders());
+    }
+}
+
+class TestChromePHPHandler extends ChromePHPHandler
+{
+    protected $headers = array();
+
+    public static function reset()
+    {
+        self::$initialized = false;
+        self::$json['rows'] = array();
+    }
+
+    protected function sendHeader($header, $content)
+    {
+        $this->headers[$header] = $content;
+    }
+
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php
new file mode 100644
index 0000000..602324f
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
+
+class FingersCrossedHandlerTest extends TestCase
+{
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::__construct
+     * @covers Monolog\Handler\FingersCrossedHandler::handle
+     */
+    public function testHandleBuffers()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler($test);
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $this->assertFalse($test->hasDebugRecords());
+        $this->assertFalse($test->hasInfoRecords());
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $this->assertTrue($test->hasInfoRecords());
+        $this->assertTrue(count($test->getRecords()) === 3);
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::handle
+     */
+    public function testHandleStopsBufferingAfterTrigger()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler($test);
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $this->assertTrue($test->hasWarningRecords());
+        $this->assertTrue($test->hasDebugRecords());
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::handle
+     * @covers Monolog\Handler\FingersCrossedHandler::reset
+     */
+    public function testHandleRestartBufferingAfterReset()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler($test);
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->reset();
+        $handler->handle($this->getRecord(Logger::INFO));
+        $this->assertTrue($test->hasWarningRecords());
+        $this->assertTrue($test->hasDebugRecords());
+        $this->assertFalse($test->hasInfoRecords());
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::handle
+     */
+    public function testHandleRestartBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler($test, Logger::WARNING, 0, false, false);
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $this->assertTrue($test->hasWarningRecords());
+        $this->assertTrue($test->hasDebugRecords());
+        $this->assertFalse($test->hasInfoRecords());
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::handle
+     */
+    public function testHandleBufferLimit()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler($test, Logger::WARNING, 2);
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $this->assertTrue($test->hasWarningRecords());
+        $this->assertTrue($test->hasInfoRecords());
+        $this->assertFalse($test->hasDebugRecords());
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::handle
+     */
+    public function testHandleWithCallback()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler(function($record, $handler) use ($test) {
+                    return $test;
+                });
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $this->assertFalse($test->hasDebugRecords());
+        $this->assertFalse($test->hasInfoRecords());
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $this->assertTrue($test->hasInfoRecords());
+        $this->assertTrue(count($test->getRecords()) === 3);
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::handle
+     * @expectedException RuntimeException
+     */
+    public function testHandleWithBadCallbackThrowsException()
+    {
+        $handler = new FingersCrossedHandler(function($record, $handler) {
+                    return 'foo';
+                });
+        $handler->handle($this->getRecord(Logger::WARNING));
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::isHandling
+     */
+    public function testIsHandlingAlways()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler($test, Logger::ERROR);
+        $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG)));
+    }
+
+    /**
+     * @covers Monolog\Handler\FingersCrossedHandler::__construct
+     */
+    public function testActivationStrategy()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING));
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $this->assertFalse($test->hasDebugRecords());
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $this->assertTrue($test->hasDebugRecords());
+        $this->assertTrue($test->hasWarningRecords());
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php
new file mode 100644
index 0000000..2b7b76d
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+/**
+ * @covers Monolog\Handler\FirePHPHandler
+ */
+class FirePHPHandlerTest extends TestCase
+{
+    public function setUp()
+    {
+        TestFirePHPHandler::reset();
+    }
+
+    public function testHeaders()
+    {
+        $handler = new TestFirePHPHandler;
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::WARNING));
+
+        $expected = array(
+            'X-Wf-Protocol-1'    => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2',
+            'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1',
+            'X-Wf-1-Plugin-1'    => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3',
+            'X-Wf-1-1-1-1'       => 'test',
+            'X-Wf-1-1-1-2'       => 'test',
+        );
+
+        $this->assertEquals($expected, $handler->getHeaders());
+    }
+
+    public function testConcurrentHandlers()
+    {
+        $handler = new TestFirePHPHandler;
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::WARNING));
+
+        $handler2 = new TestFirePHPHandler;
+        $handler2->setFormatter($this->getIdentityFormatter());
+        $handler2->handle($this->getRecord(Logger::DEBUG));
+        $handler2->handle($this->getRecord(Logger::WARNING));
+
+        $expected = array(
+            'X-Wf-Protocol-1'    => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2',
+            'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1',
+            'X-Wf-1-Plugin-1'    => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3',
+            'X-Wf-1-1-1-1'       => 'test',
+            'X-Wf-1-1-1-2'       => 'test',
+        );
+
+        $expected2 = array(
+            'X-Wf-1-1-1-3'       => 'test',
+            'X-Wf-1-1-1-4'       => 'test',
+        );
+
+        $this->assertEquals($expected, $handler->getHeaders());
+        $this->assertEquals($expected2, $handler2->getHeaders());
+    }
+}
+
+class TestFirePHPHandler extends FirePHPHandler
+{
+    protected $headers = array();
+
+    public static function reset()
+    {
+        self::$initialized = false;
+        self::$messageIndex = 1;
+    }
+
+    protected function sendHeader($header, $content)
+    {
+        $this->headers[$header] = $content;
+    }
+
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep b/core/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php
new file mode 100644
index 0000000..c4fe5ad
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+use Monolog\Formatter\GelfMessageFormatter;
+
+class GelfHandlerTest extends TestCase
+{
+    public function setUp()
+    {
+        if (!class_exists("Gelf\MessagePublisher") || !class_exists("Gelf\Message")) {
+            $this->markTestSkipped("mlehner/gelf-php not installed");
+        }
+
+        require_once __DIR__ . '/GelfMocks.php';
+    }
+
+    /**
+     * @covers Monolog\Handler\GelfHandler::__construct
+     */
+    public function testConstruct()
+    {
+        $handler = new GelfHandler($this->getMessagePublisher());
+        $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler);
+    }
+
+    protected function getHandler($messagePublisher)
+    {
+        $handler = new GelfHandler($messagePublisher);
+
+        return $handler;
+    }
+
+    protected function getMessagePublisher()
+    {
+        return new MockMessagePublisher('localhost');
+    }
+
+    public function testDebug()
+    {
+        $messagePublisher = $this->getMessagePublisher();
+        $handler = $this->getHandler($messagePublisher);
+
+        $record = $this->getRecord(Logger::DEBUG, "A test debug message");
+        $handler->handle($record);
+
+        $this->assertEquals(LOG_DEBUG, $messagePublisher->lastMessage->getLevel());
+        $this->assertEquals('test', $messagePublisher->lastMessage->getFacility());
+        $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage());
+        $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage());
+    }
+
+    public function testWarning()
+    {
+        $messagePublisher = $this->getMessagePublisher();
+        $handler = $this->getHandler($messagePublisher);
+
+        $record = $this->getRecord(Logger::WARNING, "A test warning message");
+        $handler->handle($record);
+
+        $this->assertEquals(LOG_WARNING, $messagePublisher->lastMessage->getLevel());
+        $this->assertEquals('test', $messagePublisher->lastMessage->getFacility());
+        $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage());
+        $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage());
+    }
+
+    public function testInjectedGelfMessageFormatter()
+    {
+        $messagePublisher = $this->getMessagePublisher();
+        $handler = $this->getHandler($messagePublisher);
+
+        $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX'));
+
+        $record = $this->getRecord(Logger::WARNING, "A test warning message");
+        $record['extra']['blarg'] = 'yep';
+        $record['context']['from'] = 'logger';
+        $handler->handle($record);
+
+        $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost());
+        $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray());
+        $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray());
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/GelfMocks.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/GelfMocks.php
new file mode 100644
index 0000000..18515f9
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/GelfMocks.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Gelf\MessagePublisher;
+use Gelf\Message;
+
+class MockMessagePublisher extends MessagePublisher
+{
+    public function publish(Message $message)
+    {
+        $this->lastMessage = $message;
+    }
+
+    public $lastMessage = null;
+}
+
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php
new file mode 100644
index 0000000..44d77a5
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+class GroupHandlerTest extends TestCase
+{
+    /**
+     * @covers Monolog\Handler\GroupHandler::__construct
+     * @expectedException InvalidArgumentException
+     */
+    public function testConstructorOnlyTakesHandler()
+    {
+        new GroupHandler(array(new TestHandler(), "foo"));
+    }
+
+    /**
+     * @covers Monolog\Handler\GroupHandler::__construct
+     * @covers Monolog\Handler\GroupHandler::handle
+     */
+    public function testHandle()
+    {
+        $testHandlers = array(new TestHandler(), new TestHandler());
+        $handler = new GroupHandler($testHandlers);
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        foreach ($testHandlers as $test) {
+            $this->assertTrue($test->hasDebugRecords());
+            $this->assertTrue($test->hasInfoRecords());
+            $this->assertTrue(count($test->getRecords()) === 2);
+        }
+    }
+
+    /**
+     * @covers Monolog\Handler\GroupHandler::handleBatch
+     */
+    public function testHandleBatch()
+    {
+        $testHandlers = array(new TestHandler(), new TestHandler());
+        $handler = new GroupHandler($testHandlers);
+        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));
+        foreach ($testHandlers as $test) {
+            $this->assertTrue($test->hasDebugRecords());
+            $this->assertTrue($test->hasInfoRecords());
+            $this->assertTrue(count($test->getRecords()) === 2);
+        }
+    }
+
+    /**
+     * @covers Monolog\Handler\GroupHandler::isHandling
+     */
+    public function testIsHandling()
+    {
+        $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING));
+        $handler = new GroupHandler($testHandlers);
+        $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR)));
+        $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING)));
+        $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php
new file mode 100644
index 0000000..6754f3d
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\TestCase;
+
+class MailHandlerTest extends TestCase
+{
+    /**
+     * @covers Monolog\Handler\MailHandler::handleBatch
+     */
+    public function testHandleBatch()
+    {
+        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
+        $formatter->expects($this->once())
+            ->method('formatBatch'); // Each record is formatted
+
+        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
+        $handler->expects($this->once())
+            ->method('send');
+        $handler->expects($this->never())
+            ->method('write'); // write is for individual records
+
+        $handler->setFormatter($formatter);
+
+        $handler->handleBatch($this->getMultipleRecords());
+    }
+
+    /**
+     * @covers Monolog\Handler\MailHandler::handleBatch
+     */
+    public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel()
+    {
+        $records = array(
+            $this->getRecord(Logger::DEBUG, 'debug message 1'),
+            $this->getRecord(Logger::DEBUG, 'debug message 2'),
+            $this->getRecord(Logger::INFO, 'information'),
+        );
+
+        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
+        $handler->expects($this->never())
+            ->method('send');
+        $handler->setLevel(Logger::ERROR);
+
+        $handler->handleBatch($records);
+    }
+
+    /**
+     * @covers Monolog\Handler\MailHandler::write
+     */
+    public function testHandle()
+    {
+        $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
+
+        $record = $this->getRecord();
+        $records = array($record);
+        $records[0]['formatted'] = '['.$record['datetime']->format('Y-m-d H:i:s').'] test.WARNING: test [] []'."\n";
+
+        $handler->expects($this->once())
+            ->method('send')
+            ->with($records[0]['formatted'], $records);
+
+        $handler->handle($record);
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php
new file mode 100644
index 0000000..687dd53
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+class MongoDBHandlerTest extends TestCase
+{
+    public function testHandle()
+    {
+        $mongo = $this->getMock('Mongo', array('selectCollection'));
+        $collection = $this->getMock('stdClass', array('save'));
+
+        $mongo->expects($this->once())
+            ->method('selectCollection')
+            ->with('DB', 'Collection')
+            ->will($this->returnValue($collection));
+
+        $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34));
+
+        $expected = array(
+            'message' => 'test',
+            'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34),
+            'level' => Logger::WARNING,
+            'level_name' => 'WARNING',
+            'channel' => 'test',
+            'datetime' => $record['datetime']->format('Y-m-d H:i:s'),
+            'extra' => array(),
+        );
+
+        $collection->expects($this->once())
+            ->method('save')
+            ->with($expected);
+
+        $handler = new MongoDBHandler($mongo, 'DB', 'Collection');
+        $handler->handle($record);
+    }
+}
+
+if (!class_exists('Mongo')) {
+    class Mongo
+    {
+        public function selectCollection() {}
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php
new file mode 100644
index 0000000..292df78
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+/**
+ * @covers Monolog\Handler\NullHandler::handle
+ */
+class NullHandlerTest extends TestCase
+{
+    public function testHandle()
+    {
+        $handler = new NullHandler();
+        $this->assertTrue($handler->handle($this->getRecord()));
+    }
+
+    public function testHandleLowerLevelRecord()
+    {
+        $handler = new NullHandler(Logger::WARNING);
+        $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php
new file mode 100644
index 0000000..f4cefda
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+
+/**
+ * @covers Monolog\Handler\RotatingFileHandler
+ */
+class RotatingFileHandlerTest extends TestCase
+{
+    public function setUp()
+    {
+        $dir = __DIR__.'/Fixtures';
+        chmod($dir, 0777);
+        if (!is_writable($dir)) {
+            $this->markTestSkipped($dir.' must be writeable to test the RotatingFileHandler.');
+        }
+    }
+
+    public function testRotationCreatesNewFile()
+    {
+        touch(__DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot');
+
+        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord());
+
+        $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
+        $this->assertTrue(file_exists($log));
+        $this->assertEquals('test', file_get_contents($log));
+    }
+
+    /**
+     * @dataProvider rotationTests
+     */
+    public function testRotation($createFile)
+    {
+        touch($old1 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot');
+        touch($old2 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400 * 2).'.rot');
+        touch($old3 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400 * 3).'.rot');
+        touch($old4 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400 * 4).'.rot');
+
+        $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
+
+        if ($createFile) {
+            touch($log);
+        }
+
+        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord());
+
+        $handler->close();
+
+        $this->assertTrue(file_exists($log));
+        $this->assertTrue(file_exists($old1));
+        $this->assertEquals($createFile, file_exists($old2));
+        $this->assertEquals($createFile, file_exists($old3));
+        $this->assertEquals($createFile, file_exists($old4));
+        $this->assertEquals('test', file_get_contents($log));
+    }
+
+    public function rotationTests()
+    {
+        return array(
+            'Rotation is triggered when the file of the current day is not present'
+                => array(true),
+            'Rotation is not triggered when the file is already present'
+                => array(false),
+        );
+    }
+
+    public function testReuseCurrentFile()
+    {
+        $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
+        file_put_contents($log, "foo");
+        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot');
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord());
+        $this->assertEquals('footest', file_get_contents($log));
+    }
+
+    public function tearDown()
+    {
+        foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) {
+            unlink($file);
+        }
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php
new file mode 100644
index 0000000..c642bea
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php
@@ -0,0 +1,283 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+/**
+ * @author Pablo de Leon Belloc <pablolb@gmail.com>
+ */
+class SocketHandlerTest extends TestCase
+{
+    /**
+     * @var Monolog\Handler\SocketHandler
+     */
+    private $handler;
+
+    /**
+     * @var resource
+     */
+    private $res;
+
+    /**
+     * @expectedException UnexpectedValueException
+     */
+    public function testInvalidHostname()
+    {
+        $this->createHandler('garbage://here');
+        $this->writeRecord('data');
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testBadConnectionTimeout()
+    {
+        $this->createHandler('localhost:1234');
+        $this->handler->setConnectionTimeout(-1);
+    }
+
+    public function testSetConnectionTimeout()
+    {
+        $this->createHandler('localhost:1234');
+        $this->handler->setConnectionTimeout(10.1);
+        $this->assertEquals(10.1, $this->handler->getConnectionTimeout());
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testBadTimeout()
+    {
+        $this->createHandler('localhost:1234');
+        $this->handler->setTimeout(-1);
+    }
+
+    public function testSetTimeout()
+    {
+        $this->createHandler('localhost:1234');
+        $this->handler->setTimeout(10.25);
+        $this->assertEquals(10.25, $this->handler->getTimeout());
+    }
+
+    public function testSetConnectionString()
+    {
+        $this->createHandler('tcp://localhost:9090');
+        $this->assertEquals('tcp://localhost:9090', $this->handler->getConnectionString());
+    }
+
+    /**
+     * @expectedException UnexpectedValueException
+     */
+    public function testExceptionIsThrownOnFsockopenError()
+    {
+        $this->setMockHandler(array('fsockopen'));
+        $this->handler->expects($this->once())
+            ->method('fsockopen')
+            ->will($this->returnValue(false));
+        $this->writeRecord('Hello world');
+    }
+
+    /**
+     * @expectedException UnexpectedValueException
+     */
+    public function testExceptionIsThrownOnPfsockopenError()
+    {
+        $this->setMockHandler(array('pfsockopen'));
+        $this->handler->expects($this->once())
+            ->method('pfsockopen')
+            ->will($this->returnValue(false));
+        $this->handler->setPersistent(true);
+        $this->writeRecord('Hello world');
+    }
+
+    /**
+     * @expectedException UnexpectedValueException
+     */
+    public function testExceptionIsThrownIfCannotSetTimeout()
+    {
+        $this->setMockHandler(array('streamSetTimeout'));
+        $this->handler->expects($this->once())
+            ->method('streamSetTimeout')
+            ->will($this->returnValue(false));
+        $this->writeRecord('Hello world');
+    }
+
+    /**
+     * @expectedException RuntimeException
+     */
+    public function testWriteFailsOnIfFwriteReturnsFalse()
+    {
+        $this->setMockHandler(array('fwrite'));
+
+        $callback = function($arg) {
+            $map = array(
+                'Hello world' => 6,
+                'world' => false,
+            );
+
+            return $map[$arg];
+        };
+
+        $this->handler->expects($this->exactly(2))
+            ->method('fwrite')
+            ->will($this->returnCallback($callback));
+
+        $this->writeRecord('Hello world');
+    }
+
+    /**
+     * @expectedException RuntimeException
+     */
+    public function testWriteFailsIfStreamTimesOut()
+    {
+        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));
+
+        $callback = function($arg) {
+            $map = array(
+                'Hello world' => 6,
+                'world' => 5,
+            );
+
+            return $map[$arg];
+        };
+
+        $this->handler->expects($this->exactly(1))
+            ->method('fwrite')
+            ->will($this->returnCallback($callback));
+        $this->handler->expects($this->exactly(1))
+            ->method('streamGetMetadata')
+            ->will($this->returnValue(array('timed_out' => true)));
+
+        $this->writeRecord('Hello world');
+    }
+
+    /**
+     * @expectedException RuntimeException
+     */
+    public function testWriteFailsOnIncompleteWrite()
+    {
+        $this->setMockHandler(array('fwrite', 'streamGetMetadata'));
+
+        $res = $this->res;
+        $callback = function($string) use ($res) {
+            fclose($res);
+
+            return strlen('Hello');
+        };
+
+        $this->handler->expects($this->exactly(1))
+            ->method('fwrite')
+            ->will($this->returnCallback($callback));
+        $this->handler->expects($this->exactly(1))
+            ->method('streamGetMetadata')
+            ->will($this->returnValue(array('timed_out' => false)));
+
+        $this->writeRecord('Hello world');
+    }
+
+    public function testWriteWithMemoryFile()
+    {
+        $this->setMockHandler();
+        $this->writeRecord('test1');
+        $this->writeRecord('test2');
+        $this->writeRecord('test3');
+        fseek($this->res, 0);
+        $this->assertEquals('test1test2test3', fread($this->res, 1024));
+    }
+
+    public function testWriteWithMock()
+    {
+        $this->setMockHandler(array('fwrite'));
+
+        $callback = function($arg) {
+            $map = array(
+                'Hello world' => 6,
+                'world' => 5,
+            );
+
+            return $map[$arg];
+        };
+
+        $this->handler->expects($this->exactly(2))
+            ->method('fwrite')
+            ->will($this->returnCallback($callback));
+
+        $this->writeRecord('Hello world');
+    }
+
+    public function testClose()
+    {
+        $this->setMockHandler();
+        $this->writeRecord('Hello world');
+        $this->assertInternalType('resource', $this->res);
+        $this->handler->close();
+        $this->assertFalse(is_resource($this->res), "Expected resource to be closed after closing handler");
+    }
+
+    public function testCloseDoesNotClosePersistentSocket()
+    {
+        $this->setMockHandler();
+        $this->handler->setPersistent(true);
+        $this->writeRecord('Hello world');
+        $this->assertTrue(is_resource($this->res));
+        $this->handler->close();
+        $this->assertTrue(is_resource($this->res));
+    }
+
+    private function createHandler($connectionString)
+    {
+        $this->handler = new SocketHandler($connectionString);
+        $this->handler->setFormatter($this->getIdentityFormatter());
+    }
+
+    private function writeRecord($string)
+    {
+        $this->handler->handle($this->getRecord(Logger::WARNING, $string));
+    }
+
+    private function setMockHandler(array $methods = array())
+    {
+        $this->res = fopen('php://memory', 'a');
+
+        $defaultMethods = array('fsockopen', 'pfsockopen', 'streamSetTimeout');
+        $newMethods = array_diff($methods, $defaultMethods);
+
+        $finalMethods = array_merge($defaultMethods, $newMethods);
+
+        $this->handler = $this->getMock(
+            '\Monolog\Handler\SocketHandler', $finalMethods, array('localhost:1234')
+        );
+
+        if (!in_array('fsockopen', $methods)) {
+            $this->handler->expects($this->any())
+                ->method('fsockopen')
+                ->will($this->returnValue($this->res));
+        }
+
+        if (!in_array('pfsockopen', $methods)) {
+            $this->handler->expects($this->any())
+                ->method('pfsockopen')
+                ->will($this->returnValue($this->res));
+        }
+
+        if (!in_array('streamSetTimeout', $methods)) {
+            $this->handler->expects($this->any())
+                ->method('streamSetTimeout')
+                ->will($this->returnValue(true));
+        }
+
+        $this->handler->setFormatter($this->getIdentityFormatter());
+    }
+
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php
new file mode 100644
index 0000000..63d4fef
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+class StreamHandlerTest extends TestCase
+{
+    /**
+     * @covers Monolog\Handler\StreamHandler::__construct
+     * @covers Monolog\Handler\StreamHandler::write
+     */
+    public function testWrite()
+    {
+        $handle = fopen('php://memory', 'a+');
+        $handler = new StreamHandler($handle);
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->handle($this->getRecord(Logger::WARNING, 'test'));
+        $handler->handle($this->getRecord(Logger::WARNING, 'test2'));
+        $handler->handle($this->getRecord(Logger::WARNING, 'test3'));
+        fseek($handle, 0);
+        $this->assertEquals('testtest2test3', fread($handle, 100));
+    }
+
+    /**
+     * @covers Monolog\Handler\StreamHandler::close
+     */
+    public function testClose()
+    {
+        $handle = fopen('php://memory', 'a+');
+        $handler = new StreamHandler($handle);
+        $this->assertTrue(is_resource($handle));
+        $handler->close();
+        $this->assertFalse(is_resource($handle));
+    }
+
+    /**
+     * @covers Monolog\Handler\StreamHandler::write
+     */
+    public function testWriteCreatesTheStreamResource()
+    {
+        $handler = new StreamHandler('php://memory');
+        $handler->handle($this->getRecord());
+    }
+
+    /**
+     * @expectedException LogicException
+     * @covers Monolog\Handler\StreamHandler::__construct
+     * @covers Monolog\Handler\StreamHandler::write
+     */
+    public function testWriteMissingResource()
+    {
+        $handler = new StreamHandler(null);
+        $handler->handle($this->getRecord());
+    }
+
+    /**
+     * @expectedException UnexpectedValueException
+     * @covers Monolog\Handler\StreamHandler::__construct
+     * @covers Monolog\Handler\StreamHandler::write
+     */
+    public function testWriteInvalidResource()
+    {
+        $handler = new StreamHandler('bogus://url');
+        $handler->handle($this->getRecord());
+    }
+
+    /**
+     * @expectedException UnexpectedValueException
+     * @covers Monolog\Handler\StreamHandler::__construct
+     * @covers Monolog\Handler\StreamHandler::write
+     */
+    public function testWriteNonExistingResource()
+    {
+        $handler = new StreamHandler('/foo/bar/baz/'.rand(0, 10000));
+        $handler->handle($this->getRecord());
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php
new file mode 100644
index 0000000..98219ac
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+use Monolog\Logger;
+
+class SyslogHandlerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Monolog\Handler\SyslogHandler::__construct
+     */
+    public function testConstruct()
+    {
+        $handler = new SyslogHandler('test');
+        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
+
+        $handler = new SyslogHandler('test', LOG_USER);
+        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
+
+        $handler = new SyslogHandler('test', 'user');
+        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
+
+        $handler = new SyslogHandler('test', LOG_USER, Logger::DEBUG, true, LOG_PERROR);
+        $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler);
+    }
+
+    /**
+     * @covers Monolog\Handler\SyslogHandler::__construct
+     */
+    public function testConstructInvalidFacility()
+    {
+        $this->setExpectedException('UnexpectedValueException');
+        $handler = new SyslogHandler('test', 'unknown');
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php b/core/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php
new file mode 100644
index 0000000..801d80a
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\TestCase;
+use Monolog\Logger;
+
+/**
+ * @covers Monolog\Handler\TestHandler
+ */
+class TestHandlerTest extends TestCase
+{
+    /**
+     * @dataProvider methodProvider
+     */
+    public function testHandler($method, $level)
+    {
+        $handler = new TestHandler;
+        $record = $this->getRecord($level, 'test'.$method);
+        $this->assertFalse($handler->{'has'.$method}($record));
+        $this->assertFalse($handler->{'has'.$method.'Records'}());
+        $handler->handle($record);
+
+        $this->assertFalse($handler->{'has'.$method}('bar'));
+        $this->assertTrue($handler->{'has'.$method}($record));
+        $this->assertTrue($handler->{'has'.$method}('test'.$method));
+        $this->assertTrue($handler->{'has'.$method.'Records'}());
+
+        $records = $handler->getRecords();
+        unset($records[0]['formatted']);
+        $this->assertEquals(array($record), $records);
+    }
+
+    public function methodProvider()
+    {
+        return array(
+            array('Emergency', Logger::EMERGENCY),
+            array('Alert'    , Logger::ALERT),
+            array('Critical' , Logger::CRITICAL),
+            array('Error'    , Logger::ERROR),
+            array('Warning'  , Logger::WARNING),
+            array('Info'     , Logger::INFO),
+            array('Notice'   , Logger::NOTICE),
+            array('Debug'    , Logger::DEBUG),
+        );
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/LoggerTest.php b/core/vendor/monolog/monolog/tests/Monolog/LoggerTest.php
new file mode 100644
index 0000000..ece04bd
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/LoggerTest.php
@@ -0,0 +1,372 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+use Monolog\Processor\WebProcessor;
+use Monolog\Handler\TestHandler;
+
+class LoggerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Monolog\Logger::getName
+     */
+    public function testGetName()
+    {
+        $logger = new Logger('foo');
+        $this->assertEquals('foo', $logger->getName());
+    }
+
+    /**
+     * @covers Monolog\Logger::__construct
+     */
+    public function testChannel()
+    {
+        $logger = new Logger('foo');
+        $handler = new TestHandler;
+        $logger->pushHandler($handler);
+        $logger->addWarning('test');
+        list($record) = $handler->getRecords();
+        $this->assertEquals('foo', $record['channel']);
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testLog()
+    {
+        $logger = new Logger(__METHOD__);
+
+        $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'));
+        $handler->expects($this->once())
+            ->method('handle');
+        $logger->pushHandler($handler);
+
+        $this->assertTrue($logger->addWarning('test'));
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testLogNotHandled()
+    {
+        $logger = new Logger(__METHOD__);
+
+        $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR));
+        $handler->expects($this->never())
+            ->method('handle');
+        $logger->pushHandler($handler);
+
+        $this->assertFalse($logger->addWarning('test'));
+    }
+
+    /**
+     * @covers Monolog\Logger::pushHandler
+     * @covers Monolog\Logger::popHandler
+     * @expectedException LogicException
+     */
+    public function testPushPopHandler()
+    {
+        $logger = new Logger(__METHOD__);
+        $handler1 = new TestHandler;
+        $handler2 = new TestHandler;
+
+        $logger->pushHandler($handler1);
+        $logger->pushHandler($handler2);
+
+        $this->assertEquals($handler2, $logger->popHandler());
+        $this->assertEquals($handler1, $logger->popHandler());
+        $logger->popHandler();
+    }
+
+    /**
+     * @covers Monolog\Logger::pushProcessor
+     * @covers Monolog\Logger::popProcessor
+     * @expectedException LogicException
+     */
+    public function testPushPopProcessor()
+    {
+        $logger = new Logger(__METHOD__);
+        $processor1 = new WebProcessor;
+        $processor2 = new WebProcessor;
+
+        $logger->pushProcessor($processor1);
+        $logger->pushProcessor($processor2);
+
+        $this->assertEquals($processor2, $logger->popProcessor());
+        $this->assertEquals($processor1, $logger->popProcessor());
+        $logger->popProcessor();
+    }
+
+    /**
+     * @covers Monolog\Logger::pushProcessor
+     * @expectedException InvalidArgumentException
+     */
+    public function testPushProcessorWithNonCallable()
+    {
+        $logger = new Logger(__METHOD__);
+
+        $logger->pushProcessor(new \stdClass());
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testProcessorsAreExecuted()
+    {
+        $logger = new Logger(__METHOD__);
+        $handler = new TestHandler;
+        $logger->pushHandler($handler);
+        $logger->pushProcessor(function($record) {
+            $record['extra']['win'] = true;
+
+            return $record;
+        });
+        $logger->addError('test');
+        list($record) = $handler->getRecords();
+        $this->assertTrue($record['extra']['win']);
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testProcessorsAreCalledOnlyOnce()
+    {
+        $logger = new Logger(__METHOD__);
+        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler->expects($this->any())
+            ->method('handle')
+            ->will($this->returnValue(true))
+        ;
+        $logger->pushHandler($handler);
+
+        $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor')
+            ->disableOriginalConstructor()
+            ->setMethods(array('__invoke'))
+            ->getMock()
+        ;
+        $processor->expects($this->once())
+            ->method('__invoke')
+            ->will($this->returnArgument(0))
+        ;
+        $logger->pushProcessor($processor);
+
+        $logger->addError('test');
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testProcessorsNotCalledWhenNotHandled()
+    {
+        $logger = new Logger(__METHOD__);
+        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler->expects($this->once())
+            ->method('isHandling')
+            ->will($this->returnValue(false))
+        ;
+        $logger->pushHandler($handler);
+        $that = $this;
+        $logger->pushProcessor(function($record) use ($that){
+            $that->fail('The processor should not be called');
+        });
+        $logger->addAlert('test');
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testHandlersNotCalledBeforeFirstHandling()
+    {
+        $logger = new Logger(__METHOD__);
+
+        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler1->expects($this->never())
+            ->method('isHandling')
+            ->will($this->returnValue(false))
+        ;
+        $handler1->expects($this->once())
+            ->method('handle')
+            ->will($this->returnValue(false))
+        ;
+        $logger->pushHandler($handler1);
+
+        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler2->expects($this->once())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler2->expects($this->once())
+            ->method('handle')
+            ->will($this->returnValue(false))
+        ;
+        $logger->pushHandler($handler2);
+
+        $handler3 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler3->expects($this->once())
+            ->method('isHandling')
+            ->will($this->returnValue(false))
+        ;
+        $handler3->expects($this->never())
+            ->method('handle')
+        ;
+        $logger->pushHandler($handler3);
+
+        $logger->debug('test');
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testBubblingWhenTheHandlerReturnsFalse()
+    {
+        $logger = new Logger(__METHOD__);
+
+        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler1->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler1->expects($this->once())
+            ->method('handle')
+            ->will($this->returnValue(false))
+        ;
+        $logger->pushHandler($handler1);
+
+        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler2->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler2->expects($this->once())
+            ->method('handle')
+            ->will($this->returnValue(false))
+        ;
+        $logger->pushHandler($handler2);
+
+        $logger->debug('test');
+    }
+
+    /**
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testNotBubblingWhenTheHandlerReturnsTrue()
+    {
+        $logger = new Logger(__METHOD__);
+
+        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler1->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler1->expects($this->never())
+            ->method('handle')
+        ;
+        $logger->pushHandler($handler1);
+
+        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler2->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler2->expects($this->once())
+            ->method('handle')
+            ->will($this->returnValue(true))
+        ;
+        $logger->pushHandler($handler2);
+
+        $logger->debug('test');
+    }
+
+    /**
+     * @covers Monolog\Logger::isHandling
+     */
+    public function testIsHandling()
+    {
+        $logger = new Logger(__METHOD__);
+
+        $handler1 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler1->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(false))
+        ;
+
+        $logger->pushHandler($handler1);
+        $this->assertFalse($logger->isHandling(Logger::DEBUG));
+
+        $handler2 = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler2->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+
+        $logger->pushHandler($handler2);
+        $this->assertTrue($logger->isHandling(Logger::DEBUG));
+    }
+
+    /**
+     * @dataProvider logMethodProvider
+     * @covers Monolog\Logger::addDebug
+     * @covers Monolog\Logger::addInfo
+     * @covers Monolog\Logger::addNotice
+     * @covers Monolog\Logger::addWarning
+     * @covers Monolog\Logger::addError
+     * @covers Monolog\Logger::addCritical
+     * @covers Monolog\Logger::addAlert
+     * @covers Monolog\Logger::addEmergency
+     * @covers Monolog\Logger::debug
+     * @covers Monolog\Logger::info
+     * @covers Monolog\Logger::notice
+     * @covers Monolog\Logger::warn
+     * @covers Monolog\Logger::err
+     * @covers Monolog\Logger::crit
+     * @covers Monolog\Logger::alert
+     * @covers Monolog\Logger::emerg
+     */
+    public function testLogMethods($method, $expectedLevel)
+    {
+        $logger = new Logger('foo');
+        $handler = new TestHandler;
+        $logger->pushHandler($handler);
+        $logger->{$method}('test');
+        list($record) = $handler->getRecords();
+        $this->assertEquals($expectedLevel, $record['level']);
+    }
+
+    public function logMethodProvider()
+    {
+        return array(
+            // monolog methods
+            array('addDebug',     Logger::DEBUG),
+            array('addInfo',      Logger::INFO),
+            array('addNotice',    Logger::NOTICE),
+            array('addWarning',   Logger::WARNING),
+            array('addError',     Logger::ERROR),
+            array('addCritical',  Logger::CRITICAL),
+            array('addAlert',     Logger::ALERT),
+            array('addEmergency', Logger::EMERGENCY),
+
+            // ZF/Sf2 compat methods
+            array('debug',  Logger::DEBUG),
+            array('info',   Logger::INFO),
+            array('notice', Logger::NOTICE),
+            array('warn',   Logger::WARNING),
+            array('err',    Logger::ERROR),
+            array('crit',   Logger::CRITICAL),
+            array('alert',  Logger::ALERT),
+            array('emerg',  Logger::EMERGENCY),
+        );
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php b/core/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php
new file mode 100644
index 0000000..9adbe17
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+use Monolog\TestCase;
+use Monolog\Handler\TestHandler;
+
+class IntrospectionProcessorTest extends TestCase
+{
+    public function getHandler()
+    {
+        $processor = new IntrospectionProcessor();
+        $handler = new TestHandler();
+        $handler->pushProcessor($processor);
+
+        return $handler;
+    }
+
+    public function testProcessorFromClass()
+    {
+        $handler = $this->getHandler();
+        $tester = new \Acme\Tester;
+        $tester->test($handler, $this->getRecord());
+        list($record) = $handler->getRecords();
+        $this->assertEquals(__FILE__, $record['extra']['file']);
+        $this->assertEquals(58, $record['extra']['line']);
+        $this->assertEquals('Acme\Tester', $record['extra']['class']);
+        $this->assertEquals('test', $record['extra']['function']);
+    }
+
+    public function testProcessorFromFunc()
+    {
+        $handler = $this->getHandler();
+        \Acme\tester($handler, $this->getRecord());
+        list($record) = $handler->getRecords();
+        $this->assertEquals(__FILE__, $record['extra']['file']);
+        $this->assertEquals(64, $record['extra']['line']);
+        $this->assertEquals(null, $record['extra']['class']);
+        $this->assertEquals('Acme\tester', $record['extra']['function']);
+    }
+}
+
+namespace Acme;
+
+class Tester
+{
+    public function test($handler, $record)
+    {
+        $handler->handle($record);
+    }
+}
+
+function tester($handler, $record)
+{
+    $handler->handle($record);
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php b/core/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php
new file mode 100644
index 0000000..4bdf22c
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+use Monolog\TestCase;
+
+class MemoryPeakUsageProcessorTest extends TestCase
+{
+    /**
+     * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke
+     * @covers Monolog\Processor\MemoryProcessor::formatBytes
+     */
+    public function testProcessor()
+    {
+        $processor = new MemoryPeakUsageProcessor();
+        $record = $processor($this->getRecord());
+        $this->assertArrayHasKey('memory_peak_usage', $record['extra']);
+        $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_peak_usage']);
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php b/core/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php
new file mode 100644
index 0000000..a30d6de
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+use Monolog\TestCase;
+
+class MemoryUsageProcessorTest extends TestCase
+{
+    /**
+     * @covers Monolog\Processor\MemoryUsageProcessor::__invoke
+     * @covers Monolog\Processor\MemoryProcessor::formatBytes
+     */
+    public function testProcessor()
+    {
+        $processor = new MemoryUsageProcessor();
+        $record = $processor($this->getRecord());
+        $this->assertArrayHasKey('memory_usage', $record['extra']);
+        $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_usage']);
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php b/core/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php
new file mode 100644
index 0000000..04a5422
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+use Monolog\TestCase;
+
+class WebProcessorTest extends TestCase
+{
+    public function testProcessor()
+    {
+        $server = array(
+            'REQUEST_URI'    => 'A',
+            'REMOTE_ADDR'    => 'B',
+            'REQUEST_METHOD' => 'C',
+            'HTTP_REFERER'   => 'D',
+            'SERVER_NAME'    => 'F',
+        );
+
+        $processor = new WebProcessor($server);
+        $record = $processor($this->getRecord());
+        $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']);
+        $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']);
+        $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']);
+        $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']);
+        $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']);
+    }
+
+    public function testProcessorDoNothingIfNoRequestUri()
+    {
+        $server = array(
+            'REMOTE_ADDR'    => 'B',
+            'REQUEST_METHOD' => 'C',
+        );
+        $processor = new WebProcessor($server);
+        $record = $processor($this->getRecord());
+        $this->assertEmpty($record['extra']);
+    }
+
+    public function testProcessorReturnNullIfNoHttpReferer()
+    {
+        $server = array(
+            'REQUEST_URI'    => 'A',
+            'REMOTE_ADDR'    => 'B',
+            'REQUEST_METHOD' => 'C',
+            'SERVER_NAME'    => 'F',
+        );
+        $processor = new WebProcessor($server);
+        $record = $processor($this->getRecord());
+        $this->assertNull($record['extra']['referrer']);
+    }
+
+    /**
+     * @expectedException UnexpectedValueException
+     */
+    public function testInvalidData()
+    {
+        new WebProcessor(new \stdClass);
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/Monolog/TestCase.php b/core/vendor/monolog/monolog/tests/Monolog/TestCase.php
new file mode 100644
index 0000000..1067b91
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/Monolog/TestCase.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+class TestCase extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @return array Record
+     */
+    protected function getRecord($level = Logger::WARNING, $message = 'test', $context = array())
+    {
+        return array(
+            'message' => $message,
+            'context' => $context,
+            'level' => $level,
+            'level_name' => Logger::getLevelName($level),
+            'channel' => 'test',
+            'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))),
+            'extra' => array(),
+        );
+    }
+
+    /**
+     * @return array
+     */
+    protected function getMultipleRecords()
+    {
+        return array(
+            $this->getRecord(Logger::DEBUG, 'debug message 1'),
+            $this->getRecord(Logger::DEBUG, 'debug message 2'),
+            $this->getRecord(Logger::INFO, 'information'),
+            $this->getRecord(Logger::WARNING, 'warning'),
+            $this->getRecord(Logger::ERROR, 'error')
+        );
+    }
+
+    /**
+     * @return Monolog\Formatter\FormatterInterface
+     */
+    protected function getIdentityFormatter()
+    {
+        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
+        $formatter->expects($this->any())
+            ->method('format')
+            ->will($this->returnCallback(function($record) { return $record['message']; }));
+
+        return $formatter;
+    }
+}
diff --git a/core/vendor/monolog/monolog/tests/bootstrap.php b/core/vendor/monolog/monolog/tests/bootstrap.php
new file mode 100644
index 0000000..189f4a6
--- /dev/null
+++ b/core/vendor/monolog/monolog/tests/bootstrap.php
@@ -0,0 +1,13 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+$loader = require_once __DIR__ . "/../vendor/autoload.php";
+$loader->add('Monolog\\', __DIR__);
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/CHANGELOG.md b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/CHANGELOG.md
new file mode 100644
index 0000000..88ecedd
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/CHANGELOG.md
@@ -0,0 +1,7 @@
+CHANGELOG
+=========
+
+2.1.0
+-----
+
+ * added ChromePhpHandler
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php
new file mode 100644
index 0000000..81766d7
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Monolog\Handler;
+
+use Monolog\Handler\ChromePHPHandler as BaseChromePhpHandler;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * ChromePhpHandler.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class ChromePhpHandler extends BaseChromePhpHandler
+{
+    /**
+     * @var array
+     */
+    private $headers = array();
+
+    /**
+     * @var Response
+     */
+    private $response;
+
+    /**
+     * Adds the headers to the response once it's created
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
+            return;
+        }
+
+        if (!preg_match('{\bChrome/\d+[\.\d+]*\b}', $event->getRequest()->headers->get('User-Agent'))) {
+
+            $this->sendHeaders = false;
+            $this->headers = array();
+
+            return;
+        }
+
+        $this->response = $event->getResponse();
+        foreach ($this->headers as $header => $content) {
+            $this->response->headers->set($header, $content);
+        }
+        $this->headers = array();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function sendHeader($header, $content)
+    {
+        if (!$this->sendHeaders) {
+            return;
+        }
+
+        if ($this->response) {
+            $this->response->headers->set($header, $content);
+        } else {
+            $this->headers[$header] = $content;
+        }
+    }
+
+    /**
+     * Override default behavior since we check it in onKernelResponse
+     */
+    protected function headersAccepted()
+    {
+        return true;
+    }
+}
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/DebugHandler.php b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/DebugHandler.php
new file mode 100644
index 0000000..96b7fdd
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/DebugHandler.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\Handler\TestHandler;
+use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+
+/**
+ * DebugLogger.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class DebugHandler extends TestHandler implements DebugLoggerInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getLogs()
+    {
+        $records = array();
+        foreach ($this->records as $record) {
+            $records[] = array(
+                'timestamp'    => $record['datetime']->getTimestamp(),
+                'message'      => $record['message'],
+                'priority'     => $record['level'],
+                'priorityName' => $record['level_name'],
+                'context'      => $record['context'],
+            );
+        }
+
+        return $records;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function countErrors()
+    {
+        $cnt = 0;
+        $levels = array(Logger::ERROR, Logger::CRITICAL, Logger::ALERT);
+        if (defined('Monolog\Logger::EMERGENCY')) {
+            $levels[] = Logger::EMERGENCY;
+        }
+        foreach ($levels as $level) {
+            if (isset($this->recordsByLevel[$level])) {
+                $cnt += count($this->recordsByLevel[$level]);
+            }
+        }
+
+        return $cnt;
+    }
+}
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php
new file mode 100644
index 0000000..f36cd9f
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Monolog\Handler;
+
+use Monolog\Handler\FirePHPHandler as BaseFirePHPHandler;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * FirePHPHandler.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class FirePHPHandler extends BaseFirePHPHandler
+{
+    /**
+     * @var array
+     */
+    private $headers = array();
+
+    /**
+     * @var Response
+     */
+    private $response;
+
+    /**
+     * Adds the headers to the response once it's created
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
+            return;
+        }
+
+        if (!preg_match('{\bFirePHP/\d+\.\d+\b}', $event->getRequest()->headers->get('User-Agent'))
+            && !$event->getRequest()->headers->has('X-FirePHP-Version')) {
+
+            $this->sendHeaders = false;
+            $this->headers = array();
+
+            return;
+        }
+
+        $this->response = $event->getResponse();
+        foreach ($this->headers as $header => $content) {
+            $this->response->headers->set($header, $content);
+        }
+        $this->headers = array();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function sendHeader($header, $content)
+    {
+        if (!$this->sendHeaders) {
+            return;
+        }
+
+        if ($this->response) {
+            $this->response->headers->set($header, $content);
+        } else {
+            $this->headers[$header] = $content;
+        }
+    }
+
+    /**
+     * Override default behavior since we check the user agent in onKernelResponse
+     */
+    protected function headersAccepted()
+    {
+        return true;
+    }
+}
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/LICENSE b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/LICENSE
new file mode 100644
index 0000000..cdffe7a
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2012 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Logger.php b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Logger.php
new file mode 100644
index 0000000..f818381
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Logger.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Monolog;
+
+use Monolog\Logger as BaseLogger;
+use Symfony\Component\HttpKernel\Log\LoggerInterface;
+use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+
+/**
+ * Logger.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Logger extends BaseLogger implements LoggerInterface, DebugLoggerInterface
+{
+    /**
+     * @see Symfony\Component\HttpKernel\Log\DebugLoggerInterface
+     */
+    public function getLogs()
+    {
+        if ($logger = $this->getDebugLogger()) {
+            return $logger->getLogs();
+        }
+    }
+
+    /**
+     * @see Symfony\Component\HttpKernel\Log\DebugLoggerInterface
+     */
+    public function countErrors()
+    {
+        if ($logger = $this->getDebugLogger()) {
+            return $logger->countErrors();
+        }
+    }
+
+    /**
+     * Returns a DebugLoggerInterface instance if one is registered with this logger.
+     *
+     * @return DebugLoggerInterface A DebugLoggerInterface instance or null if none is registered
+     */
+    private function getDebugLogger()
+    {
+        foreach ($this->handlers as $handler) {
+            if ($handler instanceof DebugLoggerInterface) {
+                return $handler;
+            }
+        }
+    }
+}
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Processor/WebProcessor.php b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Processor/WebProcessor.php
new file mode 100644
index 0000000..aac05d2
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Processor/WebProcessor.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Monolog\Processor;
+
+use Monolog\Processor\WebProcessor as BaseWebProcessor;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * WebProcessor override to read from the HttpFoundation's Request
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class WebProcessor extends BaseWebProcessor
+{
+    public function __construct()
+    {
+        // Pass an empty array as the default null value would access $_SERVER
+        parent::__construct(array());
+    }
+
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
+            $this->serverData = $event->getRequest()->server->all();
+        }
+    }
+}
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/README.md b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/README.md
new file mode 100644
index 0000000..111f673
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/README.md
@@ -0,0 +1,18 @@
+Monolog Bridge
+==============
+
+Provides integration for Monolog with various Symfony2 components.
+
+Resources
+---------
+
+You can run the unit tests with the following command:
+
+    phpunit -c src/Symfony/Bridge/Monolog/
+
+If you also want to run the unit tests that depend on other Symfony
+Components, declare the following environment variables before running
+PHPUnit:
+
+    export MONOLOG=../path/to/Monolog
+    export SYMFONY_HTTP_FOUNDATION=../path/to/HttpFoundation
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php
new file mode 100644
index 0000000..caf764a
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Monolog\Tests\Processor;
+
+use Monolog\Logger;
+use Symfony\Bridge\Monolog\Processor\WebProcessor;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+class WebProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    protected function setUp()
+    {
+        if (!class_exists('Monolog\\Logger')) {
+            $this->markTestSkipped('Monolog is not available.');
+        }
+    }
+
+    public function testUsesRequestServerData()
+    {
+        $server = array(
+            'REQUEST_URI'    => 'A',
+            'REMOTE_ADDR'    => 'B',
+            'REQUEST_METHOD' => 'C',
+            'SERVER_NAME'    => 'D',
+            'HTTP_REFERER'   => 'E'
+        );
+
+        $request = new Request();
+        $request->server->replace($server);
+
+        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $event->expects($this->any())
+            ->method('getRequestType')
+            ->will($this->returnValue(HttpKernelInterface::MASTER_REQUEST));
+        $event->expects($this->any())
+            ->method('getRequest')
+            ->will($this->returnValue($request));
+
+        $processor = new WebProcessor();
+        $processor->onKernelRequest($event);
+        $record = $processor($this->getRecord());
+
+        $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']);
+        $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']);
+        $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']);
+        $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']);
+        $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']);
+    }
+
+    /**
+     * @return array Record
+     */
+    protected function getRecord($level = Logger::WARNING, $message = 'test')
+    {
+        return array(
+            'message' => $message,
+            'context' => array(),
+            'level' => $level,
+            'level_name' => Logger::getLevelName($level),
+            'channel' => 'test',
+            'datetime' => new \DateTime(),
+            'extra' => array(),
+        );
+    }
+}
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/bootstrap.php b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/bootstrap.php
new file mode 100644
index 0000000..571a8ef
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/Tests/bootstrap.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+spl_autoload_register(function ($class) {
+    foreach (array(
+        'SYMFONY_HTTP_FOUNDATION' => 'HttpFoundation',
+    ) as $env => $name) {
+        if (isset($_SERVER[$env]) && 0 === strpos(ltrim($class, '/'), 'Symfony\Component\\'.$name)) {
+            if (file_exists($file = $_SERVER[$env].'/'.substr(str_replace('\\', '/', $class), strlen('Symfony\Component\\'.$name)).'.php')) {
+                require_once $file;
+            }
+        }
+    }
+
+    if (isset($_SERVER['MONOLOG']) && 0 === strpos(ltrim($class, '/'), 'Monolog')) {
+        if (file_exists($file = $_SERVER['MONOLOG'].'/src/'.str_replace('\\', '/', $class).'.php')) {
+            require_once $file;
+        }
+    }
+
+    if (0 === strpos(ltrim($class, '/'), 'Symfony\Bridge\Monolog')) {
+        if (file_exists($file = __DIR__.'/../'.substr(str_replace('\\', '/', $class), strlen('Symfony\Bridge\Monolog')).'.php')) {
+            require_once $file;
+        }
+    }
+});
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/composer.json b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/composer.json
new file mode 100644
index 0000000..558b990
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "symfony/monolog-bridge",
+    "type": "symfony-bridge",
+    "description": "Symfony Monolog Bridge",
+    "keywords": [],
+    "homepage": "http://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "http://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3",
+        "symfony/http-kernel": "2.1.*",
+        "monolog/monolog": "1.*"
+    },
+    "autoload": {
+        "psr-0": { "Symfony\\Bridge\\Monolog": "" }
+    },
+    "target-dir": "Symfony/Bridge/Monolog",
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.1-dev"
+        }
+    }
+}
diff --git a/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/phpunit.xml.dist b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/phpunit.xml.dist
new file mode 100644
index 0000000..f26e3fa
--- /dev/null
+++ b/core/vendor/symfony/monolog-bridge/Symfony/Bridge/Monolog/phpunit.xml.dist
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="false"
+         bootstrap="tests/bootstrap.php"
+>
+    <testsuites>
+        <testsuite name="Symfony Monolog Bridge Test Suite">
+            <directory>./Tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./</directory>
+            <exclude>
+                <directory>./Resources</directory>
+                <directory>./Tests</directory>
+            </exclude>
+        </whitelist>
+    </filter>
+</phpunit>
