From: Stefan Fritsch Date: Sun, 6 Jun 2010 17:04:40 +0000 (+0000) Subject: - Add loglevels to request_rec and conn_rec X-Git-Tag: 2.3.6~43 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2334a1ea4fbf284c73be7dd0165170657dd86d34;p=apache - Add loglevels to request_rec and conn_rec - Introduce per-directory loglevel configuration git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@951897 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/http_config.h b/include/http_config.h index c5bbd48298..92c0812a56 100644 --- a/include/http_config.h +++ b/include/http_config.h @@ -487,7 +487,23 @@ AP_DECLARE(void) ap_set_module_config(ap_conf_vector_t *cv, const module *m, * @param index The module_index of the module to get the loglevel for. * @return The module-specific loglevel */ -AP_DECLARE(int) ap_get_module_loglevel(const server_rec *s, int index); +AP_DECLARE(int) ap_get_server_module_loglevel(const server_rec *s, int index); + +/** + * Generic accessor for modules the module-specific loglevel + * @param c The connection from which to get the loglevel. + * @param index The module_index of the module to get the loglevel for. + * @return The module-specific loglevel + */ +AP_DECLARE(int) ap_get_conn_module_loglevel(const conn_rec *c, int index); + +/** + * Generic accessor for modules to get the module-specific loglevel + * @param r The request from which to get the loglevel. + * @param index The module_index of the module to get the loglevel for. + * @return The module-specific loglevel + */ +AP_DECLARE(int) ap_get_request_module_loglevel(const request_rec *r, int index); /** * Accessor to set module-specific loglevel @@ -497,27 +513,42 @@ AP_DECLARE(int) ap_get_module_loglevel(const server_rec *s, int index); * @param level The new log level * @return The module-specific loglevel */ -AP_DECLARE(void) ap_set_module_loglevel(apr_pool_t *p, server_rec *s, +AP_DECLARE(void) ap_set_module_loglevel(apr_pool_t *p, struct ap_logconf *l, int index, int level); #if !defined(AP_DEBUG) -#define ap_get_module_loglevel(s,i) \ - (i < 0 || (s)->module_loglevels == NULL || (((s)->module_loglevels)[i]) < 0 ? \ - (s)->loglevel : \ - ((s)->module_loglevels)[i]) +#define ap_get_conn_logconf(c) \ + ((c)->log ? (c)->log : \ + &(c)->base_server->log) + +#define ap_get_request_logconf(r) \ + ((r)->log ? (r)->log : \ + (r)->connection->log ? (r)->connection->log : \ + &(r)->server->log) + +#define ap_get_module_loglevel(l,i) \ + (((i) < 0 || (l)->module_levels == NULL || (l)->module_levels[i] < 0) ? \ + (l)->level : \ + (l)->module_levels[i]) + +#define ap_get_server_module_loglevel(s,i) \ + (ap_get_module_loglevel(&(s)->log,i)) + +#define ap_get_conn_module_loglevel(c,i) \ + (ap_get_module_loglevel(ap_get_conn_logconf(c),i)) + +#define ap_get_request_module_loglevel(r,i) \ + (ap_get_module_loglevel(ap_get_request_logconf(r),i)) #endif /* AP_DEBUG */ /** - * Reset all module-specific loglevels to server default - * @param p A pool - * @param s The server for which to set the loglevel. - * @param index The module_index of the module to set the loglevel for. - * @param level The new log level - * @return The module-specific loglevel + * Set all module-specific loglevels to val + * @param l The log config for which to set the loglevels. + * @param val the value to set all loglevels to */ -AP_DECLARE(void) ap_reset_module_loglevels(server_rec *s); +AP_DECLARE(void) ap_reset_module_loglevels(struct ap_logconf *l, int val); /** * Generic command handling function for strings @@ -910,6 +941,24 @@ AP_CORE_DECLARE(ap_conf_vector_t*) ap_merge_per_dir_configs(apr_pool_t *p, ap_conf_vector_t *base, ap_conf_vector_t *new_conf); +/** + * Allocate new ap_logconf and make (deep) copy of old ap_logconf + * @param p The pool to alloc from + * @param old The ap_logconf to copy (may be NULL) + * @return The new ap_logconf struct + */ +AP_DECLARE(struct ap_logconf *) ap_new_log_config(apr_pool_t *p, + const struct ap_logconf *old); + +/** + * Merge old ap_logconf into new ap_logconf. + * old and new must have the same life time. + * @param old The ap_logconf to merge from + * @param new The ap_logconf to merge into + */ +AP_DECLARE(void) ap_merge_log_config(const struct ap_logconf *old, + struct ap_logconf *new); + /* For http_connection.c... */ /** * Setup the config vector for a connection_rec diff --git a/include/http_core.h b/include/http_core.h index b83e3cb953..0127fe6d11 100644 --- a/include/http_core.h +++ b/include/http_core.h @@ -536,6 +536,9 @@ typedef struct { unsigned use_canonical_phys_port : 2; ap_parse_node_t *condition; /* Conditionally merge sections */ + + /** per-dir log config */ + struct ap_logconf *log; } core_dir_config; /* Per-server core configuration */ diff --git a/include/http_log.h b/include/http_log.h index 183be0aa8e..e296bedc32 100644 --- a/include/http_log.h +++ b/include/http_log.h @@ -130,19 +130,42 @@ static int * const aplog_module_index; #define APLOG_MODULE_IS_LEVEL(s,module_index,level) \ ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) || \ (s == NULL) || \ - (ap_get_module_loglevel(s, module_index) \ + (ap_get_server_module_loglevel(s, module_index) \ + >= ((level)&APLOG_LEVELMASK) ) ) +#define APLOG_C_MODULE_IS_LEVEL(c,module_index,level) \ + ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) || \ + (ap_get_conn_module_loglevel(c, module_index) \ + >= ((level)&APLOG_LEVELMASK) ) ) +#define APLOG_R_MODULE_IS_LEVEL(r,module_index,level) \ + ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) || \ + (ap_get_request_module_loglevel(r, module_index) \ >= ((level)&APLOG_LEVELMASK) ) ) #else #define APLOG_MODULE_IS_LEVEL(s,module_index,level) \ ( (((level)&APLOG_LEVELMASK) <= APLOG_MAX_LOGLEVEL) && \ ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) || \ (s == NULL) || \ - (ap_get_module_loglevel(s, module_index) \ + (ap_get_server_module_loglevel(s, module_index) \ + >= ((level)&APLOG_LEVELMASK) ) ) ) +#define APLOG_C_MODULE_IS_LEVEL(c,module_index,level) \ + ( (((level)&APLOG_LEVELMASK) <= APLOG_MAX_LOGLEVEL) && \ + ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) || \ + (ap_get_conn_module_loglevel(c, module_index) \ + >= ((level)&APLOG_LEVELMASK) ) ) ) +#define APLOG_R_MODULE_IS_LEVEL(r,module_index,level) \ + ( (((level)&APLOG_LEVELMASK) <= APLOG_MAX_LOGLEVEL) && \ + ( (((level)&APLOG_LEVELMASK) <= APLOG_NOTICE) || \ + (ap_get_request_module_loglevel(r, module_index) \ >= ((level)&APLOG_LEVELMASK) ) ) ) #endif #define APLOG_IS_LEVEL(s,level) \ APLOG_MODULE_IS_LEVEL(s,APLOG_MODULE_INDEX,level) +#define APLOG_C_IS_LEVEL(c,level) \ + APLOG_C_MODULE_IS_LEVEL(c,APLOG_MODULE_INDEX,level) +#define APLOG_R_IS_LEVEL(r,level) \ + APLOG_R_MODULE_IS_LEVEL(r,APLOG_MODULE_INDEX,level) + #define APLOGinfo(s) APLOG_IS_LEVEL(s,APLOG_INFO) #define APLOGdebug(s) APLOG_IS_LEVEL(s,APLOG_DEBUG) @@ -155,7 +178,6 @@ static int * const aplog_module_index; #define APLOGtrace7(s) APLOG_IS_LEVEL(s,APLOG_TRACE7) #define APLOGtrace8(s) APLOG_IS_LEVEL(s,APLOG_TRACE8) -#define APLOG_R_IS_LEVEL(r,level) APLOG_IS_LEVEL(r->server,level) #define APLOGrinfo(r) APLOG_R_IS_LEVEL(r,APLOG_INFO) #define APLOGrdebug(r) APLOG_R_IS_LEVEL(r,APLOG_DEBUG) #define APLOGrtrace1(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE1) @@ -167,7 +189,6 @@ static int * const aplog_module_index; #define APLOGrtrace7(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE7) #define APLOGrtrace8(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE8) -#define APLOG_C_IS_LEVEL(c,level) APLOG_IS_LEVEL(c->base_server,level) #define APLOGcinfo(c) APLOG_C_IS_LEVEL(c,APLOG_INFO) #define APLOGcdebug(c) APLOG_C_IS_LEVEL(c,APLOG_DEBUG) #define APLOGctrace1(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE1) diff --git a/include/httpd.h b/include/httpd.h index 9d1ccda5a6..c31a6f4562 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -977,6 +977,11 @@ struct request_rec { * request */ struct ap_filter_t *proto_input_filters; + /** Optional request log level configuration. Will usually point + * to a server or per_dir config, i.e. must be copied before + * modifying */ + const struct ap_logconf *log; + /** A flag to determine if the eos bucket has been sent yet */ int eos_sent; @@ -1094,6 +1099,10 @@ struct conn_rec { */ int clogging_input_filters; + /** Optional connection log level configuration. May point to a server or + * per_dir config, i.e. must be copied before modifying */ + const struct ap_logconf *log; + /** This points to the current thread being used to process this request, * over the lifetime of a request, the value may change. Users of the connection * record should not rely upon it staying the same between calls that invole @@ -1161,6 +1170,13 @@ struct server_addr_rec { char *virthost; }; +struct ap_logconf { + /** The per-module log levels */ + int *module_levels; + + /** The log level for this server */ + int level; +}; /** * @brief A structure to store information for each virtual server */ @@ -1186,14 +1202,12 @@ struct server_rec { /* Log files --- note that transfer log is now in the modules... */ - /** The per-module log levels */ - int *module_loglevels; /** The name of the error log */ char *error_fname; /** A file descriptor that references the error log */ apr_file_t *error_log; - /** The log level for this server */ - int loglevel; + /** The log level configuration */ + struct ap_logconf log; /* Module-specific configuration for server, and defaults... */ diff --git a/modules/generators/mod_cgid.c b/modules/generators/mod_cgid.c index 443af0b11b..6c3e91deb1 100644 --- a/modules/generators/mod_cgid.c +++ b/modules/generators/mod_cgid.c @@ -394,7 +394,7 @@ static apr_status_t get_req(int fd, request_rec *r, char **argv0, char ***env, if (stat != APR_SUCCESS) { return stat; } - r->server->loglevel = req->loglevel; + r->server->log.level = req->loglevel; if (req->req_type == GETPID_REQ) { /* no more data sent for this request */ return APR_SUCCESS; @@ -503,7 +503,7 @@ static apr_status_t send_req(int fd, request_rec *r, char *argv0, char **env, req.argv0_len = strlen(argv0); req.uri_len = strlen(r->uri); req.args_len = r->args ? strlen(r->args) : 0; - req.loglevel = r->server->loglevel; + req.loglevel = r->server->log.level; /* Write the request header */ if (req.args_len) { diff --git a/server/config.c b/server/config.c index 1cd97e9aef..085d3395cf 100644 --- a/server/config.c +++ b/server/config.c @@ -50,6 +50,7 @@ #include "http_vhost.h" #include "util_cfgtree.h" +#define APLOG_UNSET (APLOG_NO_MODULE - 1) APLOG_USE_MODULE(core); AP_DECLARE_DATA const char *ap_server_argv0 = NULL; @@ -1355,24 +1356,30 @@ AP_DECLARE_NONSTD(const char *) ap_set_deprecated(cmd_parms *cmd, return cmd->cmd->errmsg; } -AP_DECLARE(void) ap_reset_module_loglevels(server_rec *s) +AP_DECLARE(void) ap_reset_module_loglevels(struct ap_logconf *l, int val) { - if (s->module_loglevels) { - memset(s->module_loglevels, -1, - sizeof(int) * (total_modules + DYNAMIC_MODULE_LIMIT)); + if (l->module_levels) { + int i; + for (i = 0; i < total_modules + DYNAMIC_MODULE_LIMIT; i++) + l->module_levels[i] = val; } } -AP_DECLARE(void) ap_set_module_loglevel(apr_pool_t *pool, server_rec *s, +AP_DECLARE(void) ap_set_module_loglevel(apr_pool_t *pool, struct ap_logconf *l, int index, int level) { - if (!s->module_loglevels) { - s->module_loglevels = apr_palloc(pool, + if (!l->module_levels) { + l->module_levels = apr_palloc(pool, sizeof(int) * (total_modules + DYNAMIC_MODULE_LIMIT)); - ap_reset_module_loglevels(s); + if (l->level == APLOG_UNSET) { + ap_reset_module_loglevels(l, APLOG_UNSET); + } + else { + ap_reset_module_loglevels(l, APLOG_NO_MODULE); + } } - s->module_loglevels[index] = level; + l->module_levels[index] = level; } /***************************************************************** @@ -1981,8 +1988,8 @@ AP_CORE_DECLARE(const char *) ap_init_virtual_host(apr_pool_t *p, s->keep_alive = -1; s->keep_alive_max = -1; s->error_log = main_server->error_log; - s->loglevel = main_server->loglevel; - s->module_loglevels = NULL; + s->log.level = main_server->log.level; + s->log.module_levels = NULL; /* useful default, otherwise we get a port of 0 on redirects */ s->port = main_server->port; s->next = NULL; @@ -2003,10 +2010,53 @@ AP_CORE_DECLARE(const char *) ap_init_virtual_host(apr_pool_t *p, return ap_parse_vhost_addrs(p, hostname, s); } +AP_DECLARE(struct ap_logconf *) ap_new_log_config(apr_pool_t *p, + const struct ap_logconf *old) +{ + struct ap_logconf *l = apr_pcalloc(p, sizeof(struct ap_logconf)); + if (old) { + l->level = old->level; + if (old->module_levels) { + l->module_levels = + apr_pmemdup(p, old->module_levels, + sizeof(int) * (total_modules + DYNAMIC_MODULE_LIMIT)); + } + } + else { + l->level = APLOG_UNSET; + } + return l; +} + +AP_DECLARE(void) ap_merge_log_config(const struct ap_logconf *old, + struct ap_logconf *new) +{ + if (new->level != APLOG_UNSET) { + /* Setting the main loglevel resets all per-module log levels. + * I.e. if new->level has been set, we must ignore old->module_levels. + */ + return; + } + + new->level = old->level; + if (new->module_levels == NULL) { + new->module_levels = old->module_levels; + } + else if (old->module_levels != NULL) { + int i; + for (i = 0; i < total_modules + DYNAMIC_MODULE_LIMIT; i++) { + if (new->module_levels[i] == APLOG_UNSET) + new->module_levels[i] = old->module_levels[i]; + } + } +} AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server) { server_rec *virt; + core_dir_config *dconf = ap_get_module_config(main_server->lookup_defaults, + &core_module); + dconf->log = &main_server->log; for (virt = main_server->next; virt; virt = virt->next) { merge_server_configs(p, main_server->module_config, @@ -2031,17 +2081,10 @@ AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server) if (virt->keep_alive_max == -1) virt->keep_alive_max = main_server->keep_alive_max; - if (virt->module_loglevels == NULL) { - virt->module_loglevels = main_server->module_loglevels; - } - else if (main_server->module_loglevels != NULL) { - int i; - for (i = 0; i < total_modules + DYNAMIC_MODULE_LIMIT; i++) { - if (virt->module_loglevels[i] < 0) - virt->module_loglevels[i] = - main_server->module_loglevels[i]; - } - } + ap_merge_log_config(&main_server->log, &virt->log); + + dconf = ap_get_module_config(virt->lookup_defaults, &core_module); + dconf->log = &virt->log; /* XXX: this is really something that should be dealt with by a * post-config api phase @@ -2075,8 +2118,8 @@ static server_rec *init_server_config(process_rec *process, apr_pool_t *p) s->server_hostname = NULL; s->server_scheme = NULL; s->error_fname = DEFAULT_ERRORLOG; - s->loglevel = DEFAULT_LOGLEVEL; - s->module_loglevels = NULL; + s->log.level = DEFAULT_LOGLEVEL; + s->log.module_levels = NULL; s->limit_req_line = DEFAULT_LIMIT_REQUEST_LINE; s->limit_req_fieldsize = DEFAULT_LIMIT_REQUEST_FIELDSIZE; s->limit_req_fields = DEFAULT_LIMIT_REQUEST_FIELDS; diff --git a/server/core.c b/server/core.c index 9f29d562cf..c9901754c5 100644 --- a/server/core.c +++ b/server/core.c @@ -419,6 +419,16 @@ static void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv) conf->allow_encoded_slashes = new->allow_encoded_slashes; + if (new->log) { + if (!conf->log) { + conf->log = new->log; + } + else { + conf->log = ap_new_log_config(a, new->log); + ap_merge_log_config(base->log, conf->log); + } + } + return (void*)conf; } @@ -2625,17 +2635,33 @@ static const char *include_config (cmd_parms *cmd, void *dummy, return NULL; } -static const char *set_loglevel(cmd_parms *cmd, void *dummy, const char *arg_) +static const char *set_loglevel(cmd_parms *cmd, void *config_, const char *arg_) { char *level_str; int level; module *module; char *arg = apr_pstrdup(cmd->temp_pool, arg_); + struct ap_logconf *log; + const char *err; + /* XXX: what check is necessary here? */ +#if 0 const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE); if (err != NULL) { return err; } +#endif + + if (cmd->path) { + core_dir_config *dconf = config_; + if (!dconf->log) { + dconf->log = ap_new_log_config(cmd->pool, NULL); + } + log = dconf->log; + } + else { + log = &cmd->server->log; + } if (arg == NULL) return "LogLevel requires level keyword or module loglevel specifier"; @@ -2643,10 +2669,10 @@ static const char *set_loglevel(cmd_parms *cmd, void *dummy, const char *arg_) level_str = ap_strchr(arg, ':'); if (level_str == NULL) { - err = ap_parse_log_level(arg, &cmd->server->loglevel); + err = ap_parse_log_level(arg, &log->level); if (err != NULL) return err; - ap_reset_module_loglevels(cmd->server); + ap_reset_module_loglevels(log, APLOG_NO_MODULE); ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, cmd->server, "Setting LogLevel for all modules to %s", arg); return NULL; @@ -2666,15 +2692,14 @@ static const char *set_loglevel(cmd_parms *cmd, void *dummy, const char *arg_) char *name = apr_psprintf(cmd->temp_pool, "%s_module", arg); ap_log_error(APLOG_MARK, APLOG_TRACE6, 0, cmd->server, "Cannot find module '%s', trying '%s'", arg, name); - module = find_module(cmd->server, name); + module = find_module(cmd->server, name); } if (module == NULL) { return apr_psprintf(cmd->temp_pool, "Cannot find module %s", arg); } - ap_set_module_loglevel(cmd->pool, cmd->server, module->module_index, - level); + ap_set_module_loglevel(cmd->pool, log, module->module_index, level); ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, cmd->server, "Setting LogLevel for module %s to %s", module->name, level_str); @@ -3355,7 +3380,7 @@ AP_INIT_TAKE1("IncludeOptional", include_config, (void*)1, (RSRC_CONF | ACCESS_CONF | EXEC_ON_READ), "Name or pattern of the config file(s) to be included; ignored if the file " "does not exist or the pattern does not match any files"), -AP_INIT_ITERATE("LogLevel", set_loglevel, NULL, RSRC_CONF, +AP_INIT_ITERATE("LogLevel", set_loglevel, NULL, RSRC_CONF|ACCESS_CONF, "Level of verbosity in error logging"), AP_INIT_TAKE1("NameVirtualHost", ap_set_name_virtual_host, NULL, RSRC_CONF, "A numeric IP address:port, or the name of a host"), diff --git a/server/log.c b/server/log.c index 49ab7ad77b..d41821da52 100644 --- a/server/log.c +++ b/server/log.c @@ -580,25 +580,30 @@ static void log_error_core(const char *file, int line, int module_index, logf = stderr_log; } - else if (s->error_log) { - /* - * If we are doing normal logging, don't log messages that are - * above the module's log level unless it is a startup/shutdown notice - */ - if ((level_and_mask != APLOG_NOTICE) - && (level_and_mask > ap_get_module_loglevel(s, module_index))) { - return; - } - - logf = s->error_log; - } else { - /* - * If we are doing syslog logging, don't log messages that are - * above the module's log level (including a startup/shutdown notice) - */ - if (level_and_mask > ap_get_module_loglevel(s, module_index)) { - return; + int configured_level = r ? ap_get_request_module_loglevel(r, module_index) : + c ? ap_get_conn_module_loglevel(c, module_index) : + ap_get_server_module_loglevel(s, module_index); + if (s->error_log) { + /* + * If we are doing normal logging, don't log messages that are + * above the module's log level unless it is a startup/shutdown notice + */ + if ((level_and_mask != APLOG_NOTICE) + && (level_and_mask > configured_level)) { + return; + } + + logf = s->error_log; + } + else { + /* + * If we are doing syslog logging, don't log messages that are + * above the module's log level (including a startup/shutdown notice) + */ + if (level_and_mask > configured_level) { + return; + } } } diff --git a/server/request.c b/server/request.c index d608cda365..9a9b97521c 100644 --- a/server/request.c +++ b/server/request.c @@ -112,10 +112,10 @@ AP_DECLARE(int) ap_process_request_internal(request_rec *r) { int file_req = (r->main && r->filename); int access_status; + core_dir_config *d; /* Ignore embedded %2F's in path for proxy requests */ if (!r->proxyreq && r->parsed_uri.path) { - core_dir_config *d; d = ap_get_module_config(r->per_dir_config, &core_module); if (d->allow_encoded_slashes) { access_status = ap_unescape_url_keep2f(r->parsed_uri.path); @@ -147,6 +147,11 @@ AP_DECLARE(int) ap_process_request_internal(request_rec *r) return access_status; } + d = ap_get_module_config(r->per_dir_config, &core_module); + if (d->log) { + r->log = d->log; + } + if ((access_status = ap_run_translate_name(r))) { return decl_die(access_status, "translate", r); } @@ -167,6 +172,11 @@ AP_DECLARE(int) ap_process_request_internal(request_rec *r) return access_status; } + d = ap_get_module_config(r->per_dir_config, &core_module); + if (d->log) { + r->log = d->log; + } + /* Only on the main request! */ if (r->main == NULL) { if ((access_status = ap_run_header_parser(r))) { @@ -1589,6 +1599,7 @@ static request_rec *make_sub_request(const request_rec *r, rnew->request_time = r->request_time; rnew->connection = r->connection; rnew->server = r->server; + rnew->log = r->log; rnew->request_config = ap_create_request_config(rnew->pool); diff --git a/server/util_debug.c b/server/util_debug.c index 0230038b0e..cf8aa0e9c9 100644 --- a/server/util_debug.c +++ b/server/util_debug.c @@ -106,20 +106,56 @@ AP_DECLARE(void *) ap_get_module_config(const ap_conf_vector_t *cv, return ((void **)cv)[m->module_index]; } -#if defined(ap_get_module_loglevel) -#undef ap_get_module_loglevel -AP_DECLARE(int) ap_get_module_loglevel(const server_rec *s, int module_index); +#if defined(ap_get_server_module_loglevel) +#undef ap_get_server_module_loglevel +AP_DECLARE(int) ap_get_server_module_loglevel(const server_rec *s, int module_index); #endif -AP_DECLARE(int) ap_get_module_loglevel(const server_rec *s, int module_index) +AP_DECLARE(int) ap_get_server_module_loglevel(const server_rec *s, int module_index) { - if (module_index < 0 || s->module_loglevels == NULL || - s->module_loglevels[module_index] < 0) + if (module_index < 0 || s->log.module_levels == NULL || + s->log.module_levels[module_index] < 0) { - return s->loglevel; + return s->log.level; } - return s->module_loglevels[module_index]; + return s->log.module_levels[module_index]; +} + +#if defined(ap_get_conn_module_loglevel) +#undef ap_get_conn_module_loglevel +AP_DECLARE(int) ap_get_conn_module_loglevel(const conn_rec *c, int module_index); +#endif + +AP_DECLARE(int) ap_get_conn_module_loglevel(const conn_rec *c, int module_index) +{ + const struct ap_logconf *l = (c)->log ? (c)->log : &(c)->base_server->log; + if (module_index < 0 || l->module_levels == NULL || + l->module_levels[module_index] < 0) + { + return l->level; + } + + return l->module_levels[module_index]; +} + +#if defined(ap_get_request_module_loglevel) +#undef ap_get_request_module_loglevel +AP_DECLARE(int) ap_get_request_module_loglevel(const request_rec *c, int module_index); +#endif + +AP_DECLARE(int) ap_get_request_module_loglevel(const request_rec *r, int module_index) +{ + const struct ap_logconf *l = r->log ? r->log : + r->connection->log ? r->connection->log : + &r->server->log; + if (module_index < 0 || l->module_levels == NULL || + l->module_levels[module_index] < 0) + { + return l->level; + } + + return l->module_levels[module_index]; } /**