randy 97/08/24 19:00:43
Modified: src CHANGES
src/main http_core.c http_core.h http_log.c http_log.h
Log:
Add LogLevels functionality through the addition of aplog_error().
This change also provides the ability to log errors via syslogd.
Reviewed by: Dean Gaudet, Jim Jagielski, Ken Coar
Revision Changes Path
1.418 +6 -0 apachen/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apachen/src/CHANGES,v
retrieving revision 1.417
retrieving revision 1.418
diff -u -r1.417 -r1.418
--- CHANGES 1997/08/24 18:46:16 1.417
+++ CHANGES 1997/08/25 02:00:27 1.418
@@ -1,5 +1,11 @@
Changes with Apache 1.3a2
+ *) Add aplog_error() providing a mechanism to define levels of
+ verbosity to the server error logging. This addition also provides
+ the ablity to log errors using syslogd. Error logging is configurable
+ on a per-directory basis using the LogLevel directive. Conversion
+ of log_*() in progress. [Randy Terbush]
+
*) Canonicalise filenames under Win32. Short filenames are
converted to long ones. Backslashes are converted to forward
slashes. Case is converted to lower. Parts of URLs that do not
1.114 +31 -0 apachen/src/main/http_core.c
Index: http_core.c
===================================================================
RCS file: /export/home/cvs/apachen/src/main/http_core.c,v
retrieving revision 1.113
retrieving revision 1.114
diff -u -r1.113 -r1.114
--- http_core.c 1997/08/23 01:52:51 1.113
+++ http_core.c 1997/08/25 02:00:38 1.114
@@ -130,6 +130,8 @@
conf->limit_nproc = NULL;
#endif
+ conf->loglevel = DEFAULT_LOGLEVEL;
+
conf->sec = make_array (a, 2, sizeof(void *));
return (void *)conf;
@@ -1372,6 +1374,34 @@
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
*/
@@ -1498,6 +1528,7 @@
{ "ListenBacklog", set_listenbacklog, NULL, RSRC_CONF, TAKE1, "maximum
length of the queue of pending connections, as used by listen(2)" },
{ "CoreDumpDirectory", set_coredumpdir, NULL, RSRC_CONF, TAKE1, "The
location of the directory Apache changes to before dumping core" },
{ "Include", include_config, NULL, RSRC_CONF, TAKE1, "config file to be
included" },
+{ "LogLevel", set_loglevel, (void*)XtOffsetOf(core_dir_config, loglevel),
OR_ALL, TAKE1, "set level of verbosity in error logging" },
{ NULL },
};
1.28 +3 -0 apachen/src/main/http_core.h
Index: http_core.h
===================================================================
RCS file: /export/home/cvs/apachen/src/main/http_core.h,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- http_core.h 1997/08/23 16:17:12 1.27
+++ http_core.h 1997/08/25 02:00:39 1.28
@@ -189,6 +189,9 @@
struct rlimit *limit_nproc;
#endif
+ /* logging options */
+ int loglevel;
+
/* Access control */
array_header *sec;
regex_t *r;
1.22 +144 -33 apachen/src/main/http_log.c
Index: http_log.c
===================================================================
RCS file: /export/home/cvs/apachen/src/main/http_log.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- http_log.c 1997/07/21 05:53:43 1.21
+++ http_log.c 1997/08/25 02:00:40 1.22
@@ -58,15 +58,52 @@
*/
+#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)
+static TRANS facilities[] = {
+ {"auth", LOG_AUTH},
+ {"authpriv",LOG_AUTHPRIV},
+ {"cron", LOG_CRON},
+ {"daemon", LOG_DAEMON},
+ {"ftp", LOG_FTP},
+ {"kern", LOG_KERN},
+ {"lpr", LOG_LPR},
+ {"mail", LOG_MAIL},
+ {"news", LOG_NEWS},
+ {"syslog", LOG_SYSLOG},
+ {"user", LOG_USER},
+ {"uucp", LOG_UUCP},
+ {"local0", LOG_LOCAL0},
+ {"local1", LOG_LOCAL1},
+ {"local2", LOG_LOCAL2},
+ {"local3", LOG_LOCAL3},
+ {"local4", LOG_LOCAL4},
+ {"local5", LOG_LOCAL5},
+ {"local6", LOG_LOCAL6},
+ {"local7", LOG_LOCAL7},
+ {NULL, -1},
+};
+
+static TRANS priorities[] = {
+ {"emerg", APLOG_EMERG},
+ {"alert", APLOG_ALERT},
+ {"crit", APLOG_CRIT},
+ {"error", APLOG_ERR},
+ {"warn", APLOG_WARNING},
+ {"notice", APLOG_NOTICE},
+ {"info", APLOG_INFO},
+ {"debug", APLOG_DEBUG},
+ {NULL, -1},
+};
+
+static int error_log_child (void *cmd)
{
/* Child process code for 'ErrorLog "|..."';
* may want a common framework for this, since I expect it will
@@ -92,29 +129,47 @@
return(child_pid);
}
-void open_error_log(server_rec *s, pool *p)
+void open_error_log (server_rec *s, pool *p)
{
char *fname;
-
- fname = server_root_relative (p, s->error_fname);
+ register TRANS *fac;
+
if (*s->error_fname == '|') {
- FILE *dummy;
+ FILE *dummy;
+
+ if (!spawn_child (p, error_log_child, (void *)(s->error_fname+1),
+ kill_after_timeout, &dummy, NULL)) {
+ perror ("spawn_child");
+ fprintf (stderr, "Couldn't fork child for ErrorLog process\n");
+ exit (1);
+ }
- if (!spawn_child (p, error_log_child, (void *)(s->error_fname+1),
- kill_after_timeout, &dummy, NULL)) {
- perror ("spawn_child");
- fprintf (stderr, "Couldn't fork child for ErrorLog process\n");
- exit (1);
- }
+ s->error_log = dummy;
+ }
+ else if (!strncasecmp(s->error_fname, "syslog", 6)) {
+ if ((fname = strchr(s->error_fname, ':'))) {
+ fname++;
+ for (fac = facilities; fac->t_name; fac++) {
+ if (!strcasecmp(fname, fac->t_name)) {
+ openlog("httpd", LOG_NDELAY|LOG_CONS|LOG_PID, fac->t_val);
+ s->error_log = NULL;
+ return;
+ }
+ }
+ }
+ else
+ openlog("httpd", LOG_NDELAY|LOG_CONS|LOG_PID, LOG_LOCAL7);
- s->error_log = dummy;
- } else {
+ s->error_log = NULL;
+ }
+ else {
+ fname = server_root_relative (p, s->error_fname);
if(!(s->error_log = pfopen(p, fname, "a"))) {
perror("fopen");
fprintf(stderr,"httpd: could not open error log file %s.\n",
fname);
exit(1);
- }
+ }
}
}
@@ -139,12 +194,67 @@
}
}
-API_EXPORT(void) error_log2stderr(server_rec *s) {
+API_EXPORT(void) error_log2stderr (server_rec *s) {
if(fileno(s->error_log) != STDERR_FILENO)
dup2(fileno(s->error_log),STDERR_FILENO);
}
-void log_pid(pool *p, char *pid_fname) {
+API_EXPORT(void) aplog_error (const char *file, int line, int level,
+ const request_rec *r, const char *fmt, ...)
+{
+ core_dir_config *conf;
+ va_list args;
+ char errstr[MAX_STRING_LEN];
+ static TRANS *pname = priorities;
+
+
+ if (r != NULL) { /* backward compatibilty for historic logging functions
*/
+ conf = get_module_config(r->per_dir_config, &core_module);
+
+ if (level > conf->loglevel)
+ return;
+
+ switch (conf->loglevel) {
+ case APLOG_DEBUG:
+ ap_snprintf(errstr, sizeof(errstr), "[%s] %d: %s: %s: %d: ",
+ pname[level].t_name, errno, strerror(errno), file,
line);
+ break;
+ case APLOG_EMERG:
+ case APLOG_CRIT:
+ case APLOG_ALERT:
+ ap_snprintf(errstr, sizeof(errstr), "[%s] %d: %s: ",
+ pname[level].t_name, errno, strerror(errno));
+ break;
+ case APLOG_INFO:
+ case APLOG_ERR:
+ case APLOG_WARNING:
+ case APLOG_NOTICE:
+ ap_snprintf(errstr, sizeof(errstr), "[%s]", pname[level].t_name);
+ break;
+ }
+ }
+ else
+ ap_snprintf(errstr, sizeof(errstr), "[%s]", pname[level].t_name);
+
+ va_start(args, fmt);
+
+ /* NULL if we are logging to syslog */
+ if (r->server->error_log) {
+ fprintf(r->server->error_log, "[%s] %s", get_time(), errstr);
+ vfprintf(r->server->error_log, fmt, args);
+ fflush(r->server->error_log);
+ }
+ else {
+ if (errstr)
+ syslog(level, "%s", errstr);
+
+ vsyslog(level, fmt, args);
+ }
+
+ va_end(args);
+}
+
+void log_pid (pool *p, char *pid_fname) {
FILE *pid_file;
if (!pid_fname) return;
@@ -158,13 +268,14 @@
fclose(pid_file);
}
-API_EXPORT(void) log_error(const char *err, server_rec *s) {
+API_EXPORT(void) log_error (const char *err, server_rec *s)
+{
fprintf(s->error_log, "[%s] %s\n",get_time(),err);
fflush(s->error_log);
}
-API_EXPORT(void) log_unixerr(const char *routine, const char *file,
- const char *msg, server_rec *s)
+API_EXPORT(void) log_unixerr (const char *routine, const char *file,
+ const char *msg, server_rec *s)
{
const char *p, *q;
FILE *err=s ? s->error_log : stderr;
@@ -181,33 +292,33 @@
fflush(err);
}
-API_EXPORT(void) log_printf(const server_rec *s, const char *fmt, ...)
+API_EXPORT(void) log_printf (const server_rec *s, const char *fmt, ...)
{
va_list args;
fprintf(s->error_log, "[%s] ", get_time());
- va_start (args, fmt);
- vfprintf (s->error_log, fmt, args);
- va_end (args);
+ va_start(args, fmt);
+ vfprintf(s->error_log, fmt, args);
+ va_end(args);
fputc('\n', s->error_log);
fflush(s->error_log);
}
-API_EXPORT(void) log_reason(const char *reason, const char *file,
request_rec *r)
+API_EXPORT(void) log_reason (const char *reason, const char *file,
request_rec *r)
{
- fprintf (r->server->error_log,
- "[%s] access to %s failed for %s, reason: %s\n",
- get_time(), file,
- get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME),
- reason);
- fflush (r->server->error_log);
+ fprintf(r->server->error_log,
+ "[%s] access to %s failed for %s, reason: %s\n",
+ get_time(), file,
+ get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME),
+ reason);
+ fflush(r->server->error_log);
}
-API_EXPORT(void) log_assert(const char *szExp, const char *szFile, int nLine)
+API_EXPORT(void) log_assert (const char *szExp, const char *szFile, int
nLine)
{
fprintf(stderr, "[%s] file %s, line %d, assertion \"%s\" failed\n",
- get_time(), szFile, nLine, szExp);
+ get_time(), szFile, nLine, szExp);
#ifndef WIN32
/* unix assert does an abort leading to a core dump */
abort();
1.11 +18 -0 apachen/src/main/http_log.h
Index: http_log.h
===================================================================
RCS file: /export/home/cvs/apachen/src/main/http_log.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- http_log.h 1997/07/21 05:53:43 1.10
+++ http_log.h 1997/08/25 02:00:40 1.11
@@ -50,7 +50,25 @@
*
*/
+#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 */
+#define DEFAULT_LOGLEVEL APLOG_ERR
+#define APLOG_MARK __FILE__,__LINE__
+
+typedef struct _trans {
+ char *t_name;
+ int t_val;
+} TRANS;
+
void open_logs (server_rec *, pool *p);
+API_EXPORT(void) aplog_error(const char *file, int line, int level,
+ const request_rec *r, const char *fmt, ...);
API_EXPORT(void) error_log2stderr (server_rec *);
void log_pid (pool *p, char *fname);