cvs commit: apache-apr/pthreads/src/main http_main.c
manoj 99/02/16 16:01:54 Modified:pthreads/src/main http_main.c Log: Eep. ptrans existed in the process scope. Now there is one ptrans per thread, and it is sub-pooled off the correct super-pool now. This fixes some very confusing coredumps, which were confusing because there were still coredumps before the original ptrans patch, they were just caused by the lack of ptrans. Revision ChangesPath 1.35 +2 -2 apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -u -r1.34 -r1.35 --- http_main.c 1999/02/16 21:37:32 1.34 +++ http_main.c 1999/02/17 00:01:45 1.35 @@ -288,7 +288,6 @@ static pool *pperm; /* Pool for permananent stuff */ static pool *pconf; /* Pool for config stuff */ -static pool *ptrans; /* Pool for per-transaction stuff */ static pool *ptemp; /* Pool for temporart config stuff */ static pool *pcommands; /* Pool for -C and -c switches */ @@ -2313,10 +2312,11 @@ int my_tid = ti-tid; struct sockaddr sa_client; int csd; +pool *ptrans;/* Pool for per-transaction stuff */ free(ti); -ptrans = ap_make_sub_pool(pconf); +ptrans = ap_make_sub_pool(pchild); while (0 requests_this_child) { (void) ap_update_child_status(my_pid, my_tid, SERVER_READY, (request_rec *) NULL);
cvs commit: apache-apr/pthreads/src/main http_main.c
manoj 99/02/16 16:03:43 Modified:pthreads/src/main http_main.c Log: Get rid of some more debugging messages which were clogging the error log. Revision ChangesPath 1.36 +0 -2 apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -u -r1.35 -r1.36 --- http_main.c 1999/02/17 00:01:45 1.35 +++ http_main.c 1999/02/17 00:03:41 1.36 @@ -2219,10 +2219,8 @@ while ((r = ap_read_request(current_conn)) != NULL) { (void) ap_update_child_status(my_child_num, my_thread_num, SERVER_BUSY_WRITE, r); - fprintf(stderr,%d child_main: about to process request\n,my_child_num); if (r-status == HTTP_OK) ap_process_request(r); - fprintf(stderr,%d child_main: request done\n,my_child_num); if (ap_extended_status) increment_counts(my_child_num, my_thread_num, r); if (!current_conn-keepalive || ap_is_aborted(current_conn))
cvs commit: apache-apr STATUS
manoj 99/02/16 17:08:19 Modified:.STATUS Log: I really have to get this song out of my head. Revision ChangesPath 1.8 +2 -4 apache-apr/STATUS Index: STATUS === RCS file: /home/cvs/apache-apr/STATUS,v retrieving revision 1.7 retrieving revision 1.8 diff -u -u -r1.7 -r1.8 --- STATUS1999/02/16 16:04:10 1.7 +++ STATUS1999/02/17 01:08:18 1.8 @@ -1,5 +1,5 @@ Apache Portable Runtime STATUS: -Last modified at [$Date: 1999/02/16 16:04:10 $] +Last modified at [$Date: 1999/02/17 01:08:18 $] Release: @@ -25,14 +25,12 @@ Mod_status Re-write mod_status to use updated scoreboard for hybrid server. +This is pretty close to completion. Accept Serialization across Processes Currently, we use one mutex total, we need to change this to be one mutex per socket. Possibly, we could attach the mutex to the listen_rec, and pass it down to the accept loop. - -Memory leakage - It looks like we are leaking, we need to find out why and where. Timeouts. (only soft timeouts)
cvs commit: apache-apr/pthreads/src/main http_main.c
manoj 99/02/16 21:32:02 Modified:pthreads/src/main http_main.c Log: pthread calls while handling a signal are bad voodoo. This is another way to allow cleanups to run after all threads exit. Revision ChangesPath 1.37 +11 -10apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -u -r1.36 -r1.37 --- http_main.c 1999/02/17 00:03:41 1.36 +++ http_main.c 1999/02/17 05:32:00 1.37 @@ -431,13 +431,6 @@ ap_pclosesocket(pconf, lr-fd); lr= lr-next; } - -for (i = 0; i ss-worker_threads + ss-acceptor_threads; i++) { -if (ap_scoreboard_image-servers[index][i].status != SERVER_DEAD) { - pthread_join(ap_scoreboard_image-servers[index][i].tid, NULL); - } -} -clean_child_exit(0); } /** ZZZ this should probably be abstracted to it's own file. / @@ -2300,7 +2293,7 @@ } ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) NULL); pthread_once(firstcall, graceful_killer); -pthread_exit(NULL); +return NULL; } void * worker_thread(void * dummy) @@ -2328,8 +2321,7 @@ ap_destroy_pool(ptrans); ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) NULL); pthread_once(firstcall, graceful_killer); - -pthread_exit(NULL); +return NULL; } /* @@ -2573,6 +2565,15 @@ lr-used = 1; accept_thread(my_info); + +/* Wait for other threads to die, then clean up. Note: joining oneself is + * a bad thing, so we make sure that i my_info-tid, not = */ +for (i = 0; i my_info-tid; i++) { +if (ap_scoreboard_image-servers[my_child_num][i].status != SERVER_DEAD) { + pthread_join(ap_scoreboard_image-servers[my_child_num][i].tid, NULL); + } +} +clean_child_exit(0); } static int make_child(server_rec *s, int slot, time_t now) /* ZZZ */
cvs commit: apache-apr/pthreads/src/main http_main.c
manoj 99/02/17 00:13:16 Modified:.STATUS pthreads/src/main http_main.c Log: Start to remove pthread calls from clean_child_exit to make it legal for a signal handler. There is still a pthread_cancel loop, which seems to work sometimes for killing hanging threads, but not all the time. The real solution is to fix the hanging threads, which seem to be caused by the (accidental?) usage of a cross-process alloc_mutex. The last commit message was messed up. That patch didn't undo any pthread calls during signal handling, but it is still necessary because it prevents the thread from trying to join itself. I need someone to show me how to change stupid commit messages. Revision ChangesPath 1.9 +3 -1 apache-apr/STATUS Index: STATUS === RCS file: /home/cvs/apache-apr/STATUS,v retrieving revision 1.8 retrieving revision 1.9 diff -u -u -r1.8 -r1.9 --- STATUS1999/02/17 01:08:18 1.8 +++ STATUS1999/02/17 08:13:13 1.9 @@ -1,5 +1,5 @@ Apache Portable Runtime STATUS: -Last modified at [$Date: 1999/02/17 01:08:18 $] +Last modified at [$Date: 1999/02/17 08:13:13 $] Release: @@ -40,6 +40,8 @@ Everything Needs patch: + * A patch to make the alloc_mutex's scope per-process. It seems to be +causing trouble on Linux at least. Open issues: 1.38 +17 -3 apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -u -r1.37 -r1.38 --- http_main.c 1999/02/17 05:32:00 1.37 +++ http_main.c 1999/02/17 08:13:15 1.38 @@ -397,14 +397,29 @@ listen_rec *lr; parent_score *ss = ap_scoreboard_image-parent[child_num]; +/* XXX - This should be taken care of by the parent process. When it reaps + * the child, it will also update the scoreboard. We can't do this here, + * because clean_child_exit can be called from a signal handler, and + * ap_update_child_status calls pthread_self */ +#if 0 for (i = 0; i ap_threads_per_child + ap_acceptors_per_child; i++) ap_update_child_status(child_num, i, SERVER_DEAD, (request_rec *) NULL); +#endif if (pchild) { ap_child_exit_modules(pchild, server_conf); ap_destroy_pool(pchild); } +/* XXX - This is not allowed in a signal handler either, and it shouldn't + * be needed. But it's still in here, because without it, we get hanging + * threads on linux. The symptom isn't *too* bad on Linux: a core dump in + * the exit() library call. + * + * The root cause seems to be that alloc's pthread mutex is being used + * across processes, which is not kosher on some platforms (i.e. Linux), + * and a thread whacking a pool will hit an acquire_mutex and hang */ + for (i = 0; i ss-worker_threads + ss-acceptor_threads; i++) { if (ap_scoreboard_image-servers[child_num][i].status != SERVER_DEAD) { pthread_cancel(ap_scoreboard_image-servers[child_num][i].tid); @@ -2811,9 +2826,8 @@ if (pid = 0) { child_slot = find_child_by_pid(0); if (child_slot = 0) { - /*(void) ap_update_child_status(child_slot, SERVER_DEAD, - (request_rec *) NULL); - LOOK INTO THIS */ +for (i = 0; i ap_threads_per_child + ap_acceptors_per_child; i++) +ap_update_child_status(child_slot, i, SERVER_DEAD, (request_rec *) NULL); if (remaining_children_to_start child_slot ap_daemons_limit) {
cvs commit: apache-apr/pthreads/src/main http_main.c
rbb 99/02/17 07:29:52 Modified:pthreads/src/main http_main.c Log: Removing Manoj's two patches from last night, because they go after a symptom, not the cause of the problem. This is the first of a series of commits to fix the underlying problem of graceful restarts. This is my first time removing a patch, so if I do it wrong, I'll fix it in later patches. :) Revision ChangesPath 1.39 +13 -28apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -r1.38 -r1.39 --- http_main.c 1999/02/17 08:13:15 1.38 +++ http_main.c 1999/02/17 15:29:51 1.39 @@ -397,29 +397,14 @@ listen_rec *lr; parent_score *ss = ap_scoreboard_image-parent[child_num]; -/* XXX - This should be taken care of by the parent process. When it reaps - * the child, it will also update the scoreboard. We can't do this here, - * because clean_child_exit can be called from a signal handler, and - * ap_update_child_status calls pthread_self */ -#if 0 for (i = 0; i ap_threads_per_child + ap_acceptors_per_child; i++) ap_update_child_status(child_num, i, SERVER_DEAD, (request_rec *) NULL); -#endif if (pchild) { ap_child_exit_modules(pchild, server_conf); ap_destroy_pool(pchild); } -/* XXX - This is not allowed in a signal handler either, and it shouldn't - * be needed. But it's still in here, because without it, we get hanging - * threads on linux. The symptom isn't *too* bad on Linux: a core dump in - * the exit() library call. - * - * The root cause seems to be that alloc's pthread mutex is being used - * across processes, which is not kosher on some platforms (i.e. Linux), - * and a thread whacking a pool will hit an acquire_mutex and hang */ - for (i = 0; i ss-worker_threads + ss-acceptor_threads; i++) { if (ap_scoreboard_image-servers[child_num][i].status != SERVER_DEAD) { pthread_cancel(ap_scoreboard_image-servers[child_num][i].tid); @@ -446,6 +431,13 @@ ap_pclosesocket(pconf, lr-fd); lr= lr-next; } + +for (i = 0; i ss-worker_threads + ss-acceptor_threads; i++) { +if (ap_scoreboard_image-servers[index][i].status != SERVER_DEAD) { + pthread_join(ap_scoreboard_image-servers[index][i].tid, NULL); + } +} +clean_child_exit(0); } /** ZZZ this should probably be abstracted to it's own file. / @@ -2308,7 +2300,7 @@ } ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) NULL); pthread_once(firstcall, graceful_killer); -return NULL; +pthread_exit(NULL); } void * worker_thread(void * dummy) @@ -2336,7 +2328,8 @@ ap_destroy_pool(ptrans); ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) NULL); pthread_once(firstcall, graceful_killer); -return NULL; + +pthread_exit(NULL); } /* @@ -2580,15 +2573,6 @@ lr-used = 1; accept_thread(my_info); - -/* Wait for other threads to die, then clean up. Note: joining oneself is - * a bad thing, so we make sure that i my_info-tid, not = */ -for (i = 0; i my_info-tid; i++) { -if (ap_scoreboard_image-servers[my_child_num][i].status != SERVER_DEAD) { - pthread_join(ap_scoreboard_image-servers[my_child_num][i].tid, NULL); - } -} -clean_child_exit(0); } static int make_child(server_rec *s, int slot, time_t now) /* ZZZ */ @@ -2826,8 +2810,9 @@ if (pid = 0) { child_slot = find_child_by_pid(0); if (child_slot = 0) { -for (i = 0; i ap_threads_per_child + ap_acceptors_per_child; i++) -ap_update_child_status(child_slot, i, SERVER_DEAD, (request_rec *) NULL); + /*(void) ap_update_child_status(child_slot, SERVER_DEAD, + (request_rec *) NULL); + LOOK INTO THIS */ if (remaining_children_to_start child_slot ap_daemons_limit) {
cvs commit: apache-apr/pthreads/src/main http_main.c
rbb 99/02/17 10:42:03 Modified:pthreads/src/main http_main.c Log: This patch fixes a few different things. The first, is that if MaxRequestsPerChild was set to 0 in the config file, the child would start and stop immediately. This fixes that. The rest are mostly syntax errors that my compiler didn't catch before. Revision ChangesPath 1.41 +8 -15 apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -r1.40 -r1.41 --- http_main.c 1999/02/17 16:28:03 1.40 +++ http_main.c 1999/02/17 18:42:01 1.41 @@ -1521,7 +1521,7 @@ static void graceful_sig_handler(int sig) { requests_this_child = 0; -fprintf(stderr, SigWINCH received in child\n); +ap_max_requests_per_child = 1; } /* @@ -2173,13 +2173,6 @@ * Child process main loop. */ -API_EXPORT(void) ap_child_terminate(request_rec *r) -{ -r-connection-keepalive = 0; -/*requests_this_child = ap_max_requests_per_child = 1; */ -/* ZZZ doesn't really make sense in a threaded server. */ -} - static void process_socket(pool *p, struct sockaddr *sa_client, int csd, int my_child_num, int my_thread_num) { struct sockaddr sa_server; /* */ @@ -2276,7 +2269,8 @@ sock_disable_nagle(sd); */ -while (0 requests_this_child) { +while ((ap_max_requests_per_child != 0 ++requests_this_child 0) || + (ap_max_requests_per_child == 0)) { (void) ap_update_child_status(my_pid, my_tid, SERVER_ACCEPTING, (request_rec *) NULL); /* lock around the accept if necessary */ @@ -2298,10 +2292,9 @@ if (exiting_now == 0) { exiting_now++; pthread_mutex_unlock(exit_mutex); -graceful_killer; +graceful_killer(); clean_child_exit(0); } -fprintf(stderr,thorugh pthread_once\n); pthread_exit(NULL); } @@ -2317,7 +2310,8 @@ free(ti); ptrans = ap_make_sub_pool(pchild); -while (0 requests_this_child) { +while ((ap_max_requests_per_child != 0 ++requests_this_child 0) || + (ap_max_requests_per_child == 0)) { (void) ap_update_child_status(my_pid, my_tid, SERVER_READY, (request_rec *) NULL); @@ -2333,10 +2327,9 @@ if (exiting_now == 0) { exiting_now++; pthread_mutex_unlock(exit_mutex); -graceful_killer; +graceful_killer(); clean_child_exit(0); } -fprintf(stderr,through with pthread_once worker\n); pthread_exit(NULL); } @@ -2819,7 +2812,7 @@ pid = wait_or_timeout(status); if (pid = 0) { -child_slot = find_child_by_pid(0); +child_slot = find_child_by_pid(pid); if (child_slot = 0) { /*(void) ap_update_child_status(child_slot, SERVER_DEAD, (request_rec *) NULL);
cvs commit: apache-apr/pthreads/src/main http_main.c
manoj 99/02/17 12:28:57 Modified:pthreads/src/main http_main.c Log: First, fix unbalanced locking and unlocking of the exit_mutex (which will hopefully go away when we switch to a single signal-handling thread). Also get rid of a malloc-free pair. Revision ChangesPath 1.42 +13 -11apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -u -r1.41 -r1.42 --- http_main.c 1999/02/17 18:42:01 1.41 +++ http_main.c 1999/02/17 20:28:56 1.42 @@ -176,7 +176,7 @@ int ap_listenbacklog; int ap_dump_settings = 0; int exiting_now = 0; -pthread_mutex_t *exit_mutex; +pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER; API_VAR_EXPORT int ap_extended_status = 0; @@ -406,7 +406,6 @@ ap_destroy_pool(pchild); } -free(exit_mutex); exit(code); } @@ -2288,13 +2287,16 @@ } } ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) NULL); -pthread_mutex_lock(exit_mutex); +pthread_mutex_lock(exit_mutex); if (exiting_now == 0) { exiting_now++; - pthread_mutex_unlock(exit_mutex); + pthread_mutex_unlock(exit_mutex); graceful_killer(); clean_child_exit(0); -} +} +else { +pthread_mutex_unlock(exit_mutex); +} pthread_exit(NULL); } @@ -2323,13 +2325,16 @@ } ap_destroy_pool(ptrans); ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) NULL); -pthread_mutex_lock(exit_mutex); +pthread_mutex_lock(exit_mutex); if (exiting_now == 0) { exiting_now++; - pthread_mutex_unlock(exit_mutex); + pthread_mutex_unlock(exit_mutex); graceful_killer(); clean_child_exit(0); -} +} +else { +pthread_mutex_unlock(exit_mutex); +} pthread_exit(NULL); } @@ -2470,9 +2475,6 @@ requests_this_child = ap_max_requests_per_child; pchild = ap_make_sub_pool(pconf); - -exit_mutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); -pthread_mutex_init(exit_mutex, NULL); /*stuff to do before we switch id's, so we have permissions.*/ reopen_scoreboard(pchild);
cvs commit: apache-apr/pthreads/src/main http_main.c
rbb 99/02/17 14:39:44 Modified:pthreads/src/main http_main.c Log: This fixes a stupid mistake I made earlier. Too much coding the last few days Revision ChangesPath 1.43 +2 -2 apache-apr/pthreads/src/main/http_main.c Index: http_main.c === RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- http_main.c 1999/02/17 20:28:56 1.42 +++ http_main.c 1999/02/17 22:39:43 1.43 @@ -2268,7 +2268,7 @@ sock_disable_nagle(sd); */ -while ((ap_max_requests_per_child != 0 ++requests_this_child 0) || +while ((ap_max_requests_per_child != 0 requests_this_child 0) || (ap_max_requests_per_child == 0)) { (void) ap_update_child_status(my_pid, my_tid, SERVER_ACCEPTING, (request_rec *) NULL); @@ -2312,7 +2312,7 @@ free(ti); ptrans = ap_make_sub_pool(pchild); -while ((ap_max_requests_per_child != 0 ++requests_this_child 0) || +while ((ap_max_requests_per_child != 0 requests_this_child 0) || (ap_max_requests_per_child == 0)) { (void) ap_update_child_status(my_pid, my_tid, SERVER_READY, (request_rec *) NULL);
cvs commit: apache-1.3/src/modules/standard mod_log_config.c
coar99/02/17 15:28:20 Modified:htdocs/manual/mod mod_log_config.html src CHANGES src/modules/standard mod_log_config.c Log: Add conditional logging based upon environment variable existence. Also add RefererIgnore functionality from mod_log_referer to mod_log_config; mod_log_referer and mod_log_agent are now deprecated. The list of envariables to check is set up as an array even though the current implementation (TAKE23) only handles one; just in case we ever want to do something strange like, 'env=foo,bar,!bag'. PR: 519, 548, 1351, 1811(?), 3449 Revision ChangesPath 1.29 +133 -10 apache-1.3/htdocs/manual/mod/mod_log_config.html Index: mod_log_config.html === RCS file: /home/cvs/apache-1.3/htdocs/manual/mod/mod_log_config.html,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- mod_log_config.html 1998/09/17 12:33:07 1.28 +++ mod_log_config.html 1999/02/17 23:28:11 1.29 @@ -14,22 +14,23 @@ !--#include virtual=header.html -- H1 ALIGN=CENTERModule mod_log_config/H1 - +P This module is contained in the CODEmod_log_config.c/CODE file, and is compiled in by default in Apache 1.2. mod_log_config replaces mod_log_common in Apache 1.2. Prior to version 1.2, mod_log_config was an optional module. It provides for logging of the requests made to the server, using the Common Log Format or a user-specified format. +/P H2Summary/H2 - +P Three directives are provided by this module: CODETransferLog/CODE to create a log file, CODELogFormat/CODE to set a custom format, and CODECustomLog/CODE to define a log file and format in one go. The CODETransferLog/CODE and CODECustomLog/CODE directives can be used multiple times in each server to cause each request to be logged to multiple files. -P +/P H3Compatibility notes/H3 @@ -45,6 +46,22 @@ CODECookieLog/CODE is deprecated, and a CODECustomLog/CODE should be defined to log user-tracking information instead. +LIAs of Apache 1.3.5, this module allows conditional logging +based upon the setting of environment variables. That is, +you can control whether a request should be logged or not +based upon whether an arbitrary environment variable is +defined or not. This is settable on a EMper/EM-logfile +basis. + +LIBeginning with Apache 1.3.5, the mod_log_config module has +also subsumed the CODERefererIgnore/CODE directive from +A HREF=mod_log_referer.htmlmod_log_referer/A. The use +of CODERefererIgnore/CODE is deprecated, and should be +replaced by combinations of +A HREF=mod_setenvif.htmlCODESetEnvIf/CODE/A directives +and environment variable controlled CODECustomLog/CODE +definitions. + /UL H2Log File Formats/H2 @@ -195,7 +212,9 @@ UL LIA HREF=#cookielogCookieLog/A LIA HREF=#customlogCustomLog/A +LIA HREF=#customlog-conditionalCustomLog (conditional)/A LIA HREF=#logformatLogFormat/A +LIA HREF=#refererignoreRefererIgnore/A LIA HREF=#transferlogTransferLog/A /UL HR @@ -223,8 +242,8 @@ The CookieLog directive sets the filename for logging of cookies. The filename is relative to the A HREF=core.html#serverrootServerRoot/A. This directive is included -only for compatibility with A -HREF=mod_cookies.htmlmod_cookies/A, and is deprecated. +only for compatibility with +A HREF=mod_cookies.htmlmod_cookies/A, and is deprecated. P HR @@ -242,7 +261,10 @@ HREF=directive-dict.html#Status REL=Help STRONGStatus:/STRONG/A BaseBR -STRONGCompatibility: /STRONG Nickname only available in Apache 1.3 +A + HREF=directive-dict.html#Compatibility + REL=Help +STRONGCompatibility:/STRONG/A Nickname only available in Apache 1.3 or later BR A @@ -274,7 +296,58 @@ SAMPLogFormat/SAMP/A directive. /P + HR +H2A NAME=customlog-conditionalCustomLog (conditional)/A/H2 +A + HREF=directive-dict.html#Syntax + REL=Help +STRONGSyntax:/STRONG/A CustomLog EMfile-pipe/EM +EMformat-or-nickname/EM +env=[!]EMenvironment-variable/EMBR +A + HREF=directive-dict.html#Context + REL=Help +STRONGContext:/STRONG/A server config, virtual hostBR +A + HREF=directive-dict.html#Status + REL=Help +STRONGStatus:/STRONG/A BaseBR +A + HREF=directive-dict.html#Compatibility + REL=Help +STRONGCompatibility:/STRONG/A Only available in Apache 1.3.5 +or later +BR +A + HREF=directive-dict.html#Module + REL=Help +STRONGModule:/STRONG/A mod_log_config +P + +The behaviour of this form of the SAMPCustomLog/SAMP directive is almost +identical to the A HREF=#customlogstandard CODECustomLog/CODE/A +directive. The difference is that the 'CODEenv=/CODE' clause controls +whether a