LogHandler.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "LogHandler.hpp"
  14. #include <NdbTick.h>
  15. //
  16. // PUBLIC
  17. //
  18. LogHandler::LogHandler() : 
  19.   m_pDateTimeFormat("%d-%.2d-%.2d %.2d:%.2d:%.2d"),
  20.   m_errorCode(0)
  21. {
  22.   m_max_repeat_frequency= 3; // repeat messages maximum every 3 seconds
  23.   m_count_repeated_messages= 0;
  24.   m_last_category[0]= 0;
  25.   m_last_message[0]= 0;
  26.   m_last_log_time= 0;
  27.   m_now= 0;
  28.   m_last_level= (Logger::LoggerLevel)-1;
  29. }
  30. LogHandler::~LogHandler()
  31. {  
  32. }
  33. void 
  34. LogHandler::append(const char* pCategory, Logger::LoggerLevel level,
  35.    const char* pMsg)
  36. {
  37.   time_t now;
  38.   now= ::time((time_t*)NULL);
  39.   if (level != m_last_level ||
  40.       strcmp(pCategory, m_last_category) ||
  41.       strcmp(pMsg, m_last_message))
  42.   {
  43.     if (m_count_repeated_messages > 0) // print that message
  44.       append_impl(m_last_category, m_last_level, m_last_message);
  45.     m_last_level= level;
  46.     strncpy(m_last_category, pCategory, sizeof(m_last_category));
  47.     strncpy(m_last_message, pMsg, sizeof(m_last_message));
  48.   }
  49.   else // repeated message
  50.   {
  51.     if (now < (time_t) (m_last_log_time+m_max_repeat_frequency))
  52.     {
  53.       m_count_repeated_messages++;
  54.       m_now= now;
  55.       return;
  56.     }
  57.   }
  58.   m_now= now;
  59.   append_impl(pCategory, level, pMsg);
  60.   m_last_log_time= now;
  61. }
  62. void 
  63. LogHandler::append_impl(const char* pCategory, Logger::LoggerLevel level,
  64. const char* pMsg)
  65. {
  66.   writeHeader(pCategory, level);
  67.   if (m_count_repeated_messages <= 1)
  68.     writeMessage(pMsg);
  69.   else
  70.   {
  71.     BaseString str(pMsg);
  72.     str.appfmt(" - Repeated %d times", m_count_repeated_messages);
  73.     writeMessage(str.c_str());
  74.   }
  75.   m_count_repeated_messages= 0;
  76.   writeFooter();
  77. }
  78. const char* 
  79. LogHandler::getDefaultHeader(char* pStr, const char* pCategory, 
  80.      Logger::LoggerLevel level) const
  81. {
  82.   char time[MAX_DATE_TIME_HEADER_LENGTH];
  83.   BaseString::snprintf(pStr, MAX_HEADER_LENGTH, "%s [%s] %s -- ", 
  84.      getTimeAsString((char*)time),
  85.      pCategory,
  86.      Logger::LoggerLevelNames[level]);
  87.  
  88.   return pStr;
  89. }
  90. const char* 
  91. LogHandler::getDefaultFooter() const
  92. {
  93.   return "n";
  94. }
  95. const char* 
  96. LogHandler::getDateTimeFormat() const
  97. {
  98.   return m_pDateTimeFormat;
  99. }
  100. void 
  101. LogHandler::setDateTimeFormat(const char* pFormat)
  102. {
  103.   m_pDateTimeFormat = (char*)pFormat;
  104. }
  105. char* 
  106. LogHandler::getTimeAsString(char* pStr) const 
  107. {
  108.   struct tm* tm_now;
  109. #ifdef NDB_WIN32
  110.   tm_now = localtime(&m_now);
  111. #else
  112.   tm_now = ::localtime(&m_now); //uses the "current" timezone
  113. #endif
  114.   BaseString::snprintf(pStr, MAX_DATE_TIME_HEADER_LENGTH, 
  115.      m_pDateTimeFormat, 
  116.      tm_now->tm_year + 1900, 
  117.      tm_now->tm_mon + 1, //month is [0,11]. +1 -> [1,12]
  118.      tm_now->tm_mday,
  119.      tm_now->tm_hour,
  120.      tm_now->tm_min,
  121.      tm_now->tm_sec);
  122.   
  123.   return pStr;
  124. }
  125. int 
  126. LogHandler::getErrorCode() const
  127. {
  128.   return m_errorCode;
  129. }
  130. void 
  131. LogHandler::setErrorCode(int code)
  132. {
  133.   m_errorCode = code;
  134. }
  135. bool
  136. LogHandler::parseParams(const BaseString &_params) {
  137.   Vector<BaseString> v_args;
  138.   bool ret = true;
  139.   _params.split(v_args, ",");
  140.   for(size_t i=0; i < v_args.size(); i++) {
  141.     Vector<BaseString> v_param_value;
  142.     if(v_args[i].split(v_param_value, "=", 2) != 2)
  143.       ret = false;
  144.     else if (!setParam(v_param_value[0], v_param_value[1]))
  145.       ret = false;
  146.   }
  147.   if(!checkParams())
  148.     ret = false;
  149.   return ret;
  150. }
  151. bool
  152. LogHandler::checkParams() {
  153.   return true;
  154. }
  155. //
  156. // PRIVATE
  157. //