Jim Jagielski wrote:
True. I just used uri's as they seemed to just "fit." I'm not
particularly tied to the configuration interface. Any interest in me
changing it to use "cmd://"?
'pipe' is clearer I think...
This patch just adds pipe:// as a "log uri"
--
Brian Akins
Lead Systems Engineer
CNN Internet Technologies
diff -ur httpd-2.1.8-beta/modules/loggers/mod_log_config.c
httpd-2.1.8-beta.new/modules/loggers/mod_log_config.c
--- httpd-2.1.8-beta/modules/loggers/mod_log_config.c 2005-09-18
16:39:34.000000000 -0400
+++ httpd-2.1.8-beta.new/modules/loggers/mod_log_config.c 2005-10-03
15:19:55.176764353 -0400
@@ -159,6 +159,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>
@@ -167,6 +168,8 @@
#include <limits.h>
#endif
+#define DEFAULT_LOG_PROVIDER "file"
+
#define DEFAULT_LOG_FORMAT "%h %l %u %t \"%r\" %>s %b"
module AP_MODULE_DECLARE_DATA log_config_module;
@@ -188,15 +191,9 @@
int nelts,
apr_size_t len);
static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s,
- const char* name);
+ const apr_uri_t *uri);
static void *ap_buffered_log_writer_init(apr_pool_t *p, server_rec *s,
- const char* name);
-
-static ap_log_writer_init* ap_log_set_writer_init(ap_log_writer_init *handle);
-static ap_log_writer* ap_log_set_writer(ap_log_writer *handle);
-static ap_log_writer *log_writer = ap_default_log_writer;
-static ap_log_writer_init *log_writer_init = ap_default_log_writer_init;
-static int buffered_logs = 0; /* default unbuffered */
+ const apr_uri_t *uri);
static apr_array_header_t *all_buffered_logs = NULL;
/* POSIX.1 defines PIPE_BUF as the maximum number of bytes that is
@@ -255,10 +252,12 @@
} buffered_log;
typedef struct {
- const char *fname;
+ apr_uri_t uri;
+ const char *fname; /*raw file name*/
const char *format_string;
apr_array_header_t *format;
- void *log_writer;
+ void *handle;
+ log_provider_t *provider;
char *condition_var;
} config_log_state;
@@ -954,12 +953,7 @@
for (i = 0; i < format->nelts; ++i) {
len += strl[i] = strlen(strs[i]);
}
- if (!log_writer) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_EGENERAL, r,
- "log writer isn't correctly setup");
- return HTTP_INTERNAL_SERVER_ERROR;
- }
- rv = log_writer(r, cls->log_writer, strs, strl, format->nelts, len);
+ rv = cls->provider->writer(r, cls->handle, strs, strl, format->nelts, len);
/* xxx: do we return an error on log_writer? */
return OK;
}
@@ -1093,8 +1087,27 @@
else {
cls->format = parse_log_string(cmd->pool, fmt, &err_string);
}
- cls->log_writer = NULL;
+
+ if(apr_uri_parse(cmd->pool, cls->fname, &cls->uri) != APR_SUCCESS) {
+ return "failed to parse uri";
+ }
+
+ /*special case, backaward compatible pipes*/
+ if(*fn == '|') {
+ cls->uri.scheme = "pipe";
+ }
+
+ if(!cls->uri.scheme) {
+ cls->uri.scheme = DEFAULT_LOG_PROVIDER;
+ }
+ if((cls->provider = ap_lookup_provider(LOG_PROVIDER_GROUP,
+ cls->uri.scheme,
LOG_PROVIDER_VERSION))
+ == NULL) {
+ return apr_psprintf(cmd->pool, "unable to file handler for: \"%s\" in
%s",
+ cls->uri.scheme, cls->fname);
+ }
+
return err_string;
}
@@ -1109,15 +1122,6 @@
return add_custom_log(cmd, dummy, fn, "%{Cookie}n \"%r\" %t", NULL);
}
-static const char *set_buffered_logs_on(cmd_parms *parms, void *dummy, int
flag)
-{
- buffered_logs = flag;
- if (buffered_logs) {
- ap_log_set_writer_init(ap_buffered_log_writer_init);
- ap_log_set_writer(ap_buffered_log_writer);
- }
- return NULL;
-}
static const command_rec config_log_cmds[] =
{
AP_INIT_TAKE23("CustomLog", add_custom_log, NULL, RSRC_CONF,
@@ -1129,8 +1133,6 @@
"a log format string (see docs) and an optional format name"),
AP_INIT_TAKE1("CookieLog", set_cookie_log, NULL, RSRC_CONF,
"the filename of the cookie log"),
-AP_INIT_FLAG("BufferedLogs", set_buffered_logs_on, NULL, RSRC_CONF,
- "Enable Buffered Logging (experimental)"),
{NULL}
};
@@ -1138,7 +1140,7 @@
config_log_state *cls,
apr_array_header_t *default_format)
{
- if (cls->log_writer != NULL) {
+ if (cls->handle != NULL) {
return cls; /* virtual config shared w/main server */
}
@@ -1146,8 +1148,8 @@
return cls; /* Leave it NULL to decline. */
}
- cls->log_writer = log_writer_init(p, s, cls->fname);
- if (cls->log_writer == NULL)
+ cls->handle = cls->provider->init(p, s, &cls->uri);
+ if (cls->handle == NULL)
return NULL;
return cls;
@@ -1216,33 +1218,20 @@
static apr_status_t flush_all_logs(void *data)
{
- server_rec *s = data;
- multi_log_state *mls;
- apr_array_header_t *log_list;
- config_log_state *clsarray;
buffered_log *buf;
int i;
-
- if (!buffered_logs)
+ buffered_log **array;
+
+ if (!all_buffered_logs)
return APR_SUCCESS;
- for (; s; s = s->next) {
- mls = ap_get_module_config(s->module_config, &log_config_module);
- log_list = NULL;
- if (mls->config_logs->nelts) {
- log_list = mls->config_logs;
- }
- else if (mls->server_config_logs) {
- log_list = mls->server_config_logs;
- }
- if (log_list) {
- clsarray = (config_log_state *) log_list->elts;
- for (i = 0; i < log_list->nelts; ++i) {
- buf = clsarray[i].log_writer;
- flush_log(buf);
- }
- }
+ array = (buffered_log **)all_buffered_logs->elts;
+
+ for (i = 0; i < all_buffered_logs->nelts; i++) {
+ buf = array[i];
+ flush_log(buf);
}
+
return APR_SUCCESS;
}
@@ -1251,11 +1240,6 @@
{
int res;
- /* First init the buffered logs array, which is needed when opening the
logs. */
- if (buffered_logs) {
- all_buffered_logs = apr_array_make(p, 5, sizeof(buffered_log *));
- }
-
/* Next, do "physical" server, which gets default log fd and format
* for the virtual servers, if they don't override...
*/
@@ -1277,12 +1261,12 @@
ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads);
/* Now register the last buffer flush with the cleanup engine */
- if (buffered_logs) {
+ if (all_buffered_logs) {
int i;
buffered_log **array = (buffered_log **)all_buffered_logs->elts;
apr_pool_cleanup_register(p, s, flush_all_logs, flush_all_logs);
-
+
for (i = 0; i < all_buffered_logs->nelts; i++) {
buffered_log *this = array[i];
@@ -1319,21 +1303,6 @@
apr_hash_set(log_hash, tag, 1, (const void *)log_struct);
}
-static ap_log_writer_init* ap_log_set_writer_init(ap_log_writer_init *handle)
-{
- ap_log_writer_init *old = log_writer_init;
- log_writer_init = handle;
-
- return old;
-
-}
-static ap_log_writer *ap_log_set_writer(ap_log_writer *handle)
-{
- ap_log_writer *old = log_writer;
- log_writer = handle;
-
- return old;
-}
static apr_status_t ap_default_log_writer( request_rec *r,
void *handle,
@@ -1360,42 +1329,49 @@
return rv;
}
static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s,
- const char* name)
+ const apr_uri_t *uri)
{
- if (*name == '|') {
- piped_log *pl;
-
- pl = ap_open_piped_log(p, name + 1);
- if (pl == NULL) {
- return NULL;;
- }
- return ap_piped_log_write_fd(pl);
+ const char *name = uri->path;
+ const char *fname = ap_server_root_relative(p, name);
+ apr_file_t *fd;
+ apr_status_t rv;
+
+ if (!fname) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s,
+ "invalid transfer log path %s.", name);
+ return NULL;
}
- else {
- const char *fname = ap_server_root_relative(p, name);
- apr_file_t *fd;
- apr_status_t rv;
-
- if (!fname) {
- ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s,
- "invalid transfer log path %s.", name);
- return NULL;
- }
- rv = apr_file_open(&fd, fname, xfer_flags, xfer_perms, p);
- if (rv != APR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
- "could not open transfer log file %s.", fname);
- return NULL;
- }
- return fd;
+ rv = apr_file_open(&fd, fname, xfer_flags, xfer_perms, p);
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
+ "could not open transfer log file %s.", fname);
+ return NULL;
}
+ return fd;
+}
+static void *ap_pipe_log_writer_init(apr_pool_t *p, server_rec *s,
+ const apr_uri_t *uri)
+{
+ const char *name = uri->path;
+ piped_log *pl;
+
+ pl = ap_open_piped_log(p, name + 1);
+ if (pl == NULL) {
+ return NULL;
+ }
+ return ap_piped_log_write_fd(pl);
}
static void *ap_buffered_log_writer_init(apr_pool_t *p, server_rec *s,
- const char* name)
+ const apr_uri_t *uri)
{
+
buffered_log *b;
b = apr_pcalloc(p, sizeof(buffered_log));
- b->handle = ap_default_log_writer_init(p, s, name);
+ b->handle = ap_default_log_writer_init(p, s, uri);
+
+ if(!all_buffered_logs) {
+ all_buffered_logs = apr_array_make(p, 5, sizeof(buffered_log *));
+ }
if (b->handle) {
*(buffered_log **)apr_array_push(all_buffered_logs) = b;
@@ -1489,6 +1465,21 @@
return OK;
}
+static const log_provider_t default_logger = {
+ &ap_default_log_writer_init,
+ ap_default_log_writer
+};
+
+static const log_provider_t buffer_logger = {
+ &ap_buffered_log_writer_init,
+ ap_buffered_log_writer
+};
+
+static const log_provider_t pipe_logger = {
+ &ap_pipe_log_writer_init,
+ ap_default_log_writer
+};
+
static void register_hooks(apr_pool_t *p)
{
ap_hook_pre_config(log_pre_config,NULL,NULL,APR_HOOK_REALLY_FIRST);
@@ -1504,8 +1495,12 @@
*/
log_hash = apr_hash_make(p);
APR_REGISTER_OPTIONAL_FN(ap_register_log_handler);
- APR_REGISTER_OPTIONAL_FN(ap_log_set_writer_init);
- APR_REGISTER_OPTIONAL_FN(ap_log_set_writer);
+ ap_register_provider(p, LOG_PROVIDER_GROUP, "file",
+ LOG_PROVIDER_VERSION, &default_logger);
+ ap_register_provider(p, LOG_PROVIDER_GROUP, "buffer",
+ LOG_PROVIDER_VERSION, &buffer_logger);
+ ap_register_provider(p, LOG_PROVIDER_GROUP, "pipe",
+ LOG_PROVIDER_VERSION, &pipe_logger);
}
module AP_MODULE_DECLARE_DATA log_config_module =
diff -ur httpd-2.1.8-beta/modules/loggers/mod_log_config.h
httpd-2.1.8-beta.new/modules/loggers/mod_log_config.h
--- httpd-2.1.8-beta/modules/loggers/mod_log_config.h 2005-05-19
07:53:48.000000000 -0400
+++ httpd-2.1.8-beta.new/modules/loggers/mod_log_config.h 2005-10-03
11:08:21.800235579 -0400
@@ -30,7 +30,7 @@
* callback function prototype for external writer initialization.
*/
typedef void *ap_log_writer_init(apr_pool_t *p, server_rec *s,
- const char *name);
+ const apr_uri_t *uri);
/**
* callback which gets called where there is a log line to write.
*/
@@ -50,14 +50,13 @@
APR_DECLARE_OPTIONAL_FN(void, ap_register_log_handler,
(apr_pool_t *p, char *tag, ap_log_handler_fn_t *func,
int def));
-/**
- * you will need to set your init handler *BEFORE* the open_logs
- * in mod_log_config gets executed
- */
-APR_DECLARE_OPTIONAL_FN(ap_log_writer_init*,
ap_log_set_writer_init,(ap_log_writer_init *func));
-/**
- * you should probably set the writer at the same time (ie..before open_logs)
- */
-APR_DECLARE_OPTIONAL_FN(ap_log_writer*, ap_log_set_writer, (ap_log_writer*
func));
+
+typedef struct {
+ ap_log_writer_init *init;
+ ap_log_writer *writer;
+} log_provider_t;
+
+#define LOG_PROVIDER_GROUP "log_config"
+#define LOG_PROVIDER_VERSION "1"
#endif /* MOD_LOG_CONFIG */