summaryrefslogtreecommitdiff
path: root/storage/ndb/src/common/logger/Logger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/common/logger/Logger.cpp')
-rw-r--r--storage/ndb/src/common/logger/Logger.cpp369
1 files changed, 369 insertions, 0 deletions
diff --git a/storage/ndb/src/common/logger/Logger.cpp b/storage/ndb/src/common/logger/Logger.cpp
new file mode 100644
index 00000000000..7f18f5bd3ec
--- /dev/null
+++ b/storage/ndb/src/common/logger/Logger.cpp
@@ -0,0 +1,369 @@
+/* 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 <ndb_global.h>
+
+#include "Logger.hpp"
+
+#include <LogHandler.hpp>
+#include <ConsoleLogHandler.hpp>
+#include <FileLogHandler.hpp>
+#include "LogHandlerList.hpp"
+
+#if !defined NDB_OSE || !defined NDB_SOFTOSE || !defined NDB_WIN32
+#include <SysLogHandler.hpp>
+#endif
+
+//
+// PUBLIC
+//
+const char* Logger::LoggerLevelNames[] = { "ON ",
+ "DEBUG ",
+ "INFO ",
+ "WARNING ",
+ "ERROR ",
+ "CRITICAL",
+ "ALERT ",
+ "ALL "
+ };
+Logger::Logger() :
+ m_pCategory("Logger"),
+ m_pConsoleHandler(NULL),
+ m_pFileHandler(NULL),
+ m_pSyslogHandler(NULL)
+{
+ m_pHandlerList = new LogHandlerList();
+ disable(LL_ALL);
+ enable(LL_ON);
+ enable(LL_INFO);
+}
+
+Logger::~Logger()
+{
+ removeAllHandlers();
+ delete m_pHandlerList;
+}
+
+void
+Logger::setCategory(const char* pCategory)
+{
+ m_pCategory = pCategory;
+}
+
+bool
+Logger::createConsoleHandler()
+{
+ bool rc = true;
+ if (m_pConsoleHandler == NULL)
+ {
+ m_pConsoleHandler = new ConsoleLogHandler();
+ if (!addHandler(m_pConsoleHandler)) // TODO: check error code
+ {
+ rc = false;
+ delete m_pConsoleHandler;
+ m_pConsoleHandler = NULL;
+ }
+ }
+
+ return rc;
+}
+
+void
+Logger::removeConsoleHandler()
+{
+ if (removeHandler(m_pConsoleHandler))
+ {
+ m_pConsoleHandler = NULL;
+ }
+}
+
+bool
+Logger::createFileHandler()
+{
+ bool rc = true;
+ if (m_pFileHandler == NULL)
+ {
+ m_pFileHandler = new FileLogHandler();
+ if (!addHandler(m_pFileHandler)) // TODO: check error code
+ {
+ rc = false;
+ delete m_pFileHandler;
+ m_pFileHandler = NULL;
+ }
+ }
+
+ return rc;
+}
+
+void
+Logger::removeFileHandler()
+{
+ if (removeHandler(m_pFileHandler))
+ {
+ m_pFileHandler = NULL;
+ }
+}
+
+bool
+Logger::createSyslogHandler()
+{
+ bool rc = true;
+ if (m_pSyslogHandler == NULL)
+ {
+#if defined NDB_OSE || defined NDB_SOFTOSE || defined NDB_WIN32
+ m_pSyslogHandler = new ConsoleLogHandler();
+#else
+ m_pSyslogHandler = new SysLogHandler();
+#endif
+ if (!addHandler(m_pSyslogHandler)) // TODO: check error code
+ {
+ rc = false;
+ delete m_pSyslogHandler;
+ m_pSyslogHandler = NULL;
+ }
+ }
+
+ return rc;
+}
+
+void
+Logger::removeSyslogHandler()
+{
+ if (removeHandler(m_pSyslogHandler))
+ {
+ m_pSyslogHandler = NULL;
+ }
+}
+
+bool
+Logger::addHandler(LogHandler* pHandler)
+{
+ assert(pHandler != NULL);
+
+ bool rc = pHandler->open();
+ if (rc)
+ {
+ m_pHandlerList->add(pHandler);
+ }
+ else
+ {
+ delete pHandler;
+ }
+
+ return rc;
+}
+
+bool
+Logger::addHandler(const BaseString &logstring) {
+ size_t i;
+ Vector<BaseString> logdest;
+ Vector<LogHandler *>loghandlers;
+ DBUG_ENTER("Logger::addHandler");
+
+ logstring.split(logdest, ";");
+
+ for(i = 0; i < logdest.size(); i++) {
+ DBUG_PRINT("info",("adding: %s",logdest[i].c_str()));
+
+ Vector<BaseString> v_type_args;
+ logdest[i].split(v_type_args, ":", 2);
+
+ BaseString type(v_type_args[0]);
+ BaseString params;
+ if(v_type_args.size() >= 2)
+ params = v_type_args[1];
+
+ LogHandler *handler = NULL;
+
+#ifndef NDB_WIN32
+ if(type == "SYSLOG")
+ {
+ handler = new SysLogHandler();
+ } else
+#endif
+ if(type == "FILE")
+ handler = new FileLogHandler();
+ else if(type == "CONSOLE")
+ handler = new ConsoleLogHandler();
+
+ if(handler == NULL)
+ DBUG_RETURN(false);
+ if(!handler->parseParams(params))
+ DBUG_RETURN(false);
+ loghandlers.push_back(handler);
+ }
+
+ for(i = 0; i < loghandlers.size(); i++)
+ addHandler(loghandlers[i]);
+
+ DBUG_RETURN(true); /* @todo handle errors */
+}
+
+bool
+Logger::removeHandler(LogHandler* pHandler)
+{
+ int rc = false;
+ if (pHandler != NULL)
+ {
+ rc = m_pHandlerList->remove(pHandler);
+ }
+
+ return rc;
+}
+
+void
+Logger::removeAllHandlers()
+{
+ m_pHandlerList->removeAll();
+}
+
+bool
+Logger::isEnable(LoggerLevel logLevel) const
+{
+ if (logLevel == LL_ALL)
+ {
+ for (unsigned i = 1; i < MAX_LOG_LEVELS; i++)
+ if (!m_logLevels[i])
+ return false;
+ return true;
+ }
+ return m_logLevels[logLevel];
+}
+
+void
+Logger::enable(LoggerLevel logLevel)
+{
+ if (logLevel == LL_ALL)
+ {
+ for (unsigned i = 0; i < MAX_LOG_LEVELS; i++)
+ {
+ m_logLevels[i] = true;
+ }
+ }
+ else
+ {
+ m_logLevels[logLevel] = true;
+ }
+}
+
+void
+Logger::enable(LoggerLevel fromLogLevel, LoggerLevel toLogLevel)
+{
+ if (fromLogLevel > toLogLevel)
+ {
+ LoggerLevel tmp = toLogLevel;
+ toLogLevel = fromLogLevel;
+ fromLogLevel = tmp;
+ }
+
+ for (int i = fromLogLevel; i <= toLogLevel; i++)
+ {
+ m_logLevels[i] = true;
+ }
+}
+
+void
+Logger::disable(LoggerLevel logLevel)
+{
+ if (logLevel == LL_ALL)
+ {
+ for (unsigned i = 0; i < MAX_LOG_LEVELS; i++)
+ {
+ m_logLevels[i] = false;
+ }
+ }
+ else
+ {
+ m_logLevels[logLevel] = false;
+ }
+}
+
+void
+Logger::alert(const char* pMsg, ...) const
+{
+ va_list ap;
+ va_start(ap, pMsg);
+ log(LL_ALERT, pMsg, ap);
+ va_end(ap);
+}
+
+void
+Logger::critical(const char* pMsg, ...) const
+{
+ va_list ap;
+ va_start(ap, pMsg);
+ log(LL_CRITICAL, pMsg, ap);
+ va_end(ap);
+}
+void
+Logger::error(const char* pMsg, ...) const
+{
+ va_list ap;
+ va_start(ap, pMsg);
+ log(LL_ERROR, pMsg, ap);
+ va_end(ap);
+}
+void
+Logger::warning(const char* pMsg, ...) const
+{
+ va_list ap;
+ va_start(ap, pMsg);
+ log(LL_WARNING, pMsg, ap);
+ va_end(ap);
+}
+
+void
+Logger::info(const char* pMsg, ...) const
+{
+ va_list ap;
+ va_start(ap, pMsg);
+ log(LL_INFO, pMsg, ap);
+ va_end(ap);
+}
+
+void
+Logger::debug(const char* pMsg, ...) const
+{
+ va_list ap;
+ va_start(ap, pMsg);
+ log(LL_DEBUG, pMsg, ap);
+ va_end(ap);
+}
+
+//
+// PROTECTED
+//
+
+void
+Logger::log(LoggerLevel logLevel, const char* pMsg, va_list ap) const
+{
+ if (m_logLevels[LL_ON] && m_logLevels[logLevel])
+ {
+ LogHandler* pHandler = NULL;
+ while ( (pHandler = m_pHandlerList->next()) != NULL)
+ {
+ char buf[MAX_LOG_MESSAGE_SIZE];
+ BaseString::vsnprintf(buf, sizeof(buf), pMsg, ap);
+ pHandler->append(m_pCategory, logLevel, buf);
+ }
+ }
+}
+
+//
+// PRIVATE
+//
+
+template class Vector<LogHandler*>;