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);
  
  
  

Reply via email to