SyslogChannel.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. //
  2. // SyslogChannel.cpp
  3. //
  4. // $Id: //poco/1.4/Foundation/src/SyslogChannel.cpp#1 $
  5. //
  6. // Library: Foundation
  7. // Package: Logging
  8. // Module: SyslogChannel
  9. //
  10. // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
  11. // and Contributors.
  12. //
  13. // SPDX-License-Identifier: BSL-1.0
  14. //
  15. #include "Poco/SyslogChannel.h"
  16. #include "Poco/Message.h"
  17. #include "Poco/StringTokenizer.h"
  18. #include <syslog.h>
  19. namespace Poco {
  20. const std::string SyslogChannel::PROP_NAME = "name";
  21. const std::string SyslogChannel::PROP_FACILITY = "facility";
  22. const std::string SyslogChannel::PROP_OPTIONS = "options";
  23. SyslogChannel::SyslogChannel():
  24. _options(SYSLOG_CONS),
  25. _facility(SYSLOG_USER),
  26. _open(false)
  27. {
  28. }
  29. SyslogChannel::SyslogChannel(const std::string& name, int options, int facility):
  30. _name(name),
  31. _options(options),
  32. _facility(facility),
  33. _open(false)
  34. {
  35. }
  36. SyslogChannel::~SyslogChannel()
  37. {
  38. close();
  39. }
  40. void SyslogChannel::open()
  41. {
  42. openlog(_name.c_str(), _options, _facility);
  43. _open = true;
  44. }
  45. void SyslogChannel::close()
  46. {
  47. if (_open)
  48. {
  49. closelog();
  50. _open = false;
  51. }
  52. }
  53. void SyslogChannel::log(const Message& msg)
  54. {
  55. if (!_open) open();
  56. syslog(getPrio(msg), "%s", msg.getText().c_str());
  57. }
  58. void SyslogChannel::setProperty(const std::string& name, const std::string& value)
  59. {
  60. if (name == PROP_NAME)
  61. {
  62. _name = value;
  63. }
  64. else if (name == PROP_FACILITY)
  65. {
  66. if (value == "LOG_KERN")
  67. _facility = SYSLOG_KERN;
  68. else if (value == "LOG_USER")
  69. _facility = SYSLOG_USER;
  70. else if (value == "LOG_MAIL")
  71. _facility = SYSLOG_MAIL;
  72. else if (value == "LOG_DAEMON")
  73. _facility = SYSLOG_DAEMON;
  74. else if (value == "LOG_AUTH")
  75. _facility = SYSLOG_AUTH;
  76. else if (value == "LOG_AUTHPRIV")
  77. _facility = SYSLOG_AUTHPRIV;
  78. else if (value == "LOG_SYSLOG")
  79. _facility = SYSLOG_SYSLOG;
  80. else if (value == "LOG_LPR")
  81. _facility = SYSLOG_LPR;
  82. else if (value == "LOG_NEWS")
  83. _facility = SYSLOG_NEWS;
  84. else if (value == "LOG_UUCP")
  85. _facility = SYSLOG_UUCP;
  86. else if (value == "LOG_CRON")
  87. _facility = SYSLOG_CRON;
  88. else if (value == "LOG_FTP")
  89. _facility = SYSLOG_FTP;
  90. else if (value == "LOG_LOCAL0")
  91. _facility = SYSLOG_LOCAL0;
  92. else if (value == "LOG_LOCAL1")
  93. _facility = SYSLOG_LOCAL1;
  94. else if (value == "LOG_LOCAL2")
  95. _facility = SYSLOG_LOCAL2;
  96. else if (value == "LOG_LOCAL3")
  97. _facility = SYSLOG_LOCAL3;
  98. else if (value == "LOG_LOCAL4")
  99. _facility = SYSLOG_LOCAL4;
  100. else if (value == "LOG_LOCAL5")
  101. _facility = SYSLOG_LOCAL5;
  102. else if (value == "LOG_LOCAL6")
  103. _facility = SYSLOG_LOCAL6;
  104. else if (value == "LOG_LOCAL7")
  105. _facility = SYSLOG_LOCAL7;
  106. }
  107. else if (name == PROP_OPTIONS)
  108. {
  109. _options = 0;
  110. StringTokenizer tokenizer(value, "|+:;,", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
  111. for (StringTokenizer::Iterator it = tokenizer.begin(); it != tokenizer.end(); ++it)
  112. {
  113. if (*it == "LOG_CONS")
  114. _options |= SYSLOG_CONS;
  115. else if (*it == "LOG_NDELAY")
  116. _options |= SYSLOG_NDELAY;
  117. else if (*it == "LOG_PERROR")
  118. _options |= SYSLOG_PERROR;
  119. else if (*it == "LOG_PID")
  120. _options |= SYSLOG_PID;
  121. }
  122. }
  123. else
  124. {
  125. Channel::setProperty(name, value);
  126. }
  127. }
  128. std::string SyslogChannel::getProperty(const std::string& name) const
  129. {
  130. if (name == PROP_NAME)
  131. {
  132. return _name;
  133. }
  134. else if (name == PROP_FACILITY)
  135. {
  136. if (_facility == SYSLOG_KERN)
  137. return "LOG_KERN";
  138. else if (_facility == SYSLOG_USER)
  139. return "LOG_USER";
  140. else if (_facility == SYSLOG_MAIL)
  141. return "LOG_MAIL";
  142. else if (_facility == SYSLOG_DAEMON)
  143. return "LOG_DAEMON";
  144. else if (_facility == SYSLOG_AUTH)
  145. return "LOG_AUTH";
  146. else if (_facility == SYSLOG_AUTHPRIV)
  147. return "LOG_AUTHPRIV";
  148. else if (_facility == SYSLOG_SYSLOG)
  149. return "LOG_SYSLOG";
  150. else if (_facility == SYSLOG_LPR)
  151. return "LOG_LPR";
  152. else if (_facility == SYSLOG_NEWS)
  153. return "LOG_NEWS";
  154. else if (_facility == SYSLOG_UUCP)
  155. return "LOG_UUCP";
  156. else if (_facility == SYSLOG_CRON)
  157. return "LOG_CRON";
  158. else if (_facility == SYSLOG_FTP)
  159. return "LOG_FTP";
  160. else if (_facility == SYSLOG_LOCAL0)
  161. return "LOG_LOCAL0";
  162. else if (_facility == SYSLOG_LOCAL1)
  163. return "LOG_LOCAL1";
  164. else if (_facility == SYSLOG_LOCAL2)
  165. return "LOG_LOCAL2";
  166. else if (_facility == SYSLOG_LOCAL3)
  167. return "LOG_LOCAL3";
  168. else if (_facility == SYSLOG_LOCAL4)
  169. return "LOG_LOCAL4";
  170. else if (_facility == SYSLOG_LOCAL5)
  171. return "LOG_LOCAL5";
  172. else if (_facility == SYSLOG_LOCAL6)
  173. return "LOG_LOCAL6";
  174. else if (_facility == SYSLOG_LOCAL7)
  175. return "LOG_LOCAL7";
  176. else
  177. return "";
  178. }
  179. else if (name == PROP_OPTIONS)
  180. {
  181. std::string result;
  182. if (_options & SYSLOG_CONS)
  183. {
  184. if (!result.empty()) result.append("|");
  185. result.append("LOG_CONS");
  186. }
  187. if (_options & SYSLOG_NDELAY)
  188. {
  189. if (!result.empty()) result.append("|");
  190. result.append("LOG_NDELAY");
  191. }
  192. if (_options & SYSLOG_PERROR)
  193. {
  194. if (!result.empty()) result.append("|");
  195. result.append("LOG_PERROR");
  196. }
  197. if (_options & SYSLOG_PID)
  198. {
  199. if (!result.empty()) result.append("|");
  200. result.append("LOG_PID");
  201. }
  202. return result;
  203. }
  204. else
  205. {
  206. return Channel::getProperty(name);
  207. }
  208. }
  209. int SyslogChannel::getPrio(const Message& msg)
  210. {
  211. switch (msg.getPriority())
  212. {
  213. case Message::PRIO_TRACE:
  214. case Message::PRIO_DEBUG:
  215. return LOG_DEBUG;
  216. case Message::PRIO_INFORMATION:
  217. return LOG_INFO;
  218. case Message::PRIO_NOTICE:
  219. return LOG_NOTICE;
  220. case Message::PRIO_WARNING:
  221. return LOG_WARNING;
  222. case Message::PRIO_ERROR:
  223. return LOG_ERR;
  224. case Message::PRIO_CRITICAL:
  225. return LOG_CRIT;
  226. case Message::PRIO_FATAL:
  227. return LOG_ALERT;
  228. default:
  229. return 0;
  230. }
  231. }
  232. } // namespace Poco