You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by gl...@apache.org on 2003/02/28 18:58:40 UTC
cvs commit: jakarta-tomcat-connectors/jk/native/common jk_logger.h jk_util.c
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: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org