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