diff options
author | Jan Kaluža <jkaluza@apache.org> | 2013-09-23 16:16:17 +0200 |
---|---|---|
committer | Jan Kaluža <jkaluza@apache.org> | 2013-09-23 16:16:17 +0200 |
commit | a4330cc11c646471f8fada7c8cf96f1a2d007e76 (patch) | |
tree | 97b7ce5562d24b93ad8f2ca90091f909cc3be8f3 /modules/loggers | |
parent | Add ap_errorlog_provider to make ErrorLog logging modular. Move (diff) | |
download | apache2-a4330cc11c646471f8fada7c8cf96f1a2d007e76.tar.xz apache2-a4330cc11c646471f8fada7c8cf96f1a2d007e76.zip |
mod_syslog: New module implementing syslog ap_error_log provider.
Previously, this code was part of core, now it's in separate module.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1525600 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/loggers')
-rw-r--r-- | modules/loggers/config.m4 | 12 | ||||
-rw-r--r-- | modules/loggers/mod_syslog.c | 157 |
2 files changed, 168 insertions, 1 deletions
diff --git a/modules/loggers/config.m4 b/modules/loggers/config.m4 index 762e773e94..58ad35f72e 100644 --- a/modules/loggers/config.m4 +++ b/modules/loggers/config.m4 @@ -3,7 +3,17 @@ dnl modules enabled in this directory by default dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) APACHE_MODPATH_INIT(loggers) - + +APACHE_MODULE(syslog, logging to syslog, , , all, [ + AC_CHECK_HEADERS(syslog.h, [ap_HAVE_SYSLOG_H="yes"], [ap_HAVE_SYSLOG_H="no"]) + if test $ap_HAVE_SYSLOG_H = "no"; then + AC_MSG_WARN([Your system does not support syslog.]) + enable_syslog="no" + else + enable_syslog="yes" + fi +]) + APACHE_MODULE(log_config, logging configuration. You won't be able to log requests to the server without this module., , , yes) APACHE_MODULE(log_debug, configurable debug logging, , , most) APACHE_MODULE(log_forensic, forensic logging) diff --git a/modules/loggers/mod_syslog.c b/modules/loggers/mod_syslog.c new file mode 100644 index 0000000000..6ab703d158 --- /dev/null +++ b/modules/loggers/mod_syslog.c @@ -0,0 +1,157 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <stdint.h> +#include <ap_config.h> +#include "ap_mpm.h" +#include "ap_provider.h" +#include <http_core.h> +#include <httpd.h> +#include <http_log.h> +#include <http_main.h> +#include <apr_version.h> +#include <apr_pools.h> +#include <apr_strings.h> +#include "unixd.h" +#include "scoreboard.h" +#include "mpm_common.h" + +#include "syslog.h" + +#if APR_HAVE_UNISTD_H +#include <unistd.h> +#endif + +typedef struct { + const char *t_name; + int t_val; +} TRANS; + +static const TRANS facilities[] = { + {"auth", LOG_AUTH}, +#ifdef LOG_AUTHPRIV + {"authpriv",LOG_AUTHPRIV}, +#endif +#ifdef LOG_CRON + {"cron", LOG_CRON}, +#endif +#ifdef LOG_DAEMON + {"daemon", LOG_DAEMON}, +#endif +#ifdef LOG_FTP + {"ftp", LOG_FTP}, +#endif +#ifdef LOG_KERN + {"kern", LOG_KERN}, +#endif +#ifdef LOG_LPR + {"lpr", LOG_LPR}, +#endif +#ifdef LOG_MAIL + {"mail", LOG_MAIL}, +#endif +#ifdef LOG_NEWS + {"news", LOG_NEWS}, +#endif +#ifdef LOG_SYSLOG + {"syslog", LOG_SYSLOG}, +#endif +#ifdef LOG_USER + {"user", LOG_USER}, +#endif +#ifdef LOG_UUCP + {"uucp", LOG_UUCP}, +#endif +#ifdef LOG_LOCAL0 + {"local0", LOG_LOCAL0}, +#endif +#ifdef LOG_LOCAL1 + {"local1", LOG_LOCAL1}, +#endif +#ifdef LOG_LOCAL2 + {"local2", LOG_LOCAL2}, +#endif +#ifdef LOG_LOCAL3 + {"local3", LOG_LOCAL3}, +#endif +#ifdef LOG_LOCAL4 + {"local4", LOG_LOCAL4}, +#endif +#ifdef LOG_LOCAL5 + {"local5", LOG_LOCAL5}, +#endif +#ifdef LOG_LOCAL6 + {"local6", LOG_LOCAL6}, +#endif +#ifdef LOG_LOCAL7 + {"local7", LOG_LOCAL7}, +#endif + {NULL, -1}, +}; + + +static void *syslog_error_log_init(apr_pool_t *p, server_rec *s) +{ + char *fname = s->error_fname; + if (*fname == '\0') { + openlog(ap_server_argv0, LOG_NDELAY|LOG_CONS|LOG_PID, LOG_LOCAL7); + } + else { + const TRANS *fac; + + for (fac = facilities; fac->t_name; fac++) { + if (!strcasecmp(fname, fac->t_name)) { + openlog(ap_server_argv0, LOG_NDELAY|LOG_CONS|LOG_PID, + fac->t_val); + return NULL; + } + } + } + + return NULL; +} + +static apr_status_t syslog_error_log(const ap_errorlog_info *info, + void *handle, const char *errstr, int len) +{ + int level = info->level; + syslog(level < LOG_PRIMASK ? level : APLOG_DEBUG, "%.*s", (int)len, errstr); + return APR_SUCCESS; +} + + +static void syslog_register_hooks(apr_pool_t *p) +{ + static const ap_errorlog_provider syslog_provider = { + &syslog_error_log_init, + &syslog_error_log + }; + + ap_register_provider(p, AP_ERRORLOG_PROVIDER_GROUP, "syslog", + AP_ERRORLOG_PROVIDER_VERSION, &syslog_provider); +} + +AP_DECLARE_MODULE(syslog) = +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + NULL, + NULL, + NULL, + syslog_register_hooks, +}; |