You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Randy Terbush <ra...@zyzzyva.com> on 1997/07/12 08:57:30 UTC
[PATCH] loglevels
New attempt below. I'm tired and this is lightly tested, so be
nice. Biggest difference from the previous attempt is that I have
added support for error logging via syslog if ErrorLog is set to
'syslog' in the config files. Level definitions follows syslog as
well. I have also left the old log routines untouched thus far.
Problem: What do you suggest that we do about compatibility for the
old routines? Since ap_log() is configurable on a per directory
basis, I need a request_rec *. Is there a way to get at the
per_dir_config from a server_rec that I am forgetting about?
I've included only one example in the patch where a log_reason is
replaced with ap_log().
Comments please.
Index: http_core.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_core.c,v
retrieving revision 1.92
diff -c -c -r1.92 http_core.c
*** http_core.c 1997/07/08 04:45:27 1.92
--- http_core.c 1997/07/12 06:41:08
***************
*** 107,112 ****
--- 107,114 ----
conf->limit_nproc = NULL;
#endif
+ conf->loglevel = DEFAULT_LOGLEVEL;
+
conf->sec = make_array (a, 2, sizeof(void *));
return (void *)conf;
***************
*** 1197,1202 ****
--- 1199,1232 ----
return NULL;
}
+ const char *set_loglevel (cmd_parms *cmd, core_dir_config *conf, const char *arg)
+ {
+ char *str;
+
+ if ((str = getword_conf(cmd->pool, &arg))) {
+ if (!strcasecmp(str, "emerg"))
+ conf->loglevel = APLOG_EMERG;
+ else if (!strcasecmp(str, "alert"))
+ conf->loglevel = APLOG_ALERT;
+ else if (!strcasecmp(str, "crit"))
+ conf->loglevel = APLOG_CRIT;
+ else if (!strcasecmp(str, "error"))
+ conf->loglevel = APLOG_ERR;
+ else if (!strcasecmp(str, "warn"))
+ conf->loglevel = APLOG_WARNING;
+ else if (!strcasecmp(str, "notice"))
+ conf->loglevel = APLOG_NOTICE;
+ else if (!strcasecmp(str, "info"))
+ conf->loglevel = APLOG_INFO;
+ else if (!strcasecmp(str, "debug"))
+ conf->loglevel = APLOG_DEBUG;
+ }
+ else
+ return "LogLevel requires level keyword";
+
+ return NULL;
+ }
+
/* Note --- ErrorDocument will now work from .htaccess files.
* The AllowOverride of Fileinfo allows webmasters to turn it off
*/
***************
*** 1321,1326 ****
--- 1351,1357 ----
{ "ThreadsPerChild", set_threads, NULL, RSRC_CONF, TAKE1, "Number of threads a child creates" },
{ "ExcessRequestsPerChild", set_excess_requests, NULL, RSRC_CONF, TAKE1, "Maximum number of requests a particular child serves after it is ready to die." },
{ "ListenBacklog", set_listenbacklog, NULL, RSRC_CONF, TAKE1, "maximum length of the queue of pending connections, as used by listen(2)" },
+ { "LogLevel", set_loglevel, (void*)XtOffsetOf(core_dir_config, loglevel), OR_ALL, TAKE1, "set level of verbosity in error logging" },
{ NULL },
};
***************
*** 1382,1390 ****
if (r->method_number == M_PUT) return METHOD_NOT_ALLOWED;
if (r->finfo.st_mode == 0 || (r->path_info && *r->path_info)) {
! log_reason("File does not exist",
! r->path_info ? pstrcat(r->pool, r->filename, r->path_info, NULL)
! : r->filename, r);
return NOT_FOUND;
}
if (r->method_number != M_GET) return METHOD_NOT_ALLOWED;
--- 1413,1421 ----
if (r->method_number == M_PUT) return METHOD_NOT_ALLOWED;
if (r->finfo.st_mode == 0 || (r->path_info && *r->path_info)) {
! ap_log(APLOG_INFO, r, NULL,
! r->path_info ? pstrcat(r->pool, r->filename, r->path_info, NULL)
! : r->filename, "File does not exist");
return NOT_FOUND;
}
if (r->method_number != M_GET) return METHOD_NOT_ALLOWED;
Index: http_core.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_core.h,v
retrieving revision 1.21
diff -c -c -r1.21 http_core.h
*** http_core.h 1997/06/29 17:53:04 1.21
--- http_core.h 1997/07/12 06:41:08
***************
*** 179,184 ****
--- 179,187 ----
struct rlimit *limit_nproc;
#endif
+ /* logging options */
+ int loglevel;
+
/* Access control */
array_header *sec;
regex_t *r;
Index: http_log.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_log.c,v
retrieving revision 1.18
diff -c -c -r1.18 http_log.c
*** http_log.c 1997/06/29 19:19:35 1.18
--- http_log.c 1997/07/12 06:41:10
***************
*** 58,69 ****
--- 58,71 ----
*/
+ #define CORE_PRIVATE
#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_log.h"
#include <stdarg.h>
+ #include <syslog.h>
static int
error_log_child (void *cmd)
***************
*** 144,149 ****
--- 146,231 ----
dup2(fileno(s->error_log),STDERR_FILENO);
}
+ void ap_log(int level, const request_rec *r, const char *routine,
+ const char *file, const char *fmt, ...)
+ {
+ int logfile;
+ core_dir_config *conf;
+ va_list args;
+ const char *time;
+ char errstr[MAX_STRING_LEN];
+ char varstr[MAX_STRING_LEN];
+
+
+ conf = get_module_config(r->per_dir_config, &core_module);
+
+ if (level <= conf->loglevel)
+ return;
+
+ logfile = strcasecmp(r->server->error_fname, "syslog");
+
+ if (logfile)
+ time = get_time();
+
+ switch (level) {
+ case APLOG_EMERG:
+ case APLOG_DEBUG:
+ case APLOG_CRIT:
+ case APLOG_ALERT:
+ if (file != NULL)
+ if (logfile)
+ ap_snprintf(errstr, sizeof(errstr), "[%s] %s: %s: %s",
+ time, routine, file, strerror(errno));
+ else
+ ap_snprintf(errstr, sizeof(errstr), "%s: %s: %s",
+ routine, file, strerror(errno));
+
+ else
+ if (logfile)
+ ap_snprintf(errstr, sizeof(errstr), "[%s] %s: %s",
+ time, routine, strerror(errno));
+ else
+ ap_snprintf(errstr, sizeof(errstr), "%s: %s",
+ routine, strerror(errno));
+ break;
+ case APLOG_INFO:
+ if (logfile)
+ ap_snprintf(errstr, sizeof(errstr),
+ "[%s] access to %s failed for %s", time, file,
+ get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME));
+ else
+ ap_snprintf(errstr, sizeof(errstr),
+ "access to %s failed for %s", file,
+ get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME));
+
+ break;
+ case APLOG_ERR:
+ case APLOG_WARNING:
+ case APLOG_NOTICE:
+ if (logfile)
+ ap_snprintf(errstr, sizeof(errstr), "[%s]", time);
+ break;
+ }
+
+
+ va_start(args, fmt);
+
+ if (logfile) {
+ fprintf(r->server->error_log, "%s\n[%s]", errstr, time);
+ vfprintf(r->server->error_log, fmt, args);
+ fflush(r->server->error_log);
+ }
+ else {
+ openlog("httpd", LOG_NDELAY|LOG_CONS|LOG_PID, LOG_LOCAL7);
+ if (errstr)
+ syslog(conf->loglevel, "%s", errstr);
+
+ vsyslog(conf->loglevel, fmt, args);
+ }
+
+ va_end(args);
+ }
+
void log_pid(pool *p, char *pid_fname) {
FILE *pid_file;
***************
*** 163,170 ****
fflush(s->error_log);
}
! void
! log_unixerr(const char *routine, const char *file, const char *msg,
server_rec *s)
{
const char *p, *q;
--- 245,252 ----
fflush(s->error_log);
}
!
! void log_unixerr(const char *routine, const char *file, const char *msg,
server_rec *s)
{
const char *p, *q;
***************
*** 182,189 ****
fflush(err);
}
! void
! log_printf(const server_rec *s, const char *fmt, ...)
{
va_list args;
--- 264,270 ----
fflush(err);
}
! void log_printf(const server_rec *s, const char *fmt, ...)
{
va_list args;
Index: http_log.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_log.h,v
retrieving revision 1.7
diff -c -c -r1.7 http_log.h
*** http_log.h 1997/01/01 18:10:19 1.7
--- http_log.h 1997/07/12 06:41:12
***************
*** 50,55 ****
--- 50,65 ----
*
*/
+ #define DEFAULT_LOGLEVEL 3
+ #define APLOG_EMERG 0 /* system is unusable */
+ #define APLOG_ALERT 1 /* action must be taken immediately */
+ #define APLOG_CRIT 2 /* critical conditions */
+ #define APLOG_ERR 3 /* error conditions */
+ #define APLOG_WARNING 4 /* warning conditions */
+ #define APLOG_NOTICE 5 /* normal but significant condition */
+ #define APLOG_INFO 6 /* informational */
+ #define APLOG_DEBUG 7 /* debug-level messages */
+
void open_logs (server_rec *, pool *p);
void error_log2stderr (server_rec *);
***************
*** 59,62 ****
--- 69,75 ----
const char *msg, server_rec *s);
void log_printf(const server_rec *s, const char *fmt, ...);
void log_reason(const char *reason, const char *fname, request_rec *r);
+ void ap_log(int level, const request_rec *r, const char *routine,
+ const char *file, const char *fmt, ...);
+
Re: [PATCH] loglevels
Posted by Dean Gaudet <dg...@arctic.org>.
On Sat, 12 Jul 1997, Randy Terbush wrote:
> + void ap_log(int level, const request_rec *r, const char *routine,
> + const char *file, const char *fmt, ...)
Shouldn't it be just:
void ap_log(int level, const request_rec *r, const char *fmt, ...)
and let the wrappers that use routine/file to specify the appropriate fmt?
> + logfile = strcasecmp(r->server->error_fname, "syslog");
Should be done at init time so that you don't pay for it on each ap_log
call.
> + openlog("httpd", LOG_NDELAY|LOG_CONS|LOG_PID, LOG_LOCAL7);
similarly, do it at init time.
Dean