diff --git a/README.md b/README.md
index b2e685e..d9a5afe 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,10 @@ before Drupal bootstrapped.
 
 Error Log module can be configured at the logging and errors configuration page
 (admin/config/development/logging).  You can toggle each log level from
-emergency to debug, and configure channels to ignore (e.g. `page not found`).
+emergency to debug, configure channels to ignore (e.g. `page not found`), and
+specify the log format.
 
 Please file bug reports and feature requests at the [Error Log project
 page](https://www.drupal.org/project/error_log).
+
+Error Log module is maintained by [mfb](https://www.drupal.org/u/mfb).
diff --git a/config/install/error_log.settings.yml b/config/install/error_log.settings.yml
index a42fa4a..c68cb23 100644
--- a/config/install/error_log.settings.yml
+++ b/config/install/error_log.settings.yml
@@ -1,2 +1,3 @@
 log_levels: { level_0: true, level_1: true, level_2: true, level_3: true, level_4: true, level_5: true, level_6: true, level_7: true }
 ignored_channels: [  ]
+format: '[!level] [!type] [!ip] [uid:!uid] [!request_uri] [!referer] !message'
diff --git a/config/schema/error_log.schema.yml b/config/schema/error_log.schema.yml
index c565f50..d83b026 100644
--- a/config/schema/error_log.schema.yml
+++ b/config/schema/error_log.schema.yml
@@ -36,3 +36,6 @@ error_log.settings:
       sequence:
         type: string
         label: 'Log channel'
+    format:
+      type: string
+      label: 'Log format'
diff --git a/migrations/error_log_settings.yml b/migrations/error_log_settings.yml
index bf51d5d..b2cdcc7 100644
--- a/migrations/error_log_settings.yml
+++ b/migrations/error_log_settings.yml
@@ -8,6 +8,7 @@ source:
   variables:
     - error_log_levels
     - error_log_ignored_types
+    - error_log_format
   source_module: error_log
 process:
   log_levels: error_log_levels
@@ -17,6 +18,7 @@ process:
       - 'Drupal\error_log\Form\ErrorLogConfigForm'
       - extractIgnoredChannels
     source: error_log_ignored_types
+  format: error_log_format
 destination:
   plugin: config
   config_name: error_log.settings
diff --git a/src/Form/ErrorLogConfigForm.php b/src/Form/ErrorLogConfigForm.php
index 778fbd1..fdca03b 100644
--- a/src/Form/ErrorLogConfigForm.php
+++ b/src/Form/ErrorLogConfigForm.php
@@ -46,6 +46,41 @@ class ErrorLogConfigForm {
       '#description'   => t('A list of log channels for which messages should not be sent to the PHP error log (one channel per line). Commonly-configured log channels include <em>access denied</em> for 403 errors and <em>page not found</em> for 404 errors.'),
       '#default_value' => implode("\n", $config->get('ignored_channels') ?: []),
     ];
+    $variables = ['#type' => 'html_tag', '#tag' => 'dl'];
+    foreach ([
+      '!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.'),
+    ] as $variable => $description) {
+      $variables['child'][] = [
+        '#type' => 'html_tag',
+        '#tag' => 'dt',
+        'child' => [
+          '#type' => 'html_tag',
+          '#tag' => 'code',
+          '#value' => $variable,
+        ],
+      ];
+      $variables['child'][] = [
+        '#type' => 'html_tag',
+        '#tag' => 'dd',
+        '#value' => $description,
+      ];
+    }
+    $form['error_log']['format'] = [
+      '#type' => 'textfield',
+      '#title' => t('Log format'),
+      '#default_value' => $config->get('format') ?? '[!level] [!type] [!ip] [uid:!uid] [!request_uri] [!referer] !message',
+      '#description' => t('Specify the format of the log entry. Available variables are: @variables', ['@variables' => \Drupal::service('renderer')->render($variables)]),
+    ];
     $form['#submit'][] = [self::class, 'submitForm'];
   }
 
@@ -64,6 +99,7 @@ class ErrorLogConfigForm {
         'error_log',
         'ignored_channels',
       ])))
+      ->set('format', $form_state->getValue(['error_log', 'format']))
       ->save();
   }
 
diff --git a/src/Logger/ErrorLog.php b/src/Logger/ErrorLog.php
index c9a3d12..17a1ab6 100644
--- a/src/Logger/ErrorLog.php
+++ b/src/Logger/ErrorLog.php
@@ -63,6 +63,7 @@ class ErrorLog implements LoggerInterface {
    * {@inheritdoc}
    */
   public function log($level, $message, array $context = []): void {
+    global $base_url;
     $config = $this->configFactory->get('error_log.settings');
     if (empty($config->get('log_levels')["level_$level"])) {
       return;
@@ -74,11 +75,20 @@ class ErrorLog implements LoggerInterface {
     if (function_exists('drush_main') && !ini_get('error_log')) {
       return;
     }
-    $level = static::LOG_LEVELS[$level];
     $message_placeholders = $this->parser->parseMessagePlaceholders($message, $context);
-    $message = empty($message_placeholders) ? $message : strtr($message, $message_placeholders);
-    $message = "[$level] [{$context['channel']}] [{$context['ip']}] [uid:{$context['uid']}] [{$context['request_uri']}] [{$context['referer']}] $message";
-    error_log($message);
+    error_log(strtr($config->get('format') ?? '[!level] [!type] [!ip] [uid:!uid] [!request_uri] [!referer] !message', [
+      '!base_url' => $base_url,
+      '!ip' => $context['ip'],
+      '!level' => static::LOG_LEVELS[$level],
+      '!link' => $context['link'],
+      '!message' => empty($message_placeholders) ? $message : strtr($message, $message_placeholders),
+      '!request_uri' => $context['request_uri'],
+      '!referer' => $context['referer'],
+      '!severity' => $level,
+      '!timestamp' => $context['timestamp'],
+      '!type' => $context['channel'],
+      '!uid' => $context['uid'],
+    ]));
   }
 
 }
