summaryrefslogtreecommitdiffstats
path: root/modules/loggers
diff options
context:
space:
mode:
authorJan Kaluža <jkaluza@apache.org>2013-09-23 16:16:17 +0200
committerJan Kaluža <jkaluza@apache.org>2013-09-23 16:16:17 +0200
commita4330cc11c646471f8fada7c8cf96f1a2d007e76 (patch)
tree97b7ce5562d24b93ad8f2ca90091f909cc3be8f3 /modules/loggers
parentAdd ap_errorlog_provider to make ErrorLog logging modular. Move (diff)
downloadapache2-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.m412
-rw-r--r--modules/loggers/mod_syslog.c157
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,
+};