glenn 2003/02/28 09:58:40 Modified: jk/native/apache-2.0 mod_jk.c jk/native/common jk_logger.h jk_util.c Log: Use APR for Apache 2.0 mod_jk logging so that piped logs can be used Revision Changes Path 1.66 +187 -55 jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c Index: mod_jk.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c,v retrieving revision 1.65 retrieving revision 1.66 diff -u -r1.65 -r1.66 --- mod_jk.c 7 Jan 2003 01:27:11 -0000 1.65 +++ mod_jk.c 28 Feb 2003 17:58:39 -0000 1.66 @@ -72,6 +72,7 @@ #include "apr_lib.h" #include "apr_date.h" #include "apr_file_info.h" +#include "apr_file_io.h" #include "httpd.h" #include "http_config.h" #include "http_request.h" @@ -109,6 +110,7 @@ #include "jk_service.h" #include "jk_worker.h" #include "jk_uri_worker_map.h" +#include "jk_logger.h" #define JK_WORKER_ID ("jakarta.worker") #define JK_HANDLER ("jakarta-servlet") @@ -127,7 +129,6 @@ /* module MODULE_VAR_EXPORT jk_module; */ AP_MODULE_DECLARE_DATA module jk_module; - typedef struct { /* @@ -136,6 +137,7 @@ char *log_file; int log_level; jk_logger_t *log; + apr_file_t *jklogfp; /* * Worker stuff @@ -199,7 +201,7 @@ static jk_logger_t * main_log = NULL; static jk_worker_env_t worker_env; - +static apr_global_mutex_t *jk_log_lock = NULL; static int JK_METHOD ws_start_response(jk_ws_service_t *s, int status, @@ -313,8 +315,9 @@ int long rv = OK; if (rv = ap_change_request_body_xlate(p->r, 65535, 65535)) /* turn off request body translation*/ { - ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, - NULL, "mod_jk: Error on ap_change_request_body_xlate, rc=%d \n", rv); + ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, + "mod_jk: Error on ap_change_request_body_xlate, rc=%d \n", + rv); return JK_FALSE; } #else @@ -382,12 +385,12 @@ #ifdef AS400 rc = ap_change_response_body_xlate(p->r, 65535, 65535); /* turn off response body translation*/ if(rc){ - ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, - NULL, "mod_jk: Error on ap_change_response_body_xlate, rc=%d \n", rc); - return JK_FALSE; + ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, + "mod_jk: Error on ap_change_response_body_xlate, rc=%d \n", rc); + return JK_FALSE; } #endif - + /* Debug - try to get around rwrite */ while( ll > 0 ) { size_t toSend=(ll>CHUNK_SIZE) ? CHUNK_SIZE : ll; @@ -858,9 +861,12 @@ jk_server_conf_t *conf = (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module); - /* we need an absolut path */ - conf->log_file = ap_server_root_relative(cmd->pool,log_file); - + /* we need an absolute path */ + if (*log_file != '|' ) + conf->log_file = ap_server_root_relative(cmd->pool,log_file); + else + conf->log_file = apr_pstrdup(cmd->pool, log_file); + if (conf->log_file == NULL) return "JkLogFile file_name invalid"; @@ -971,7 +977,7 @@ } *s = 0; - jk_log(conf->log ? conf->log : main_log, JK_LOG_REQUEST, str); + jk_log(main_log, JK_LOG_REQUEST, str); } /***************************************************************** @@ -1651,7 +1657,6 @@ { const char *worker_name; jk_server_conf_t *xconf; - jk_logger_t *xl; jk_server_conf_t *conf; int rc,dmt=1; @@ -1672,7 +1677,6 @@ return DECLINED; worker_name = apr_table_get(r->notes, JK_WORKER_ID); - xl = xconf->log ? xconf->log : main_log; /* Set up r->read_chunked flags for chunked encoding, if present */ if(rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) { @@ -1690,22 +1694,21 @@ I'm not sure how ). We also have a manual config directive that explicitely give control to us. */ worker_name= worker_env.first_worker; - jk_log(xl, JK_LOG_DEBUG, + jk_log(main_log, JK_LOG_DEBUG, "Manual configuration for %s %s %d\n", r->uri, worker_env.first_worker, worker_env.num_of_workers); } else { - worker_name = map_uri_to_worker(xconf->uw_map, r->uri, - xconf->log ? xconf->log : main_log); + worker_name = map_uri_to_worker(xconf->uw_map, r->uri, main_log); if( worker_name == NULL ) worker_name= worker_env.first_worker; - jk_log(xl, JK_LOG_DEBUG, + jk_log(main_log, JK_LOG_DEBUG, "Manual configuration for %s %d\n", r->uri, worker_env.first_worker); } } if (1) { - jk_log(xl, JK_LOG_DEBUG, "Into handler r->proxyreq=%d " + jk_log(main_log, JK_LOG_DEBUG, "Into handler r->proxyreq=%d " "r->handler=%s r->notes=%d worker=%s\n", r->proxyreq, r->handler, r->notes, worker_name); } @@ -1720,8 +1723,7 @@ if(conf && ! worker_name ) { /* Direct mapping ( via setHandler ). Try overrides */ - worker_name = map_uri_to_worker(conf->uw_map, r->uri, - conf->log ? conf->log : main_log); + worker_name = map_uri_to_worker(conf->uw_map, r->uri, main_log); if( ! worker_name ) { /* Since we are here, an explicit (native) mapping has been used */ /* Use default worker */ @@ -1733,9 +1735,7 @@ } if(worker_name) { - jk_logger_t *l = conf->log ? conf->log : main_log; - - jk_worker_t *worker = wc_get_worker_for_name(worker_name, l); + jk_worker_t *worker = wc_get_worker_for_name(worker_name, main_log); if(worker) { struct timeval tv_begin,tv_end; @@ -1775,18 +1775,18 @@ apr_pool_userdata_get( (void **)&end, "jk_thread_endpoint", tpool ); if(end==NULL ) { - worker->get_endpoint(worker, &end, l); + worker->get_endpoint(worker, &end, main_log); apr_pool_userdata_set( end , "jk_thread_endpoint", &jk_cleanup_endpoint, tpool ); } #else */ /* worker->get_endpoint might fail if we are out of memory so check */ /* and handle it */ - if (worker->get_endpoint(worker, &end, l)) + if (worker->get_endpoint(worker, &end, main_log)) /* #endif */ { int is_recoverable_error = JK_FALSE; - rc = end->service(end, &s, l, &is_recoverable_error); + rc = end->service(end, &s, main_log, &is_recoverable_error); if (s.content_read < s.content_length || (s.is_chunked && ! s.no_more_chunks)) { @@ -1806,7 +1806,7 @@ } /* #ifndef REUSE_WORKER */ - end->done(&end, l); + end->done(&end, main_log); /* #endif */ } else /* this means we couldn't get an endpoint */ @@ -2004,12 +2004,6 @@ base->envvars); } - if(overrides->log_file && overrides->log_level >= 0) { - if(!jk_open_file_logger(&(overrides->log), overrides->log_file, - overrides->log_level)) { - overrides->log = NULL; - } - } if(!uri_worker_map_alloc(&(overrides->uw_map), overrides->uri_to_context, overrides->log)) { @@ -2023,15 +2017,135 @@ return overrides; } +static int jk_log_to_file(jk_logger_t *l, + int level, + const char *what) +{ + if( l && + (l->level <= level || level == JK_LOG_REQUEST_LEVEL) && + l->logger_private && what) { + unsigned sz = strlen(what); + unsigned wrote = sz; + char error[256]; + if(sz) { + apr_status_t status; + file_logger_t *p = l->logger_private; + if(p->jklogfp) { + apr_status_t rv; + rv = apr_global_mutex_lock(jk_log_lock); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_global_mutex_lock(jk_log_lock) failed"); + /* XXX: Maybe this should be fatal? */ + } + status = apr_file_write(p->jklogfp,what,&wrote); + if (status != APR_SUCCESS) { + apr_strerror(status, error, 254); + ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, + NULL, "mod_jk: jk_log_to_file failed: %s\n",error); + } + rv = apr_global_mutex_unlock(jk_log_lock); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_global_mutex_unlock(jk_log_lock) failed"); + /* XXX: Maybe this should be fatal? */ + } + } + } + + return JK_TRUE; + } + + return JK_FALSE; +} + +/* +** +-------------------------------------------------------+ +** | | +** | jk logfile support | +** | | +** +-------------------------------------------------------+ +*/ + +static void open_jklog(server_rec *s, apr_pool_t *p) +{ + jk_server_conf_t *conf; + const char *fname; + apr_status_t rc; + piped_log *pl; + jk_logger_t *jkl; + file_logger_t *flp; + int jklog_flags = ( APR_WRITE | APR_APPEND | APR_CREATE ); + apr_fileperms_t jklog_mode = ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD ); + + conf = ap_get_module_config(s->module_config, &jk_module); + + if (main_log != NULL) { + conf->log = main_log; + } + + if (conf->log_file == NULL) { + return; + } + if (*(conf->log_file) == '\0') { + return; + } + + if (*conf->log_file == '|') { + if ((pl = ap_open_piped_log(p, conf->log_file+1)) == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "mod_jk: could not open reliable pipe " + "to jk log %s", conf->log_file+1); + exit(1); + } + conf->jklogfp = (void *)ap_piped_log_write_fd(pl); + } + else if (*conf->log_file != '\0') { + fname = ap_server_root_relative(p, conf->log_file); + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s, + "mod_jk: Invalid JkLog " + "path %s", conf->log_file); + exit(1); + } + if ((rc = apr_file_open(&conf->jklogfp, fname, + jklog_flags, jklog_mode, p)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rc, s, + "mod_jk: could not open JkLog " + "file %s", fname); + exit(1); + } + apr_file_inherit_set(conf->jklogfp); + } + jkl = (jk_logger_t *)apr_palloc(p,sizeof(jk_logger_t)); + flp = (file_logger_t *)apr_palloc(p,sizeof(file_logger_t)); + if(jkl && flp) { + jkl->log = jk_log_to_file; + jkl->level = conf->log_level; + jkl->logger_private = flp; + flp->jklogfp = conf->jklogfp; + conf->log = jkl; + if (main_log == NULL) + main_log = conf->log; + return; + } + if(jkl) { + free(jkl); + } + if(flp) { + free(flp); + } + + exit(1); +} + + /** Standard apache callback, initialize jk. */ static void jk_child_init(apr_pool_t *pconf, server_rec *s) { - jk_server_conf_t *conf = - (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module); - -/* init_jk( pconf, conf, s ); */ } /** Initialize jk, using worker.properties. @@ -2047,15 +2161,6 @@ /* jk_map_t *init_map = NULL; */ jk_map_t *init_map = conf->worker_properties; - if(conf->log_file && conf->log_level >= 0) { - if(!jk_open_file_logger(&(conf->log), - conf->log_file, conf->log_level)) { - conf->log = NULL; - } else { - main_log = conf->log; - } - } - if(!uri_worker_map_alloc(&(conf->uw_map), conf->uri_to_context, conf->log)) { jk_error_exit(APLOG_MARK, APLOG_EMERG, s, pconf, "Memory error"); @@ -2064,9 +2169,10 @@ /* if(map_alloc(&init_map)) { */ if( ! map_read_properties(init_map, conf->worker_file)) { if( map_size( init_map ) == 0 ) { - ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, APLOG_EMERG, - NULL, "No worker file and no worker options in httpd.conf \n" - "use JkWorkerFile to set workers\n"); + ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, + APLOG_EMERG, NULL, + "No worker file and no worker options in httpd.conf \n" + "use JkWorkerFile to set workers\n"); return; } } @@ -2088,15 +2194,42 @@ apr_pool_t *ptemp, server_rec *s) { + apr_status_t rv; + if(!s->is_virtual) { jk_server_conf_t *conf = - (jk_server_conf_t *)ap_get_module_config(s->module_config, + (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module); if(!conf->was_initialized) { - conf->was_initialized = JK_TRUE; + conf->was_initialized = JK_TRUE; init_jk( pconf, conf, s ); } } + + /* create the jk log lockfiles in the parent */ + if ((rv = apr_global_mutex_create(&jk_log_lock, NULL, + APR_LOCK_DEFAULT, pconf)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, + "mod_jk: could not create jk_log_lock"); + return HTTP_INTERNAL_SERVER_ERROR; + } + +#if APR_USE_SYSVSEM_SERIALIZE + rv = unixd_set_global_mutex_perms(jk_log_lock); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, + "mod_jk: Could not set permissions on " + "jk_log_lock; check User and Group directives"); + return HTTP_INTERNAL_SERVER_ERROR; + } +#endif + + /* step through the servers and + * - open each jk logfile + */ + for (; s; s = s->next) { + open_jklog(s, pconf); + } return OK; } @@ -2121,8 +2254,7 @@ "Manually mapped, no need to call uri_to_worker\n"); return DECLINED; } - worker = map_uri_to_worker(conf->uw_map, r->uri, - conf->log ? conf->log : main_log); + worker = map_uri_to_worker(conf->uw_map, r->uri, main_log); if(worker) { r->handler=apr_pstrdup(r->pool,JK_HANDLER); 1.5 +8 -1 jakarta-tomcat-connectors/jk/native/common/jk_logger.h Index: jk_logger.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_logger.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- jk_logger.h 22 Nov 2002 12:23:22 -0000 1.4 +++ jk_logger.h 28 Feb 2003 17:58:39 -0000 1.5 @@ -81,6 +81,13 @@ }; +struct file_logger { + FILE *logfile; + /* For Apache 2 APR piped logging */ + void *jklogfp; +}; +typedef struct file_logger file_logger_t; + #define JK_LOG_DEBUG_LEVEL 0 #define JK_LOG_INFO_LEVEL 1 #define JK_LOG_ERROR_LEVEL 2 1.20 +1 -6 jakarta-tomcat-connectors/jk/native/common/jk_util.c Index: jk_util.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_util.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- jk_util.c 2 Jan 2003 17:12:55 -0000 1.19 +++ jk_util.c 28 Feb 2003 17:58:39 -0000 1.20 @@ -110,11 +110,6 @@ #define HUGE_BUFFER_SIZE (8*1024) #define LOG_LINE_SIZE (1024) -struct file_logger { - FILE *logfile; -}; -typedef struct file_logger file_logger_t; - /* * define the log format, we're using by default the one from error.log *
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]