summaryrefslogtreecommitdiff
path: root/ndb/src/common/logger/SysLogHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ndb/src/common/logger/SysLogHandler.cpp')
-rw-r--r--ndb/src/common/logger/SysLogHandler.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/ndb/src/common/logger/SysLogHandler.cpp b/ndb/src/common/logger/SysLogHandler.cpp
new file mode 100644
index 00000000000..f3511bf5638
--- /dev/null
+++ b/ndb/src/common/logger/SysLogHandler.cpp
@@ -0,0 +1,159 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include "SysLogHandler.hpp"
+
+#include <syslog.h>
+#include <NdbString.h>
+
+//
+// PUBLIC
+//
+
+SysLogHandler::SysLogHandler() :
+ m_severity(LOG_INFO),
+ m_pIdentity("NDB"),
+ m_facility(LOG_USER)
+{
+}
+
+SysLogHandler::SysLogHandler(const char* pIdentity, int facility) :
+ m_severity(LOG_INFO),
+ m_pIdentity(pIdentity),
+ m_facility(facility)
+{
+
+}
+
+SysLogHandler::~SysLogHandler()
+{
+}
+
+bool
+SysLogHandler::open()
+{
+ ::setlogmask(LOG_UPTO(LOG_DEBUG)); // Log from EMERGENCY down to DEBUG
+ ::openlog(m_pIdentity, LOG_PID|LOG_CONS|LOG_ODELAY, m_facility); // PID, CONSOLE delay openlog
+
+ return true;
+}
+
+bool
+SysLogHandler::close()
+{
+ ::closelog();
+
+ return true;
+}
+
+void
+SysLogHandler::writeHeader(const char* pCategory, Logger::LoggerLevel level)
+{
+ // Save category to be used by writeMessage...
+ m_pCategory = pCategory;
+ // Map LogLevel to syslog severity
+ switch (level)
+ {
+ case Logger::LL_ALERT:
+ m_severity = LOG_ALERT;
+ break;
+ case Logger::LL_CRITICAL:
+ m_severity = LOG_CRIT;
+ break;
+ case Logger::LL_ERROR:
+ m_severity = LOG_ERR;
+ break;
+ case Logger::LL_WARNING:
+ m_severity = LOG_WARNING;
+ break;
+ case Logger::LL_INFO:
+ m_severity = LOG_INFO;
+ break;
+ case Logger::LL_DEBUG:
+ m_severity = LOG_DEBUG;
+ break;
+ default:
+ m_severity = LOG_INFO;
+ break;
+ }
+
+}
+
+void
+SysLogHandler::writeMessage(const char* pMsg)
+{
+ ::syslog(m_facility | m_severity, "[%s] %s", m_pCategory, pMsg);
+}
+
+void
+SysLogHandler::writeFooter()
+{
+ // Need to close it everytime? Do we run out of file descriptors?
+ //::closelog();
+}
+
+bool
+SysLogHandler::setParam(const BaseString &param, const BaseString &value) {
+ if(param == "facility") {
+ return setFacility(value);
+ }
+ return false;
+}
+
+static const struct syslog_facility {
+ char *name;
+ int value;
+} facilitynames[] = {
+ { "auth", LOG_AUTH },
+#ifdef LOG_AUTHPRIV
+ { "authpriv", LOG_AUTHPRIV },
+#endif
+ { "cron", LOG_CRON },
+ { "daemon", LOG_DAEMON },
+#ifdef LOG_FTP
+ { "ftp", LOG_FTP },
+#endif
+ { "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 }
+};
+
+bool
+SysLogHandler::setFacility(const BaseString &facility) {
+ const struct syslog_facility *c;
+ for(c = facilitynames; c->name != NULL; c++) {
+ if(facility == c->name) {
+ m_facility = c->value;
+ close();
+ open();
+ return true;
+ }
+ }
+ return false;
+}