LogConsumer.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace WorkflowBundle\Services;
  3. use OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface;
  4. use PhpAmqpLib\Message\AMQPMessage;
  5. use Symfony\Component\DependencyInjection\ContainerInterface;
  6. class LogConsumer implements ConsumerInterface
  7. {
  8. /**
  9. * @var ContainerInterface
  10. */
  11. protected $serviceContainer;
  12. /**
  13. * @param ContainerInterface $serviceContainer
  14. */
  15. public function __construct(ContainerInterface $serviceContainer)
  16. {
  17. $this->serviceContainer = $serviceContainer;
  18. }
  19. /**
  20. * $msg will be an instance of `PhpAmqpLib\Message\AMQPMessage`
  21. * with the $msg->body being the data sent over RabbitMQ.
  22. *
  23. * @param AMQPMessage $msg
  24. */
  25. public function execute(AMQPMessage $msg)
  26. {
  27. $fields = [];
  28. $logClass = 'LogBundle\Entity\Log';
  29. try {
  30. $msgBody = json_decode($msg->body, true);
  31. $json_error = json_last_error();
  32. if (!$json_error) {
  33. // se hace un date format previo
  34. if (isset($msgBody['datetime']) && isset($msgBody['datetime']['date'])) {
  35. $d = new \DateTime($msgBody['datetime']['date']);
  36. } else {
  37. $d = new DateTime("now");
  38. }
  39. $fields['dateCreated'] = $d;
  40. $fields['singleMessage'] = isset($msgBody['message']) ? $msgBody['message'] : "";
  41. $fields['context'] = isset($msgBody['context']) ? json_encode($msgBody['context']) : "";
  42. $fields['levelName'] = isset($msgBody['level_name']) ? $msgBody['level_name'] : "";
  43. $fields['channel'] = isset($msgBody['channel']) ? $msgBody['channel'] : "";
  44. $fields['extra'] = isset($msgBody['extra']) ? json_encode($msgBody['extra']) : "";
  45. $fields['exchange'] = $msg->has('exchange') ? $msg->get('exchange') : "";
  46. $fields['routingKey'] = $msg->has('routing_key') ? $msg->get('routing_key') : "";
  47. $msgBody['datetime'] = date('Y-m-d H:i:s', strtotime($msgBody['datetime']['date']));
  48. $fields['message'] = $this->serviceContainer->get('monolog_line_formatter')->format($msgBody);
  49. if (isset($msgBody['context']['deviceId']) && isset($msgBody['context']['deviceType'])) {
  50. $logClass = 'LogBundle\Entity\DeviceLog';
  51. $fields['deviceId'] = $msgBody['context']['deviceId'];
  52. $fields['deviceType'] = $msgBody['context']['deviceType'];
  53. }
  54. } else {
  55. $fields['message'] = "Error json: {$json_error}";
  56. }
  57. } catch (\Exception $ex) {
  58. $fields['message'] = $ex->getMessage();
  59. }
  60. $log = $this->createLog($fields, $logClass);
  61. if (is_null($log)) {
  62. var_dump('Error: log no creado');
  63. } else {
  64. var_dump(sprintf("ID: %s Message: %s", $log->getId(), $log->getMessage()));
  65. }
  66. return;
  67. }
  68. /**
  69. * Crea una entidad Log y la persiste
  70. *
  71. * @param array $fields
  72. * @param string $logClass
  73. *
  74. * @return \WorkflowBundle\Services\LogBundle\Entity\Log
  75. */
  76. private function createLog($fields, $logClass = 'LogBundle\Entity\Log')
  77. {
  78. if (class_exists($logClass)) {
  79. $em = $this->serviceContainer->get('doctrine.orm.entity_manager');
  80. $log = new $logClass();
  81. $log->setMessage($fields['message']);
  82. if ($logClass == 'LogBundle\Entity\Log') {
  83. if (isset($fields['singleMessage'])) {
  84. $log->setSingleMessage(substr($fields['singleMessage'], 0, 128));
  85. } else {
  86. $log->setSingleMessage("");
  87. }
  88. if (isset($fields['dateCreated'])) {
  89. $log->setDateCreated($fields['dateCreated']);
  90. } else {
  91. $log->setDateCreated(new DateTime("now"));
  92. }
  93. if (isset($fields['context'])) {
  94. $log->setContext(substr($fields['context'], 0, 128));
  95. } else {
  96. $log->setContext("");
  97. }
  98. if (isset($fields['levelName'])) {
  99. $log->setLevelName(substr($fields['levelName'], 0, 32));
  100. } else {
  101. $log->setLevelName("");
  102. }
  103. if (isset($fields['channel'])) {
  104. $log->setChannel(substr($fields['channel'], 0, 32));
  105. } else {
  106. $log->setChannel("");
  107. }
  108. if (isset($fields['extra'])) {
  109. $log->setExtra(substr($fields['extra'], 0, 128));
  110. } else {
  111. $log->setExtra("");
  112. }
  113. if (isset($fields['exchange'])) {
  114. $log->setExchange(substr($fields['exchange'], 0, 32));
  115. } else {
  116. $log->setExchange("");
  117. }
  118. if (isset($fields['routingKey'])) {
  119. $log->setRoutingKey(substr($fields['routingKey'], 0, 32));
  120. } else {
  121. $log->setRoutingKey("");
  122. }
  123. }
  124. if (isset($fields['deviceId']) && isset($fields['deviceType'])) {
  125. $device = $em->getRepository('LicenseBundle:Device')->findOneBy([
  126. 'deviceId' => $fields['deviceId'],
  127. 'deviceType' => $fields['deviceType'],
  128. ]);
  129. $log->setDevice($device);
  130. }
  131. $validator = $this->serviceContainer->get('validator');
  132. if ($validator->validate($log)->count() == 0) {
  133. $em->persist($log);
  134. $em->flush($log);
  135. return $log;
  136. }
  137. }
  138. return null;
  139. }
  140. }