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

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 "SysLogHandler.hpp"
  14. #include <syslog.h>
  15. //
  16. // PUBLIC
  17. //
  18. SysLogHandler::SysLogHandler() :
  19.   m_severity(LOG_INFO),
  20.   m_pIdentity("NDB"),
  21.   m_facility(LOG_USER)
  22. {
  23. }
  24. SysLogHandler::SysLogHandler(const char* pIdentity, int facility) : 
  25.   m_severity(LOG_INFO), 
  26.   m_pIdentity(pIdentity),
  27.   m_facility(facility)
  28. {
  29. }
  30. SysLogHandler::~SysLogHandler()
  31. {
  32. }
  33. bool
  34. SysLogHandler::open()
  35. {
  36.   ::setlogmask(LOG_UPTO(LOG_DEBUG)); // Log from EMERGENCY down to DEBUG
  37.   ::openlog(m_pIdentity, LOG_PID|LOG_CONS|LOG_ODELAY, m_facility); // PID, CONSOLE delay openlog
  38.   return true;
  39. }
  40. bool
  41. SysLogHandler::close()
  42. {
  43.   ::closelog();
  44.   return true;
  45. }
  46. void 
  47. SysLogHandler::writeHeader(const char* pCategory, Logger::LoggerLevel level)
  48. {
  49.   // Save category to be used by writeMessage...
  50.   m_pCategory = pCategory;
  51.   // Map LogLevel to syslog severity
  52.   switch (level)
  53.   {
  54.   case Logger::LL_ALERT:
  55.     m_severity = LOG_ALERT;
  56.     break;
  57.   case Logger::LL_CRITICAL:
  58.     m_severity = LOG_CRIT;
  59.     break;
  60.   case Logger::LL_ERROR:
  61.     m_severity = LOG_ERR;
  62.     break;
  63.   case Logger::LL_WARNING:
  64.     m_severity = LOG_WARNING;
  65.     break;
  66.   case Logger::LL_INFO:
  67.     m_severity = LOG_INFO;
  68.     break;
  69.   case Logger::LL_DEBUG:
  70.     m_severity = LOG_DEBUG;
  71.     break;
  72.   default:
  73.     m_severity = LOG_INFO;
  74.     break;
  75.   }
  76. }
  77. void 
  78. SysLogHandler::writeMessage(const char* pMsg)
  79. {
  80.   ::syslog(m_facility | m_severity, "[%s] %s", m_pCategory, pMsg); 
  81. }
  82. void 
  83. SysLogHandler::writeFooter()
  84. {
  85.   // Need to close it everytime? Do we run out of file descriptors?
  86.   //::closelog();
  87. }
  88. bool
  89. SysLogHandler::setParam(const BaseString &param, const BaseString &value) {
  90.   if(param == "facility") {
  91.     return setFacility(value);
  92.   }
  93.   return false;
  94. }
  95. static const struct syslog_facility {
  96.   const char *name;
  97.   int value;
  98. } facilitynames[] = {
  99.   { "auth", LOG_AUTH },
  100. #ifdef LOG_AUTHPRIV
  101.   { "authpriv", LOG_AUTHPRIV },
  102. #endif
  103.   { "cron", LOG_CRON },
  104.   { "daemon", LOG_DAEMON },
  105. #ifdef LOG_FTP
  106.   { "ftp", LOG_FTP },
  107. #endif
  108.   { "kern", LOG_KERN },
  109.   { "lpr", LOG_LPR },
  110.   { "mail", LOG_MAIL },
  111.   { "news", LOG_NEWS },
  112.   { "syslog", LOG_SYSLOG },
  113.   { "user", LOG_USER },
  114.   { "uucp", LOG_UUCP },
  115.   { "local0", LOG_LOCAL0 },
  116.   { "local1", LOG_LOCAL1 },
  117.   { "local2", LOG_LOCAL2 },
  118.   { "local3", LOG_LOCAL3 },
  119.   { "local4", LOG_LOCAL4 },
  120.   { "local5", LOG_LOCAL5 },
  121.   { "local6", LOG_LOCAL6 },
  122.   { "local7", LOG_LOCAL7 },
  123.   { NULL, -1 }
  124. };
  125. bool
  126. SysLogHandler::setFacility(const BaseString &facility) {
  127.   const struct syslog_facility *c;
  128.   for(c = facilitynames; c->name != NULL; c++) {
  129.     if(facility == c->name) {
  130.       m_facility = c->value;
  131.       close();
  132.       open();
  133.       return true;
  134.     }
  135.   }
  136.   return false;
  137. }