PageRenderTime 40ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/branches/1.0/src/class.LoggerAppenderScalr.php

http://scalr.googlecode.com/
PHP | 316 lines | 178 code | 55 blank | 83 comment | 11 complexity | 6080752bd1a069f43dcd5f716c43b9fc MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, GPL-3.0
  1. <?php
  2. require_once(LOG4PHP_DIR . '/LoggerAppenderSkeleton.php');
  3. require_once(LOG4PHP_DIR . '/helpers/LoggerOptionConverter.php');
  4. require_once(LOG4PHP_DIR . '/LoggerLog.php');
  5. class LoggerAppenderScalr extends LoggerAppenderSkeleton {
  6. /**
  7. * Create the log table if it does not exists (optional).
  8. * @var boolean
  9. */
  10. var $createTable = true;
  11. /**
  12. * The type of database to connect to
  13. * @var string
  14. */
  15. var $type;
  16. /**
  17. * Database user name
  18. * @var string
  19. */
  20. var $user;
  21. /**
  22. * Database password
  23. * @var string
  24. */
  25. var $password;
  26. /**
  27. * Database host to connect to
  28. * @var string
  29. */
  30. var $host;
  31. /**
  32. * Name of the database to connect to
  33. * @var string
  34. */
  35. var $database;
  36. /**
  37. * A {@link LoggerPatternLayout} string used to format a valid insert query (mandatory).
  38. * @var string
  39. */
  40. var $sql;
  41. /**
  42. * Table name to write events. Used only if {@link $createTable} is true.
  43. * @var string
  44. */
  45. var $table;
  46. /**
  47. * @var object Adodb instance
  48. * @access private
  49. */
  50. var $db = null;
  51. /**
  52. * @var boolean used to check if all conditions to append are true
  53. * @access private
  54. */
  55. var $canAppend = true;
  56. /**
  57. * @access private
  58. */
  59. var $requiresLayout = false;
  60. /**
  61. * Constructor.
  62. *
  63. * @param string $name appender name
  64. */
  65. function LoggerAppenderDb($name)
  66. {
  67. $this->LoggerAppenderSkeleton($name);
  68. }
  69. /**
  70. * Setup db connection.
  71. * Based on defined options, this method connects to db defined in {@link $dsn}
  72. * and creates a {@link $table} table if {@link $createTable} is true.
  73. * @return boolean true if all ok.
  74. */
  75. function activateOptions()
  76. {
  77. $this->db = &ADONewConnection($this->type);
  78. if (! $this->db->NConnect($this->host, $this->user, $this->password, $this->database)) {
  79. LoggerLog::debug("LoggerAppenderAdodb::activateOptions() DB Connect Error [".$this->db->ErrorMsg()."]");
  80. $this->db = null;
  81. $this->closed = true;
  82. $this->canAppend = false;
  83. return;
  84. }
  85. $this->layout = LoggerLayout::factory('LoggerPatternLayoutScalr');
  86. $this->layout->setConversionPattern($this->getSql());
  87. $this->canAppend = true;
  88. }
  89. function append($event)
  90. {
  91. if ($this->canAppend)
  92. {
  93. try
  94. {
  95. // Reopen new mysql connection (need for php threads)
  96. $this->activateOptions();
  97. if ($event->message instanceOf FarmLogMessage)
  98. {
  99. $severity = $this->SeverityToInt($event->getLevel()->toString());
  100. $message = $this->db->qstr($event->message->Message);
  101. $query = "INSERT DELAYED INTO logentries SET
  102. serverid = '',
  103. message = {$message},
  104. severity = '{$severity}',
  105. time = '".time()."',
  106. source = '".$event->getLoggerName()."',
  107. farmid = '{$event->message->FarmID}'
  108. ";
  109. $this->db->Execute($query);
  110. $event->message = $this->db->qstr("[FarmID: {$event->message->FarmID}] {$event->message->Message}");
  111. }
  112. elseif ($event->message instanceof ScriptingLogMessage)
  113. {
  114. $message = $this->db->qstr($event->message->Message);
  115. $query = "INSERT DELAYED INTO scripting_log SET
  116. farmid = '{$event->message->FarmID}',
  117. event = '{$event->message->EventName}',
  118. instance = '{$event->message->InstanceID}',
  119. dtadded = NOW(),
  120. message = {$message}
  121. ";
  122. $this->db->Execute($query);
  123. $event->message = $this->db->qstr("[Farm: {$event->message->FarmID}] {$event->message->Message}");
  124. }
  125. else
  126. $event->message = $this->db->qstr($event->message);
  127. // Redeclare threadName
  128. $event->threadName = TRANSACTION_ID;
  129. $event->subThreadName = defined("SUB_TRANSACTIONID") ? SUB_TRANSACTIONID : TRANSACTION_ID;
  130. $event->farmID = defined("LOGGER_FARMID") ? LOGGER_FARMID : null;
  131. $level = $event->getLevel()->toString();
  132. if ($level == "FATAL" || $level == "ERROR")
  133. {
  134. $event->backtrace = $this->db->qstr(Debug::Backtrace());
  135. // Set meta information
  136. $this->db->Execute("INSERT DELAYED INTO syslog_metadata SET transactionid=?, errors='1', warnings='0'
  137. ON DUPLICATE KEY UPDATE errors=errors+1
  138. ",
  139. array(TRANSACTION_ID)
  140. );
  141. }
  142. else
  143. {
  144. if ($level == "WARN")
  145. {
  146. // Set meta information
  147. $this->db->Execute("INSERT DELAYED INTO syslog_metadata SET transactionid=?, errors='0', warnings='1'
  148. ON DUPLICATE KEY UPDATE warnings=warnings+1
  149. ",
  150. array(TRANSACTION_ID)
  151. );
  152. }
  153. $event->backtrace = "''";
  154. }
  155. $query = $this->layout->format($event);
  156. $this->db->Execute($query);
  157. }
  158. catch(Exception $e)
  159. {
  160. }
  161. // close connection
  162. if ($this->db !== null)
  163. $this->db->Close();
  164. }
  165. }
  166. function SeverityToInt($severity)
  167. {
  168. $severities = array("DEBUG" => 0, "INFO" => 2, "WARN" => 3, "ERROR" => 4, "FATAL" => 5);
  169. return $severities[$severity];
  170. }
  171. function close()
  172. {
  173. if ($this->db !== null)
  174. $this->db->Close();
  175. $this->closed = true;
  176. }
  177. /**
  178. * @return boolean
  179. */
  180. function getCreateTable()
  181. {
  182. return $this->createTable;
  183. }
  184. /**
  185. * @return string the sql pattern string
  186. */
  187. function getSql()
  188. {
  189. return $this->sql;
  190. }
  191. /**
  192. * @return string the table name to create
  193. */
  194. function getTable()
  195. {
  196. return $this->table;
  197. }
  198. /**
  199. * @return string the database to connect to
  200. */
  201. function getDatabase() {
  202. return $this->database;
  203. }
  204. /**
  205. * @return string the database to connect to
  206. */
  207. function getHost() {
  208. return $this->host;
  209. }
  210. /**
  211. * @return string the user to connect with
  212. */
  213. function getUser() {
  214. return $this->user;
  215. }
  216. /**
  217. * @return string the password to connect with
  218. */
  219. function getPassword() {
  220. return $this->password;
  221. }
  222. /**
  223. * @return string the type of database to connect to
  224. */
  225. function getType() {
  226. return $this->type;
  227. }
  228. function setCreateTable($flag)
  229. {
  230. $this->createTable = LoggerOptionConverter::toBoolean($flag, true);
  231. }
  232. function setType($newType)
  233. {
  234. $this->type = $newType;
  235. }
  236. function setDatabase($newDatabase)
  237. {
  238. $this->database = $newDatabase;
  239. }
  240. function setHost($newHost)
  241. {
  242. $this->host = $newHost;
  243. }
  244. function setUser($newUser)
  245. {
  246. $this->user = $newUser;
  247. }
  248. function setPassword($newPassword)
  249. {
  250. $this->password = $newPassword;
  251. }
  252. function setSql($sql)
  253. {
  254. $this->sql = $sql;
  255. }
  256. function setTable($table)
  257. {
  258. $this->table = $table;
  259. }
  260. }
  261. ?>