summaryrefslogtreecommitdiff
path: root/storage/ndb/src/common/logger/LogHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/common/logger/LogHandler.cpp')
-rw-r--r--storage/ndb/src/common/logger/LogHandler.cpp184
1 files changed, 184 insertions, 0 deletions
diff --git a/storage/ndb/src/common/logger/LogHandler.cpp b/storage/ndb/src/common/logger/LogHandler.cpp
new file mode 100644
index 00000000000..ec4137297f1
--- /dev/null
+++ b/storage/ndb/src/common/logger/LogHandler.cpp
@@ -0,0 +1,184 @@
+/* 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 "LogHandler.hpp"
+
+#include <NdbTick.h>
+
+//
+// PUBLIC
+//
+LogHandler::LogHandler() :
+ m_pDateTimeFormat("%d-%.2d-%.2d %.2d:%.2d:%.2d"),
+ m_errorCode(0)
+{
+ m_max_repeat_frequency= 3; // repeat messages maximum every 3 seconds
+ m_count_repeated_messages= 0;
+ m_last_category[0]= 0;
+ m_last_message[0]= 0;
+ m_last_log_time= 0;
+ m_now= 0;
+}
+
+LogHandler::~LogHandler()
+{
+}
+
+void
+LogHandler::append(const char* pCategory, Logger::LoggerLevel level,
+ const char* pMsg)
+{
+ time_t now;
+ now= ::time((time_t*)NULL);
+
+ if (level != m_last_level ||
+ strcmp(pCategory, m_last_category) ||
+ strcmp(pMsg, m_last_message))
+ {
+ if (m_count_repeated_messages > 0) // print that message
+ append_impl(m_last_category, m_last_level, m_last_message);
+
+ m_last_level= level;
+ strncpy(m_last_category, pCategory, sizeof(m_last_category));
+ strncpy(m_last_message, pMsg, sizeof(m_last_message));
+ }
+ else // repeated message
+ {
+ if (now < m_last_log_time+m_max_repeat_frequency)
+ {
+ m_count_repeated_messages++;
+ m_now= now;
+ return;
+ }
+ }
+
+ m_now= now;
+
+ append_impl(pCategory, level, pMsg);
+ m_last_log_time= now;
+}
+
+void
+LogHandler::append_impl(const char* pCategory, Logger::LoggerLevel level,
+ const char* pMsg)
+{
+ writeHeader(pCategory, level);
+ if (m_count_repeated_messages <= 1)
+ writeMessage(pMsg);
+ else
+ {
+ BaseString str(pMsg);
+ str.appfmt(" - Repeated %d times", m_count_repeated_messages);
+ writeMessage(str.c_str());
+ }
+ m_count_repeated_messages= 0;
+ writeFooter();
+}
+
+const char*
+LogHandler::getDefaultHeader(char* pStr, const char* pCategory,
+ Logger::LoggerLevel level) const
+{
+ char time[MAX_DATE_TIME_HEADER_LENGTH];
+ BaseString::snprintf(pStr, MAX_HEADER_LENGTH, "%s [%s] %s -- ",
+ getTimeAsString((char*)time),
+ pCategory,
+ Logger::LoggerLevelNames[level]);
+
+ return pStr;
+}
+
+
+const char*
+LogHandler::getDefaultFooter() const
+{
+ return "\n";
+}
+
+const char*
+LogHandler::getDateTimeFormat() const
+{
+ return m_pDateTimeFormat;
+}
+
+void
+LogHandler::setDateTimeFormat(const char* pFormat)
+{
+ m_pDateTimeFormat = (char*)pFormat;
+}
+
+char*
+LogHandler::getTimeAsString(char* pStr) const
+{
+ struct tm* tm_now;
+#ifdef NDB_WIN32
+ tm_now = localtime(&m_now);
+#else
+ tm_now = ::localtime(&m_now); //uses the "current" timezone
+#endif
+
+ BaseString::snprintf(pStr, MAX_DATE_TIME_HEADER_LENGTH,
+ m_pDateTimeFormat,
+ tm_now->tm_year + 1900,
+ tm_now->tm_mon + 1, //month is [0,11]. +1 -> [1,12]
+ tm_now->tm_mday,
+ tm_now->tm_hour,
+ tm_now->tm_min,
+ tm_now->tm_sec);
+
+ return pStr;
+}
+
+int
+LogHandler::getErrorCode() const
+{
+ return m_errorCode;
+}
+
+void
+LogHandler::setErrorCode(int code)
+{
+ m_errorCode = code;
+}
+
+bool
+LogHandler::parseParams(const BaseString &_params) {
+ Vector<BaseString> v_args;
+
+ bool ret = true;
+
+ _params.split(v_args, ",");
+ for(size_t i=0; i < v_args.size(); i++) {
+ Vector<BaseString> v_param_value;
+ if(v_args[i].split(v_param_value, "=", 2) != 2)
+ ret = false;
+ else if (!setParam(v_param_value[0], v_param_value[1]))
+ ret = false;
+ }
+
+ if(!checkParams())
+ ret = false;
+ return ret;
+}
+
+bool
+LogHandler::checkParams() {
+ return true;
+}
+
+//
+// PRIVATE
+//