]> granicus.if.org Git - apache/commitdiff
mod_syslog: New module implementing syslog ap_error_log provider.
authorJan Kaluža <jkaluza@apache.org>
Mon, 23 Sep 2013 14:16:17 +0000 (14:16 +0000)
committerJan Kaluža <jkaluza@apache.org>
Mon, 23 Sep 2013 14:16:17 +0000 (14:16 +0000)
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

CHANGES
docs/manual/mod/mod_syslog.xml [new file with mode: 0644]
docs/manual/mod/mod_syslog.xml.meta [new file with mode: 0644]
modules/loggers/config.m4
modules/loggers/mod_syslog.c [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index f27e513044b563643d04e679fee4aa2f9f289379..89018a0f86abab04315810962789974c8aa9b4c9 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.0
 
+  *) mod_syslog: New module implementing syslog ap_error_log provider.
+     Previously, this code was part of core, now it's in separate module.
+     [Jan Kaluza]
+
   *) core: Add ap_errorlog_provider to make ErrorLog logging modular. Move
      syslog support from core to new mod_syslog. [Jan Kaluza]
 
diff --git a/docs/manual/mod/mod_syslog.xml b/docs/manual/mod/mod_syslog.xml
new file mode 100644 (file)
index 0000000..a463ab0
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
+<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
+<!-- $LastChangedRevision: 981084 $ -->
+
+<!--
+ 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.
+-->
+
+<modulesynopsis metafile="mod_syslog.xml.meta">
+
+<name>mod_syslog</name>
+<description>Provides "syslog" ErrorLog provider</description>
+<status>Extension</status>
+<sourcefile>mod_syslog.c</sourcefile>
+<identifier>syslog_module</identifier>
+
+<summary>
+
+    <p>This module provides "syslog" ErrorLog provider. It allows logging
+    error messages via syslogd(8).</p>
+</summary>
+
+<section id="examples">
+    <title>Examples</title>
+
+    <p>Using <code>syslog</code> in ErrorLog directive (see <module>core</module>)
+    instead of a filename enables logging via syslogd(8) if the system supports it.
+    The default is to use syslog facility <code>local7</code>,
+    but you can override this by using the <code>syslog:<var>facility</var></code>
+    syntax where <var>facility</var> can be one of the names usually documented in
+    syslog(1).  The facility is effectively global, and if it is changed
+    in individual virtual hosts, the final facility specified affects the
+    entire server.</p>
+    
+    <highlight language="config">ErrorLog syslog:user</highlight>
+
+</section>
+
+
+</modulesynopsis>
diff --git a/docs/manual/mod/mod_syslog.xml.meta b/docs/manual/mod/mod_syslog.xml.meta
new file mode 100644 (file)
index 0000000..cb174b3
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!-- GENERATED FROM XML: DO NOT EDIT -->
+
+<metafile reference="mod_syslog.xml">
+  <basename>mod_syslog</basename>
+  <path>/mod/</path>
+  <relpath>..</relpath>
+
+  <variants>
+    <variant>en</variant>
+  </variants>
+</metafile>
index 762e773e9456f74c594ac4b48f7288863a2585f4..58ad35f72e40d7ff8a9a1bdccfc261685a6696b6 100644 (file)
@@ -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 (file)
index 0000000..6ab703d
--- /dev/null
@@ -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,
+};