diff --git a/README.md b/README.md
index f0b6612..d046808 100644
--- a/README.md
+++ b/README.md
@@ -11,8 +11,10 @@ Drush provides its own console logger. Error Log module is therefore not active
 in the Drush environment, unless the `error_log` configuration directive has
 been set.
 
-In the future we may add features such as log format configuration, etc.
-However, if you need more features, you are encouraged to try
+Log levels, ignored types and log format can be configured at the logging and
+errors settings page (admin/config/development/logging).
+
+If you need more advanced features, you are encouraged to try
 [Monolog](https://www.drupal.org/project/monolog).
 
 Please file bug reports and feature requests at the [Error Log project
diff --git a/error_log.admin.inc b/error_log.admin.inc
index c4f6b88..fbf42c0 100644
--- a/error_log.admin.inc
+++ b/error_log.admin.inc
@@ -29,10 +29,44 @@ function error_log_settings_form(array &$form, array &$form_state) {
     '#default_value' => variable_get('error_log_levels', error_log_default_levels()),
     '#options' => $watchdog_levels,
   );
-  $form['error_log']['error_log_ignored_types'] = [
+  $form['error_log']['error_log_ignored_types'] = array(
     '#type' => 'textarea',
     '#title' => t('Ignored types'),
     '#description' => t('A list of log event types for which messages should not be sent to the PHP error log (one type per line). Commonly-configured types include <em>access denied</em> for 403 errors and <em>page not found</em> for 404 errors.'),
     '#default_value' => variable_get('error_log_ignored_types', ''),
-  ];
+  );
+  $form['error_log']['error_log_format'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Log format'),
+    '#default_value' => variable_get('error_log_format', '[!level] [!type] [!ip] [uid:!uid] [!request_uri] [!referer] !message'),
+    '#description' => t('Specify the format of the log entry. Available variables are: !variables', array('!variables' => error_log_format_variables())),
+    '#maxlength' => 280,
+  );
+}
+
+/**
+ * Renders a description of log format variables.
+ *
+ * @return string
+ *   The description HTML.
+ */
+function error_log_format_variables() {
+  $variables = array(
+    '!base_url' => t('Base URL of the site.'),
+    '!ip' => t('IP address of the user triggering the message.'),
+    '!level' => t('The severity level of the event as an untranslated string; ranges from emergency to debug.'),
+    '!link' => t('A link to associate with the message.'),
+    '!message' => t('The message to store in the log.'),
+    '!referer' => t('HTTP Referer if available.'),
+    '!request_uri' => t('The requested URI.'),
+    '!severity' => t('The severity level of the event as an integer; ranges from 0 (Emergency) to 7 (Debug).'),
+    '!timestamp' => t('Unix timestamp of the log entry.'),
+    '!type' => t('The category to which this message belongs.'),
+    '!uid' => t('User ID.'),
+  );
+  $output = '<dl>';
+  foreach ($variables as $variable => $description) {
+    $output .= "<dt><code>$variable</code></dt><dd>$description</dd>";
+  }
+  return $output . '</dl>';
 }
diff --git a/error_log.info b/error_log.info
index b52d501..ea59fa8 100644
--- a/error_log.info
+++ b/error_log.info
@@ -2,3 +2,4 @@ name = Error Log
 description = Sends watchdog log entries to the PHP error log.
 core = 7.x
 files[] = error_log.test
+configure = admin/config/development/logging
diff --git a/error_log.install b/error_log.install
index 8e067f0..9add0f8 100644
--- a/error_log.install
+++ b/error_log.install
@@ -11,4 +11,5 @@
 function error_log_uninstall() {
   variable_del('error_log_levels');
   variable_del('error_log_ignored_types');
+  variable_del('error_log_format');
 }
diff --git a/error_log.module b/error_log.module
index bf94aa1..8b7bb3d 100644
--- a/error_log.module
+++ b/error_log.module
@@ -29,6 +29,7 @@ function error_log_help($path, $arg) {
  * Implements hook_watchdog().
  */
 function error_log_watchdog(array $log) {
+  global $base_url;
   $levels = variable_get('error_log_levels', error_log_default_levels());
   if (empty($levels["level_{$log['severity']}"])) {
     return;
@@ -45,10 +46,20 @@ function error_log_watchdog(array $log) {
     $log['variables'] = array();
   }
   $severity_list = error_log_severity_levels();
-  $message = "[{$severity_list[$log['severity']]}] [{$log['type']}] [{$log['ip']}] [uid:{$log['uid']}] [{$log['request_uri']}] [{$log['referer']}] ";
-  // Cleanup excessive whitespace and HTML-encoded quotes.
-  $message .= str_replace(array('    ', "\n"), '', html_entity_decode(strip_tags(strtr($log['message'], $log['variables'])), ENT_QUOTES, 'UTF-8'));
-  return error_log($message);
+  return error_log(strtr(variable_get('error_log_format', '[!level] [!type] [!ip] [uid:!uid] [!request_uri] [!referer] !message'), array(
+    '!base_url' => $base_url,
+    '!ip' => $log['ip'],
+    '!level' => $severity_list[$log['severity']],
+    '!link' => $log['link'],
+    // Cleanup excessive whitespace and HTML-encoded quotes.
+    '!message' => str_replace(array('    ', "\n"), '', html_entity_decode(strip_tags(strtr((string) $log['message'], $log['variables'])), ENT_QUOTES, 'UTF-8')),
+    '!request_uri' => $log['request_uri'],
+    '!referer' => $log['referer'],
+    '!severity' => $log['severity'],
+    '!timestamp' => $log['timestamp'],
+    '!type' => $log['type'],
+    '!uid' => $log['uid'],
+  )));
 }
 
 /**
