Index: modules/loggers/mod_log_config.c
===================================================================
--- modules/loggers/mod_log_config.c	(revision 1671751)
+++ modules/loggers/mod_log_config.c	(working copy)
@@ -161,6 +161,7 @@
 #include "http_protocol.h"
 #include "util_time.h"
 #include "ap_mpm.h"
+#include "ap_provider.h"
 
 #if APR_HAVE_UNISTD_H
 #include <unistd.h>
@@ -289,6 +290,35 @@
     apr_array_header_t *conditions;
 } log_format_item;
 
+/*
+ * errorlog_provider_data holds pointer to provider and its handle
+ * generated by provider initialization. It is used when logging using
+ * ap_errorlog_provider.
+ */
+typedef struct {
+    struct ap_errorlog_provider *provider;
+    void *handle;
+} errorlog_provider_data;
+
+/*
+ * Type of the log_writer created by ap_default_log_writer_init.
+ * It is used by ap_default_log_writer to determine the type of
+ * the log_writer.
+ */
+enum default_log_writer_type {
+    LOG_WRITER_FD,
+    LOG_WRITER_PROVIDER
+};
+
+/*
+ * Abstract struct to allow multiple types of log writers to be created
+ * by ap_default_log_writer_init function.
+ */
+typedef struct {
+    enum default_log_writer_type type;
+    void *log_writer;
+} default_log_writer;
+
 static char *pfmt(apr_pool_t *p, int i)
 {
     if (i <= 0) {
@@ -1596,6 +1626,7 @@
                            apr_size_t len)
 
 {
+    default_log_writer *log_writer = handle;
     char *str;
     char *s;
     int i;
@@ -1612,7 +1643,26 @@
         s += strl[i];
     }
 
-    rv = apr_file_write_full((apr_file_t*)handle, str, len, NULL);
+    if (log_writer->type == LOG_WRITER_FD) {
+        rv = apr_file_write_full((apr_file_t*)log_writer->log_writer, str,
+                                 len, NULL);
+    }
+    else {
+        errorlog_provider_data *data = log_writer->log_writer;
+        ap_errorlog_info info;
+        info.r             = r;
+        info.s             = r->server;
+        info.c             = r->connection;
+        info.pool          = r->pool;
+        info.file          = NULL;
+        info.line          = 0;
+        info.status        = 0;
+        info.using_provider = 1;
+        info.startup       = 0;
+        info.format        = "";
+        data->provider->writer(&info, data->handle,
+                                str, len);
+    }
 
     return rv;
 }
@@ -1619,6 +1669,18 @@
 static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s,
                                         const char* name)
 {
+    default_log_writer *log_writer;
+    const char *provider_name = name;
+    ap_errorlog_provider *provider = NULL;
+    char *sep;
+
+    /* We support *Log "errorlog_provider:arg" syntax now, so get the provider
+     * name from the name. */
+    if ((sep = ap_strchr_c(name, ':')) != NULL) {
+        provider_name = apr_pstrmemdup(p, name, sep - name);
+        sep++;
+    }
+
     if (*name == '|') {
         piped_log *pl;
 
@@ -1626,8 +1688,35 @@
         if (pl == NULL) {
            return NULL;
         }
-        return ap_piped_log_write_fd(pl);
+
+        log_writer = apr_pcalloc(p, sizeof(default_log_writer));
+        log_writer->type = LOG_WRITER_FD;
+        log_writer->log_writer = ap_piped_log_write_fd(pl);
+        if (!log_writer->log_writer) {
+            return NULL;
+        }
+        return log_writer;
     }
+    else if ((provider = ap_lookup_provider(AP_ERRORLOG_PROVIDER_GROUP,
+        provider_name, AP_ERRORLOG_PROVIDER_VERSION)) != NULL) {
+        void *provider_handle;
+        errorlog_provider_data *provider_data;
+    
+        provider_handle = provider->init(p, s);
+        if (!provider_handle) {
+            /* provider must log something to the console */
+            return NULL;
+        }
+
+        provider_data = apr_pcalloc(p, sizeof(errorlog_provider_data));
+        provider_data->provider = provider;
+        provider_data->handle = provider_handle;
+
+        log_writer = apr_pcalloc(p, sizeof(default_log_writer));
+        log_writer->type = LOG_WRITER_PROVIDER;
+        log_writer->log_writer = provider_data;
+        return log_writer;
+    }
     else {
         const char *fname = ap_server_root_relative(p, name);
         apr_file_t *fd;
@@ -1644,7 +1733,11 @@
                             "could not open transfer log file %s.", fname);
             return NULL;
         }
-        return fd;
+
+        log_writer = apr_pcalloc(p, sizeof(default_log_writer));
+        log_writer->type = LOG_WRITER_FD;
+        log_writer->log_writer = fd;
+        return log_writer;
     }
 }
 static void *ap_buffered_log_writer_init(apr_pool_t *p, server_rec *s,
