ソースを参照

Refactory log consumer. Se agrego service monolog formatter

Guillermo Espinoza 7 年 前
コミット
b74e04a621
2 ファイル変更34 行追加20 行削除
  1. 3 0
      Resources/config/rabbit_mq/services.yml
  2. 31 20
      Services/LogConsumer.php

+ 3 - 0
Resources/config/rabbit_mq/services.yml

@@ -27,6 +27,9 @@ services:
     monolog.amqp:
         class: Monolog\Handler\AmqpHandler
         arguments: ["@amqp.channel"]
+        
+    monolog_line_formatter:
+        class: Monolog\Formatter\LineFormatter
 
     log_consumer_service:
         class: '%log_consumer_service.class%'

+ 31 - 20
Services/LogConsumer.php

@@ -31,21 +31,28 @@ class LogConsumer implements ConsumerInterface
      */
     public function execute(AMQPMessage $msg)
     {
-        $message = '';
-        $level = '';
-        $channel = '';
+        $fields = [];
+        $logClass = 'LogBundle\Entity\Log';
         try {
             $msgBody = json_decode($msg->body, true);
-            if (!json_last_error() && isset($msgBody['message']) && !empty($msgBody['message'])) {
-                $message = $msgBody['message'];
-                $level = isset($msgBody['level_name']) ? $msgBody['level_name'] : $level;
-                $channel = isset($msgBody['channel']) ? $msgBody['channel'] : $channel;
+            $json_error = json_last_error();
+            if (!$json_error) {
+                // se hace un date format previo
+                $msgBody['datetime'] = date('Y-m-d H:i:s', strtotime($msgBody['datetime']['date']));
+                $fields['message'] = $this->serviceContainer->get('monolog_line_formatter')->format($msgBody);
+                if (isset($msgBody['context']['deviceId']) && isset($msgBody['context']['deviceType'])) {
+                    $logClass = 'LogBundle\Entity\DeviceLog';
+                    $fields['deviceId'] = $msgBody['context']['deviceId'];
+                    $fields['deviceType'] = $msgBody['context']['deviceType'];
+                }
+            } else {
+                $fields['message'] = "Error json: {$json_error}";
             }
         } catch (\Exception $ex) {
-            $message = $ex->getMessage();
+            $fields['message'] = $ex->getMessage();
         }
         
-        $log = $this->createLog($message, $level, $channel);
+        $log = $this->createLog($fields, $logClass);
         if (is_null($log)) {
             var_dump('Error: log no creado');
         } else {
@@ -58,22 +65,26 @@ class LogConsumer implements ConsumerInterface
     /**
      * Crea una entidad Log y la persiste
      * 
-     * @param string $message
-     * @param string $level
-     * @param string $channel
+     * @param array $fields
+     * @param string $logClass
      * 
      * @return \WorkflowBundle\Services\LogBundle\Entity\Log
      */
-    private function createLog($message, $level, $channel)
+    private function createLog($fields, $logClass = 'LogBundle\Entity\Log')
     {
-        $logClass = 'LogBundle\Entity\Log';
-        if ($message !== '' && class_exists($logClass)) {
-            $log = new $logClass();
-            $log->setMessage($message);
-            $log->setLevel($level);
-            $log->setChannel($channel);
-
+        if (class_exists($logClass)) {
             $em = $this->serviceContainer->get('doctrine.orm.entity_manager');
+            
+            $log = new $logClass();           
+            $log->setMessage($fields['message']);
+            if (isset($fields['deviceId']) && isset($fields['deviceType'])) {
+                $device = $em->getRepository('LicenseBundle:Device')->findOneBy([
+                    'deviceId' => $fields['deviceId'],
+                    'deviceType' => $fields['deviceType'],
+                ]);
+                $log->setDevice($device);
+            }
+
             $validator = $this->serviceContainer->get('validator');
             if ($validator->validate($log)->count() == 0) {
                 $em->persist($log);