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

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 <ndb_global.h>
  14. #include "Logger.hpp"
  15. #include <LogHandler.hpp>
  16. #include <ConsoleLogHandler.hpp>
  17. #include <FileLogHandler.hpp>
  18. #include "LogHandlerList.hpp"
  19. #if !defined NDB_OSE || !defined NDB_SOFTOSE || !defined NDB_WIN32
  20. #include <SysLogHandler.hpp>
  21. #endif
  22. //
  23. // PUBLIC
  24. //
  25. const char* Logger::LoggerLevelNames[] = { "ON      ", 
  26.    "DEBUG   ",
  27.    "INFO    ",
  28.    "WARNING ",
  29.    "ERROR   ",
  30.    "CRITICAL",
  31.    "ALERT   ",
  32.    "ALL     "
  33.  };
  34. Logger::Logger() : 
  35.   m_pCategory("Logger"),
  36.   m_pConsoleHandler(NULL),
  37.   m_pFileHandler(NULL),
  38.   m_pSyslogHandler(NULL)
  39. {
  40.   m_pHandlerList = new LogHandlerList();
  41.   disable(LL_ALL);
  42.   enable(LL_ON);
  43.   enable(LL_INFO);
  44. }
  45. Logger::~Logger()
  46. {
  47.   removeAllHandlers();  
  48.   delete m_pHandlerList;
  49. }
  50. void 
  51. Logger::setCategory(const char* pCategory)
  52. {
  53.   m_pCategory = pCategory;
  54. }
  55. bool
  56. Logger::createConsoleHandler()
  57. {
  58.   bool rc = true;
  59.   if (m_pConsoleHandler == NULL)
  60.   {
  61.     m_pConsoleHandler = new ConsoleLogHandler(); 
  62.     if (!addHandler(m_pConsoleHandler)) // TODO: check error code
  63.     {
  64.       rc = false;
  65.       delete m_pConsoleHandler;
  66.       m_pConsoleHandler = NULL;
  67.     }
  68.   }
  69.   return rc;
  70. }
  71. void 
  72. Logger::removeConsoleHandler()
  73. {
  74.   if (removeHandler(m_pConsoleHandler))
  75.   {
  76.     m_pConsoleHandler = NULL;
  77.   }
  78. }
  79. bool
  80. Logger::createFileHandler()
  81. {
  82.   bool rc = true;
  83.   if (m_pFileHandler == NULL)
  84.   {
  85.     m_pFileHandler = new FileLogHandler(); 
  86.     if (!addHandler(m_pFileHandler)) // TODO: check error code
  87.     {
  88.       rc = false;
  89.       delete m_pFileHandler;
  90.       m_pFileHandler = NULL;
  91.     }
  92.   }
  93.   return rc;
  94. }
  95. void 
  96. Logger::removeFileHandler()
  97. {
  98.   if (removeHandler(m_pFileHandler))
  99.   {
  100.     m_pFileHandler = NULL;
  101.   }
  102. }
  103. bool
  104. Logger::createSyslogHandler()
  105. {
  106.   bool rc = true;
  107.   if (m_pSyslogHandler == NULL)
  108.   {
  109. #if defined NDB_OSE || defined NDB_SOFTOSE || defined NDB_WIN32
  110.     m_pSyslogHandler = new ConsoleLogHandler(); 
  111. #else
  112.     m_pSyslogHandler = new SysLogHandler(); 
  113. #endif
  114.     if (!addHandler(m_pSyslogHandler)) // TODO: check error code
  115.     {
  116.       rc = false;
  117.       delete m_pSyslogHandler;
  118.       m_pSyslogHandler = NULL;
  119.     }
  120.   }
  121.   return rc;
  122. }
  123. void 
  124. Logger::removeSyslogHandler()
  125. {
  126.   if (removeHandler(m_pSyslogHandler))
  127.   {
  128.     m_pSyslogHandler = NULL;
  129.   }
  130. }
  131. bool
  132. Logger::addHandler(LogHandler* pHandler)
  133. {
  134.   assert(pHandler != NULL);
  135.   bool rc = pHandler->open();
  136.   if (rc)
  137.   {
  138.     m_pHandlerList->add(pHandler);
  139.   }
  140.   else
  141.   {
  142.     delete pHandler;
  143.   }
  144.   return rc;
  145. }
  146. bool
  147. Logger::addHandler(const BaseString &logstring) {
  148.   size_t i;
  149.   Vector<BaseString> logdest;
  150.   Vector<LogHandler *>loghandlers;
  151.   DBUG_ENTER("Logger::addHandler");
  152.   logstring.split(logdest, ";");
  153.   for(i = 0; i < logdest.size(); i++) {
  154.     DBUG_PRINT("info",("adding: %s",logdest[i].c_str()));
  155.     Vector<BaseString> v_type_args;
  156.     logdest[i].split(v_type_args, ":", 2);
  157.     BaseString type(v_type_args[0]);
  158.     BaseString params;
  159.     if(v_type_args.size() >= 2)
  160.       params = v_type_args[1];
  161.     LogHandler *handler = NULL;
  162. #ifndef NDB_WIN32
  163.     if(type == "SYSLOG")
  164.     {
  165.       handler = new SysLogHandler();
  166.     } else 
  167. #endif
  168.     if(type == "FILE")
  169.       handler = new FileLogHandler();
  170.     else if(type == "CONSOLE")
  171.       handler = new ConsoleLogHandler();
  172.     
  173.     if(handler == NULL)
  174.       DBUG_RETURN(false);
  175.     if(!handler->parseParams(params))
  176.       DBUG_RETURN(false);
  177.     loghandlers.push_back(handler);
  178.   }
  179.   
  180.   for(i = 0; i < loghandlers.size(); i++)
  181.     addHandler(loghandlers[i]);
  182.   
  183.   DBUG_RETURN(true); /* @todo handle errors */
  184. }
  185. bool
  186. Logger::removeHandler(LogHandler* pHandler)
  187. {
  188.   int rc = false;
  189.   if (pHandler != NULL)
  190.   {
  191.     rc = m_pHandlerList->remove(pHandler);
  192.   }
  193.   return rc;
  194. }
  195. void
  196. Logger::removeAllHandlers()
  197. {
  198.   m_pHandlerList->removeAll();
  199. }
  200. bool
  201. Logger::isEnable(LoggerLevel logLevel) const
  202. {
  203.   if (logLevel == LL_ALL)
  204.   {
  205.     for (unsigned i = 1; i < MAX_LOG_LEVELS; i++)
  206.       if (!m_logLevels[i])
  207. return false;
  208.     return true;
  209.   }
  210.   return m_logLevels[logLevel];
  211. }
  212. void
  213. Logger::enable(LoggerLevel logLevel)
  214. {
  215.   if (logLevel == LL_ALL)
  216.   {
  217.     for (unsigned i = 0; i < MAX_LOG_LEVELS; i++)
  218.     {
  219.       m_logLevels[i] = true;
  220.     }
  221.   }
  222.   else 
  223.   {
  224.     m_logLevels[logLevel] = true;
  225.   }
  226. }
  227. void 
  228. Logger::enable(LoggerLevel fromLogLevel, LoggerLevel toLogLevel)
  229. {
  230.   if (fromLogLevel > toLogLevel)
  231.   {
  232.     LoggerLevel tmp = toLogLevel;
  233.     toLogLevel = fromLogLevel;
  234.     fromLogLevel = tmp;
  235.   }
  236.   for (int i = fromLogLevel; i <= toLogLevel; i++)
  237.   {
  238.     m_logLevels[i] = true;
  239.   } 
  240. }
  241. void
  242. Logger::disable(LoggerLevel logLevel)
  243. {
  244.   if (logLevel == LL_ALL)
  245.   {
  246.     for (unsigned i = 0; i < MAX_LOG_LEVELS; i++)
  247.     {
  248.       m_logLevels[i] = false;
  249.     }
  250.   }
  251.   else
  252.   {
  253.     m_logLevels[logLevel] = false;
  254.   }
  255. }
  256. void 
  257. Logger::alert(const char* pMsg, ...) const
  258. {
  259.   va_list ap;
  260.   va_start(ap, pMsg);
  261.   log(LL_ALERT, pMsg, ap);
  262.   va_end(ap);
  263. }
  264. void 
  265. Logger::critical(const char* pMsg, ...) const
  266. {
  267.   va_list ap;
  268.   va_start(ap, pMsg);
  269.   log(LL_CRITICAL, pMsg, ap);  
  270.   va_end(ap);
  271. }
  272. void 
  273. Logger::error(const char* pMsg, ...) const
  274. {
  275.   va_list ap;
  276.   va_start(ap, pMsg);
  277.   log(LL_ERROR, pMsg, ap);  
  278.   va_end(ap);
  279. }
  280. void 
  281. Logger::warning(const char* pMsg, ...) const
  282. {
  283.   va_list ap;
  284.   va_start(ap, pMsg);
  285.   log(LL_WARNING, pMsg, ap);
  286.   va_end(ap);
  287. }
  288. void 
  289. Logger::info(const char* pMsg, ...) const
  290. {
  291.   va_list ap;
  292.   va_start(ap, pMsg);
  293.   log(LL_INFO, pMsg, ap);
  294.   va_end(ap);
  295. }
  296. void 
  297. Logger::debug(const char* pMsg, ...) const
  298. {
  299.   va_list ap;
  300.   va_start(ap, pMsg);
  301.   log(LL_DEBUG, pMsg, ap);
  302.   va_end(ap);
  303. }
  304. //
  305. // PROTECTED
  306. //
  307. void 
  308. Logger::log(LoggerLevel logLevel, const char* pMsg, va_list ap) const
  309. {
  310.   if (m_logLevels[LL_ON] && m_logLevels[logLevel])
  311.   {
  312.     char buf[MAX_LOG_MESSAGE_SIZE];
  313.     BaseString::vsnprintf(buf, sizeof(buf), pMsg, ap);
  314.     LogHandler* pHandler = NULL;
  315.     while ( (pHandler = m_pHandlerList->next()) != NULL)
  316.     {
  317.       pHandler->append(m_pCategory, logLevel, buf);
  318.     }
  319.   }
  320. }
  321. //
  322. // PRIVATE
  323. //
  324. template class Vector<LogHandler*>;