VOL-1195 Broadcom logger for format consistency  and log rotation

Change-Id: I18d65e382682fcbbcad16676142effae6acbc795
diff --git a/Makefile b/Makefile
index a32dfbd..77ae21b 100644
--- a/Makefile
+++ b/Makefile
@@ -135,7 +135,7 @@
 	-I$(BAL_DIR)/bal_release/3rdparty/maple/sdk/host_driver/api \
 	-I$(BAL_DIR)/bal_release/3rdparty/maple/sdk/host_reference/cli
 CXXFLAGS += $(BAL_INC) -I $(BAL_DIR)/lib/cmdline
-CXXFLAGS += -DBCMOS_MSG_QUEUE_DOMAIN_SOCKET -DBCMOS_MSG_QUEUE_UDP_SOCKET -DBCMOS_MEM_CHECK -DBCMOS_SYS_UNITTEST
+CXXFLAGS += -DBCMOS_MSG_QUEUE_DOMAIN_SOCKET -DBCMOS_MSG_QUEUE_UDP_SOCKET -DBCMOS_MEM_CHECK -DBCMOS_SYS_UNITTEST -DENABLE_LOG
 
 sdk: onl
 ifeq ("$(wildcard $(BAL_DIR))","")
diff --git a/mkdebian/debian/asfvolt16.postinst b/mkdebian/debian/asfvolt16.postinst
index b12bfb2..e7d5a53 100644
--- a/mkdebian/debian/asfvolt16.postinst
+++ b/mkdebian/debian/asfvolt16.postinst
@@ -7,6 +7,7 @@
 rm -f /run/bcm68620
 cp /tmp/init.d/bal_core_dist /etc/init.d
 cp /tmp/init.d/openolt /etc/init.d
+cp /tmp/logrotate.d/openolt /etc/logrotate.d
 chmod +x /etc/init.d/bal_core_dist
 chmod +x /etc/init.d/openolt
 update-rc.d bal_core_dist defaults
diff --git a/mkdebian/debian/logrotate.d/openolt b/mkdebian/debian/logrotate.d/openolt
new file mode 100644
index 0000000..c224dbd
--- /dev/null
+++ b/mkdebian/debian/logrotate.d/openolt
@@ -0,0 +1,10 @@
+/var/log/bal_core_dist.log
+/var/log/openolt.log
+{
+  rotate 7
+  daily
+  compress
+  missingok
+  delaycompress
+  copytruncate
+}
diff --git a/mkdebian/debian/rules b/mkdebian/debian/rules
index 33d257a..61e1bb7 100755
--- a/mkdebian/debian/rules
+++ b/mkdebian/debian/rules
@@ -31,6 +31,7 @@
 	cp -a $(CURDIR)/debian/libgrpc.so.6 $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 	cp -a $(CURDIR)/debian/openolt $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 	cp -a $(CURDIR)/debian/init.d $(DEB_DH_INSTALL_SOURCEDIR)/tmp
+	cp -a $(CURDIR)/debian/logrotate.d $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 
 #override_dh_shlibdeps:
 #	dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info -l$(ONLP_LIB_PATH):$(OFDPA_LIB_PATH)
diff --git a/src/core.cc b/src/core.cc
index bf2a41e..002783c 100644
--- a/src/core.cc
+++ b/src/core.cc
@@ -38,11 +38,16 @@
 #include <bal_api_end.h>
 // FIXME : dependency problem
 // #include <bcm_common_gpon.h>
+// #include <bcm_dev_log_task.h>
 }
 
+dev_log_id openolt_log_id = bcm_dev_log_id_register("OPENOLT", DEV_LOG_LEVEL_INFO, DEV_LOG_ID_TYPE_BOTH);
+dev_log_id omci_log_id = bcm_dev_log_id_register("OMCI", DEV_LOG_LEVEL_INFO, DEV_LOG_ID_TYPE_BOTH);
+
+
 #define NUM_OF_PON_PORTS 16
 const std::string technology = "xgspon";
-const std::string firmware_version = "BAL.2.6.0.1__Openolt.2018.09.05";
+const std::string firmware_version = "BAL.2.6.0.1__Openolt.2018.09.10";
 
 State state;
 
@@ -90,15 +95,16 @@
     bcmbal_access_terminal_key key = { };
 
     if (!state.is_activated()) {
-        std::cout << "Enable OLT" << std::endl;
+        BCM_LOG(INFO, openolt_log_id, "Enable OLT");
 
         bcmbal_init(argc, argv, NULL);
 
         Status status = SubscribeIndication();
         if (!status.ok()) {
-            std::cout << "ERROR: SubscribeIndication failed - "
-                      << status.error_code() << ": " << status.error_message()
-                      << std::endl;
+            BCM_LOG(ERROR, openolt_log_id, "SubscribeIndication failed - %s : %s\n",
+                grpc_status_code_to_string(status.error_code()).c_str(),
+                status.error_message().c_str());
+
             return status;
         }
 
@@ -107,7 +113,7 @@
         BCMBAL_CFG_PROP_SET(&acc_term_obj, access_terminal, admin_state, BCMBAL_STATE_UP);
         bcmos_errno err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(acc_term_obj.hdr));
         if (err) {
-            std::cout << "ERROR: Failed to enable OLT" << std::endl;
+            BCM_LOG(ERROR, openolt_log_id, "Failed to enable OLT\n");
             return bcm_to_grpc_err(err, "Failed to enable OLT");
         }
         init_stats();
@@ -144,7 +150,7 @@
         openolt::OltIndication* olt_ind = new openolt::OltIndication;
         olt_ind->set_oper_state("down");
         ind.set_allocated_olt_ind(olt_ind);
-        std::cout << "Disable OLT, add an extra indication" << std::endl;
+        BCM_LOG(INFO, openolt_log_id, "Disable OLT, add an extra indication\n");
         oltIndQ.push(ind);
     }
     return status;
@@ -159,7 +165,7 @@
         openolt::OltIndication* olt_ind = new openolt::OltIndication;
         olt_ind->set_oper_state("up");
         ind.set_allocated_olt_ind(olt_ind);
-        std::cout << "Reenable OLT, add an extra indication" << std::endl;
+        BCM_LOG(INFO, openolt_log_id, "Reenable OLT, add an extra indication\n");
         oltIndQ.push(ind);
     }
     return status;
@@ -177,7 +183,7 @@
 
     bcmos_errno err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(interface_obj.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to enable PON interface: " << intf_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to enable PON interface: %d\n", intf_id);
         return bcm_to_grpc_err(err, "Failed to enable PON interface");
     }
 
@@ -196,7 +202,7 @@
 
     bcmos_errno err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(interface_obj.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to disable Uplink interface: " << intf_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to disable Uplink interface: %d\n", intf_id);
         return bcm_to_grpc_err(err, "Failed to disable Uplink interface");
     }
 
@@ -215,7 +221,7 @@
 
     bcmos_errno err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(interface_obj.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to enable Uplink interface: " << intf_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to enable Uplink interface: %d\n", intf_id);
         return bcm_to_grpc_err(err, "Failed to enable Uplink interface");
     }
 
@@ -234,7 +240,7 @@
 
     bcmos_errno err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(interface_obj.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to disable PON interface: " << intf_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to disable PON interface: %d\n", intf_id);
         return bcm_to_grpc_err(err, "Failed to disable PON interface");
     }
 
@@ -250,11 +256,8 @@
     bcmbal_serial_number serial_num = {};
     bcmbal_registration_id registration_id = {};
 
-    std::cout << "Enabling ONU " << onu_id << " on PON " << intf_id << std::endl;
-    std::cout << "Vendor Id " << vendor_id
-              << "Vendor Specific Id " << vendor_specific
-              << "pir " << pir
-              << std::endl;
+    BCM_LOG(INFO, openolt_log_id,  "Enabling ONU %d on PON %d : vendor id %s, vendor specific %s, pir %d\n",
+        onu_id, intf_id, vendor_id, vendor_specific, pir);
 
     subs_terminal_key.sub_term_id = onu_id;
     subs_terminal_key.intf_id = intf_id;
@@ -277,7 +280,7 @@
 
     bcmos_errno err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(sub_term_obj.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to enable ONU: " << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to enable ONU %d on PON %d\n", onu_id, intf_id);
         return bcm_to_grpc_err(err, "Failed to enable ONU");
     }
 
@@ -296,10 +299,8 @@
     bcmbal_subscriber_terminal_cfg sub_term_obj = {};
     bcmbal_subscriber_terminal_key subs_terminal_key;
 
-    std::cout << "Deactivating ONU " << onu_id << " on PON " << intf_id << std::endl;
-    std::cout << "Vendor Id " << vendor_id
-              << "Vendor Specific Id " << vendor_specific
-              << std::endl;
+    BCM_LOG(INFO, openolt_log_id,  "Deactivating ONU %d on PON %d : vendor id %s, vendor specific %s\n",
+        onu_id, intf_id, vendor_id, vendor_specific);
 
     subs_terminal_key.sub_term_id = onu_id;
     subs_terminal_key.intf_id = intf_id;
@@ -308,7 +309,7 @@
     BCMBAL_CFG_PROP_SET(&sub_term_obj, subscriber_terminal, admin_state, BCMBAL_STATE_DOWN);
 
     if (bcmbal_cfg_set(DEFAULT_ATERM_ID, &(sub_term_obj.hdr))) {
-        std::cout << "ERROR: Failed to deactivate ONU: " << std::endl;
+        BCM_LOG(ERROR, openolt_log_id,  "Failed to deactivate ONU %d on PON %d\n", onu_id, intf_id);
         return Status(grpc::StatusCode::INTERNAL, "Failed to deactivate ONU");
     }
 
@@ -337,16 +338,16 @@
     bcmbal_subscriber_terminal_cfg cfg;
     bcmbal_subscriber_terminal_key key = { };
 
-    std::cout << "Processing subscriber terminal cfg clear for sub_term_id = "
-              << onu_id << " and intf_id = " << intf_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Processing subscriber terminal cfg clear for sub_term_id %d  and intf_id %d\n",
+        onu_id, intf_id);
 
     key.sub_term_id = onu_id ;
     key.intf_id = intf_id ;
 
     if (0 == key.sub_term_id)
     {
-            std::cout << "Invalid Key to handle subscriber terminal clear subscriber_terminal_id = "
-                      << onu_id << " Interface ID = " << intf_id << std::endl;
+            BCM_LOG(INFO, openolt_log_id,"Invalid Key to handle subscriber terminal clear subscriber_terminal_id %d, Interface ID %d\n",
+                onu_id, intf_id);
             return Status(grpc::StatusCode::INTERNAL, "Failed to delete ONU");
     }
 
@@ -355,8 +356,8 @@
     err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &cfg.hdr);
     if (err != BCM_ERR_OK)
     {
-       std::cout << "Failed to clear information for BAL subscriber_terminal_id = "
-                << onu_id << " Interface ID = " << intf_id << std::endl;
+       BCM_LOG(ERROR, openolt_log_id, "Failed to clear information for BAL subscriber_terminal_id %d, Interface ID %d\n",
+            onu_id, intf_id);
         return Status(grpc::StatusCode::INTERNAL, "Failed to delete ONU");
     }
 
@@ -391,10 +392,6 @@
     char str2[MAX_CHAR_LENGTH];
     memset(&arraySend, 0, buf.len);
 
-    // std::cout << "Sending omci msg to ONU of length is "
-    //      << buf.len
-    //      << std::endl;
-
     for (idx1=0,idx2=0; idx1<((buf.len)*2); idx1++,idx2++) {
        sprintf(str1,"%c", pkt[idx1]);
        sprintf(str2,"%c", pkt[++idx1]);
@@ -404,15 +401,15 @@
 
     buf.val = (uint8_t *)malloc((buf.len)*sizeof(uint8_t));
     memcpy(buf.val, (uint8_t *)arraySend, buf.len);
-    //
-    // std::cout << "After converting bytes to hex "
-    //           << buf.val << buf.len << std::endl;
 
     err = bcmbal_pkt_send(0, proxy_pkt_dest, (const char *)(buf.val), buf.len);
 
-    // std::cout << "OMCI request msg of length " << buf.len
-    //           << " sent to ONU" << onu_id
-    //           << " through PON " << intf_id << std::endl;
+    if (err) {
+        BCM_LOG(ERROR, omci_log_id, "Error sending OMCI message to ONU %d on PON %d\n", onu_id, intf_id);
+    } else {
+        BCM_LOG(DEBUG, omci_log_id, "OMCI request msg of length %d sent to ONU %d on PON %d : %s\n",
+            buf.len, onu_id, intf_id, buf.val);
+    }
 
     free(buf.val);
 
@@ -434,9 +431,8 @@
 
     err = bcmbal_pkt_send(0, proxy_pkt_dest, (const char *)(buf.val), buf.len);
 
-    std::cout << "Packet out of length " << buf.len
-              << " sent to ONU" << onu_id
-              << " through PON " << intf_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Packet out of length %d sent to ONU %d on PON %d\n",
+        buf.len, onu_id, intf_id);
 
     free(buf.val);
 
@@ -457,8 +453,8 @@
 
     err = bcmbal_pkt_send(0, proxy_pkt_dest, (const char *)(buf.val), buf.len);
 
-    std::cout << "Packet out of length " << buf.len
-              << " sent through uplink port " << intf_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Packet out of length %d sent through uplink port %d\n",
+        buf.len, intf_id);
 
     free(buf.val);
 
@@ -476,14 +472,8 @@
     bcmbal_flow_cfg cfg;
     bcmbal_flow_key key = { };
 
-    std::cout << "flow add -"
-              << " intf_id:" << access_intf_id
-              << " onu_id:" << onu_id
-              << " flow_id:" << flow_id
-              << " flow_type:" << flow_type
-              << " gemport_id:" << gemport_id
-              << " network_intf_id:" << network_intf_id
-              << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "flow add - intf_id %d, onu_id %d, fow_id %d, `flow_type` %s, gemport_id %d, network_intf_id %d\n",
+        access_intf_id, onu_id, flow_id, flow_type.c_str(), gemport_id, network_intf_id);
 
     key.flow_id = flow_id;
     if (flow_type.compare("upstream") == 0 ) {
@@ -491,7 +481,7 @@
     } else if (flow_type.compare("downstream") == 0) {
         key.flow_type = BCMBAL_FLOW_TYPE_DOWNSTREAM;
     } else {
-        std::cout << "Invalid flow type " << flow_type << std::endl;
+        BCM_LOG(WARNING, openolt_log_id, "Invalid flow type %s\n", flow_type.c_str());
         return bcm_to_grpc_err(BCM_ERR_PARM, "Invalid flow type");
     }
 
@@ -670,7 +660,7 @@
 
     err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(cfg.hdr));
     if (err) {
-        std::cout << "ERROR: flow add failed" << std::endl;
+        BCM_LOG(ERROR, openolt_log_id,  "Flow add failed\n");
         return bcm_to_grpc_err(err, "flow add failed");
     }
 
@@ -691,7 +681,7 @@
     } else if (flow_type.compare("downstream") == 0) {
         key.flow_type = BCMBAL_FLOW_TYPE_DOWNSTREAM;
     } else {
-        std::cout << "Invalid flow type " << flow_type << std::endl;
+        BCM_LOG(WARNING, openolt_log_id, "Invalid flow type %s\n", flow_type.c_str());
         return bcm_to_grpc_err(BCM_ERR_PARM, "Invalid flow type");
     }
 
@@ -700,12 +690,12 @@
 
     bcmos_errno err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &cfg.hdr);
     if (err) {
-        std::cout << "Error " << err << " while removing flow "
-            << flow_id << ", " << flow_type << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Error %d while removing flow %d, %s\n",
+            err, flow_id, flow_type.c_str());
         return Status(grpc::StatusCode::INTERNAL, "Failed to remove flow");
     }
 
-    std::cout << "Flow " << flow_id << ", " << flow_type << " removed";
+    BCM_LOG(INFO, openolt_log_id, "Flow %d, %s removed\n", flow_id, flow_type.c_str());
     return Status::OK;
 }
 
@@ -745,10 +735,8 @@
 
         err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &cfg.hdr);
         if (err) {
-            std::cout << "ERROR: Failed to create subscriber downstream sched"
-                      << " id:" << key.id
-                      << " intf_id:" << intf_id
-                      << " onu_id:" << onu_id << std::endl;
+            BCM_LOG(ERROR, openolt_log_id, "Failed to create subscriber downstream sched, id %d, intf_id %d, onu_id %d\n",
+                key.id, intf_id, onu_id);
             return bcm_to_grpc_err(err, "Failed to create subscriber downstream sched");
         }
     }
@@ -766,11 +754,8 @@
         err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &cfg.hdr);
 
         if (err) {
-            std::cout << "ERROR: Failed to create subscriber downstream tm queue"
-                      << " id: " << key.id
-                      << " sched_id: " << key.sched_id
-                      << " intf_id: " << intf_id
-                      << " onu_id: " << onu_id << std::endl;
+            BCM_LOG(ERROR, openolt_log_id, "Failed to create subscriber downstream tm queue, id %d, sched_id %d, intf_id %d, onu_id %d\n",
+                key.id, key.sched_id, intf_id, onu_id);
             return bcm_to_grpc_err(err, "Failed to create subscriber downstream tm queue");
         }
 
@@ -807,16 +792,12 @@
 
     err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(cfg.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to create upstream DBA sched"
-                  << " id:" << key.id
-                  << " intf_id:" << intf_id
-                  << " onu_id:" << onu_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to create upstream DBA sched, id %d, intf_id %d, onu_id %d\n",
+            key.id, intf_id,  onu_id);
         return bcm_to_grpc_err(err, "Failed to create upstream DBA sched");
     }
-    std::cout << "create upstream DBA sched"
-              << " id:" << key.id
-              << " intf_id:" << intf_id
-              << " onu_id:" << onu_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Create upstream DBA sched, id %d, intf_id %d, onu_id %d\n",
+        key.id,intf_id,onu_id);
 
     return Status::OK;
 }
@@ -841,17 +822,13 @@
 
     err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &(tm_cfg_us.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to remove upstream DBA sched"
-                << " id:" << tm_key_us.id
-                << " intf_id:" << intf_id
-                << " onu_id:" << onu_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to remove upstream DBA sched, id %d, intf_id %d, onu_id %d\n",
+            tm_key_us.id, intf_id, onu_id);
         return Status(grpc::StatusCode::INTERNAL, "Failed to remove upstream DBA sched");
     }
 
-    std::cout << "remove upstream DBA sched"
-              << " id:" << tm_key_us.id
-              << " intf_id:" << intf_id
-              << " onu_id:" << onu_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Remove upstream DBA sched, id %d, intf_id %d, onu_id %d\n",
+        tm_key_us.id, intf_id, onu_id);
 
     /* Downstream */
 
@@ -867,19 +844,13 @@
 
     err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &(queue_cfg.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to remove downstream tm queue"
-                << " id:" << queue_key.id
-                << " sched_id:" << queue_key.sched_id
-                << " intf_id:" << intf_id
-                << " onu_id:" << onu_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to remove downstream tm queue, id %d, sched_id %d, intf_id %d, onu_id %d\n",
+            queue_key.id, queue_key.sched_id, intf_id, onu_id);
         return Status(grpc::StatusCode::INTERNAL, "Failed to remove downstream tm queue");
     }
 
-    std::cout << "remove upstream DBA sched"
-              << " id:" << queue_key.id
-              << " sched_id:" << queue_key.sched_id
-              << " intf_id:" << intf_id
-              << " onu_id:" << onu_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Remove upstream DBA sched, id %d, sched_id %d, intf_id %d, onu_id %d\n",
+        queue_key.id, queue_key.sched_id, intf_id, onu_id);
 
     // Sheduler
 
@@ -891,17 +862,13 @@
 
     err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &(tm_cfg_ds.hdr));
     if (err) {
-        std::cout << "ERROR: Failed to remove sub downstream sched"
-                << " id:" << tm_key_us.id
-                << " intf_id:" << intf_id
-                << " onu_id:" << onu_id << std::endl;
+        BCM_LOG(ERROR, openolt_log_id, "Failed to remove sub downstream sched, id %d, intf_id %d, onu_id %d\n",
+            tm_key_us.id, intf_id, onu_id);
         return Status(grpc::StatusCode::INTERNAL, "Failed to remove sub downstream sched");
     }
 
-    std::cout << "remove sub downstream sched"
-              << " id:" << tm_key_us.id
-              << " intf_id:" << intf_id
-              << " onu_id:" << onu_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Remove sub downstream sched, id %d, intf_id %d, onu_id %d\n",
+        tm_key_us.id, intf_id, onu_id);
 
     return Status::OK;
     //return 0;
diff --git a/src/error_format.cc b/src/error_format.cc
index 5c88bc7..1bc361f 100644
--- a/src/error_format.cc
+++ b/src/error_format.cc
@@ -39,3 +39,44 @@
 
     return Status(grpc_err, message);
 }
+
+std::string grpc_status_code_to_string(StatusCode status_code) {
+    switch (status_code) {
+        case StatusCode::OK:
+            return "StatusCode::OK";
+        case StatusCode::CANCELLED:
+            return "StatusCode::CANCELED";
+        case StatusCode::UNKNOWN:
+            return "StatusCode::UNKNOWN";
+        case StatusCode::INVALID_ARGUMENT:
+            return "StatusCode::INVALID_ARGUMENT";
+        case StatusCode::DEADLINE_EXCEEDED:
+            return "StatusCode::DEADLINE_EXCEEDED";
+        case StatusCode::NOT_FOUND:
+            return "StatusCode::NOT_FOUND";
+        case StatusCode::ALREADY_EXISTS:
+            return "StatusCode::ALREADY_EXISTS";
+        case StatusCode::PERMISSION_DENIED:
+            return "StatusCode::PERMISSION_DENIED";
+        case StatusCode::UNAUTHENTICATED:
+            return "StatusCode::UNAUTHENTICATED";
+        case StatusCode::RESOURCE_EXHAUSTED:
+            return "StatusCode::RESOURCE_EXHAUSTED";
+        case StatusCode::FAILED_PRECONDITION:
+            return "StatusCode::FAILED_PRECONDITION";
+        case StatusCode::ABORTED:
+            return "StatusCode::ABORTED";
+        case StatusCode::OUT_OF_RANGE:
+            return "StatusCode::OUT_OF_RANGE";
+        case StatusCode::INTERNAL:
+            return "StatusCode::INTERNAL";
+        case StatusCode::UNAVAILABLE:
+            return "StatusCode::UNAVAILABLE";
+        case StatusCode::DATA_LOSS:
+            return "StatusCode::DATA_LOSS";
+        case StatusCode::DO_NOT_USE:
+            return "StatusCode::DO_NOT_USE";
+    }
+    return "Unknown GRPC status Code";
+
+}
diff --git a/src/error_format.h b/src/error_format.h
index 5956fba..9fea079 100644
--- a/src/error_format.h
+++ b/src/error_format.h
@@ -12,6 +12,7 @@
 }
 
 grpc::Status bcm_to_grpc_err(bcmos_errno bcm_err, std::string message);
+std::string grpc_status_code_to_string(grpc::StatusCode status_code);
 
 
 #endif
diff --git a/src/indications.cc b/src/indications.cc
index 1d4a7d2..1afcb02 100644
--- a/src/indications.cc
+++ b/src/indications.cc
@@ -54,7 +54,7 @@
         state.deactivate();
     }
     ind.set_allocated_olt_ind(olt_ind);
-    std::cout << "olt indication, oper_state:" << ind.olt_ind().oper_state() << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Olt indication, oper_state: %s\n", ind.olt_ind().oper_state().c_str());
     oltIndQ.push(ind);
 
 #define MAX_SUPPORTED_INTF 16
@@ -92,7 +92,7 @@
     int intf_id = interface_key_to_port_no(bcm_los_ind->key);
     std::string status = alarm_status_to_string(bcm_los_ind->data.status);
 
-    std::cout << "LOS indication : " << intf_id << "  " << status << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "LOS indication : %d status %s\n", intf_id, status.c_str());
 
     los_ind->set_intf_id(intf_id);
     los_ind->set_status(status);
@@ -108,8 +108,8 @@
     openolt::Indication ind;
     openolt::IntfIndication* intf_ind = new openolt::IntfIndication;
 
-    std::cout << "intf indication, intf_id:"
-              << ((bcmbal_interface_oper_status_change *)obj)->key.intf_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "intf indication, intf_id: %d\n",
+        ((bcmbal_interface_oper_status_change *)obj)->key.intf_id );
 
     intf_ind->set_intf_id(((bcmbal_interface_oper_status_change *)obj)->key.intf_id);
     if (((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status == BCMBAL_STATUS_UP) {
@@ -127,12 +127,11 @@
 bcmos_errno IfOperIndication(bcmbal_obj *obj) {
     openolt::Indication ind;
     openolt::IntfOperIndication* intf_oper_ind = new openolt::IntfOperIndication;
-    std::cout << "intf oper state indication, intf_id:"
-              << ((bcmbal_interface_oper_status_change *)obj)->key.intf_id
-              << " type:" << ((bcmbal_interface_oper_status_change *)obj)->key.intf_type
-              << " oper_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status
-              << " admin_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.admin_state
-              << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "intf oper state indication, intf_id %d, type %d, oper_state %d, admin_state %d\n",
+        ((bcmbal_interface_oper_status_change *)obj)->key.intf_id,
+        ((bcmbal_interface_oper_status_change *)obj)->key.intf_type,
+        ((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status,
+        ((bcmbal_interface_oper_status_change *)obj)->data.admin_state);
 
     intf_oper_ind->set_intf_id(((bcmbal_interface_oper_status_change *)obj)->key.intf_id);
 
@@ -167,12 +166,8 @@
     bcmbal_subscriber_terminal_alarms *alarms =
         &(((bcmbal_subscriber_terminal_sub_term_alarm*)obj)->data.alarm);
 
-    std::cout << "onu alarm indication intf_id:" << key->intf_id
-        << ", onu_id:"
-        << key->sub_term_id
-        << ", alarm: los " << alarms->los << ", lob " << alarms->lob
-        << ", lopc_miss " << alarms->lopc_miss << ", lopc_mic_error "
-        << alarms->lopc_mic_error << std::endl;
+    BCM_LOG(WARNING, openolt_log_id, "onu alarm indication intf_id %d, onu_id %d, alarm: los %d, lob %d, lopc_miss %d, lopc_mic_error %d\n",
+        key->intf_id, key->sub_term_id, alarms->los, alarms->lob, alarms->lopc_miss, alarms->lopc_mic_error);
 
     onu_alarm_ind->set_intf_id(key->intf_id);
     onu_alarm_ind->set_onu_id(key->sub_term_id);
@@ -200,12 +195,8 @@
         &(((bcmbal_subscriber_terminal_dgi*)obj)->data);
 
 
-    std::cout << "onu dying-gasp indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id
-         << ", alarm: "
-         << data->dgi_status << std::endl;
+    BCM_LOG(WARNING, openolt_log_id, "onu dying-gasp indication, intf_id %d, onu_id %d, alarm %d\n",
+        key->intf_id, key->sub_term_id, data->dgi_status);
 
     dg_ind->set_intf_id(key->intf_id);
     dg_ind->set_onu_id(key->sub_term_id);
@@ -231,10 +222,8 @@
 
     bcmbal_serial_number *in_serial_number = &(data->serial_number);
 
-    std::cout << "onu discover indication, intf_id:"
-         << key->intf_id
-         << " serial_number:"
-         << serial_number_to_str(in_serial_number) << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "onu discover indication, intf_id %d, serial_number %s\n",
+        key->intf_id, serial_number_to_str(in_serial_number));
 
     onu_disc_ind->set_intf_id(key->intf_id);
     serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
@@ -257,11 +246,8 @@
     bcmbal_subscriber_terminal_oper_status_change_data *data =
         &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->data);
 
-    std::cout << "onu indication, intf_id:"
-         << key->intf_id
-         << " oper_state:" << data->new_oper_status
-         << " admin_state:" << data->admin_state
-         << " onu_id:" << key->sub_term_id << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "onu indication, intf_id %d, onu_id %d, oper_state %d, admin_state %d\n",
+        key->intf_id, key->sub_term_id, data->new_oper_status, data->admin_state);
 
     onu_ind->set_intf_id(key->intf_id);
     onu_ind->set_onu_id(key->sub_term_id);
@@ -293,14 +279,8 @@
         &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->data);
 
 
-    std::cout << "onu oper state indication, intf_id:"
-         << key->intf_id
-         << " onu_id: "
-         << key->sub_term_id
-         << " old oper state: "
-         << data->old_oper_status
-         << " new oper state:"
-         << data->new_oper_status << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "onu oper state indication, intf_id %d, onu_id %d, old oper state %d, new oper state %d\n",
+        key->intf_id, key->sub_term_id, data->old_oper_status, data->new_oper_status);
 
     onu_ind->set_intf_id(key->intf_id);
     onu_ind->set_onu_id(key->sub_term_id);
@@ -327,7 +307,9 @@
     bcmbal_packet_itu_omci_channel_rx *in =
         (bcmbal_packet_itu_omci_channel_rx *)obj;
 
-    // std::cout << "omci indication" << std::endl;
+    BCM_LOG(DEBUG, omci_log_id, "OMCI indication: intf_id %d, onu_id %d\n",
+        in->key.packet_send_dest.u.itu_omci_channel.intf_id,
+        in->key.packet_send_dest.u.itu_omci_channel.sub_term_id);
 
     omci_ind->set_intf_id(in->key.packet_send_dest.u.itu_omci_channel.intf_id);
     omci_ind->set_onu_id(in->key.packet_send_dest.u.itu_omci_channel.sub_term_id);
@@ -344,11 +326,8 @@
     openolt::PacketIndication* pkt_ind = new openolt::PacketIndication;
     bcmbal_packet_bearer_channel_rx *in = (bcmbal_packet_bearer_channel_rx *)obj;
 
-    std::cout << "packet indication"
-              << " intf_id:" << in->data.intf_id
-              << " svc_port:" << in->data.svc_port
-              << " flow_id:" << in->data.flow_id
-              << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "packet indication, intf_id %d, svc_port %d, flow_id %d\n",
+        in->data.intf_id, in->data.svc_port, in->data.flow_id);
 
     pkt_ind->set_intf_id(in->data.intf_id);
     pkt_ind->set_gemport_id(in->data.svc_port);
@@ -363,31 +342,31 @@
 
 bcmos_errno FlowOperIndication(bcmbal_obj *obj) {
     openolt::Indication ind;
-    std::cout << "flow oper state indication" << std::endl;
+    BCM_LOG(DEBUG, openolt_log_id, "flow oper state indication\n");
     return BCM_ERR_OK;
 }
 
 bcmos_errno FlowIndication(bcmbal_obj *obj) {
     openolt::Indication ind;
-    std::cout << "flow indication" << std::endl;
+    BCM_LOG(DEBUG, openolt_log_id, "flow indication\n");
     return BCM_ERR_OK;
 }
 
 bcmos_errno TmQIndication(bcmbal_obj *obj) {
     openolt::Indication ind;
-    std::cout << "traffic mgmt queue indication" << std::endl;
+    BCM_LOG(DEBUG, openolt_log_id, "traffic mgmt queue indication\n");
     return BCM_ERR_OK;
 }
 
 bcmos_errno TmSchedIndication(bcmbal_obj *obj) {
     openolt::Indication ind;
-    std::cout << "traffic mgmt sheduler indication" << std::endl;
+    BCM_LOG(DEBUG, openolt_log_id,  "traffic mgmt sheduler indication\n");
     return BCM_ERR_OK;
 }
 
 bcmos_errno McastGroupIndication(bcmbal_obj *obj) {
     openolt::Indication ind;
-    std::cout << "mcast group indication" << std::endl;
+    BCM_LOG(DEBUG, openolt_log_id, "mcast group indication\n");
     return BCM_ERR_OK;
 }
 
@@ -402,12 +381,8 @@
     bcmbal_subscriber_terminal_sufi_data *data =
         &(((bcmbal_subscriber_terminal_sufi*)obj)->data);
 
-    std::cout << "onu startup failure indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id
-         << ", alarm: "
-         << data->sufi_status << std::endl;
+    BCM_LOG(WARNING, openolt_log_id, "onu startup failure indication, intf_id %d, onu_id %d, alarm %d\n",
+        key->intf_id, key->sub_term_id, data->sufi_status);
 
     sufi_ind->set_intf_id(key->intf_id);
     sufi_ind->set_onu_id(key->sub_term_id);
@@ -431,13 +406,8 @@
     bcmbal_subscriber_terminal_sdi_data *data =
         &(((bcmbal_subscriber_terminal_sdi*)obj)->data);
 
-    std::cout << "onu signal degrade indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id
-         << ", alarm: "
-         << data->sdi_status
-         << ", BER : " << data->ber << std::endl;
+    BCM_LOG(WARNING, openolt_log_id, "onu signal degrade indication, intf_id %d, onu_id %d, alarm %d, BER %d\n",
+        key->intf_id, key->sub_term_id, data->sdi_status, data->ber);
 
     sdi_ind->set_intf_id(key->intf_id);
     sdi_ind->set_onu_id(key->sub_term_id);
@@ -462,14 +432,8 @@
     bcmbal_subscriber_terminal_dowi_data *data =
         &(((bcmbal_subscriber_terminal_dowi*)obj)->data);
 
-    std::cout << "onu drift of window indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id
-         << ", alarm: "
-         << data->dowi_status
-         << ", drift : " << data->drift_value
-         << "new_eqd : " << data->new_eqd << std::endl;
+    BCM_LOG(WARNING, openolt_log_id, "onu drift of window indication, intf_id %d, onu_id %d, alarm %d, drift %d, new_eqd %d\n",
+        key->intf_id, key->sub_term_id, data->dowi_status, data->drift_value, data->new_eqd);
 
     dowi_ind->set_intf_id(key->intf_id);
     dowi_ind->set_onu_id(key->sub_term_id);
@@ -495,13 +459,8 @@
     bcmbal_subscriber_terminal_looci_data *data =
         &(((bcmbal_subscriber_terminal_looci*)obj)->data);
 
-    std::cout << "onu loss of OMCI channel indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id
-         << ", alarm: "
-         << data->looci_status << std::endl;
-
+    BCM_LOG(WARNING, openolt_log_id, "onu loss of OMCI channel indication, intf_id %d, onu_id %d, alarm %d\n",
+        key->intf_id, key->sub_term_id, data->looci_status);
 
     looci_ind->set_intf_id(key->intf_id);
     looci_ind->set_onu_id(key->sub_term_id);
@@ -525,13 +484,8 @@
     bcmbal_subscriber_terminal_sfi_data *data =
         &(((bcmbal_subscriber_terminal_sfi*)obj)->data);
 
-    std::cout << "onu signals failure indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id
-         << ", alarm: "
-         << data->sfi_status
-         << ", BER: " << data->ber << std::endl;
+    BCM_LOG(WARNING, openolt_log_id,  "onu signals failure indication, intf_id %d, onu_id %d, alarm %d, BER %d\n",
+        key->intf_id, key->sub_term_id, data->sfi_status, data->ber);
 
 
     sfi_ind->set_intf_id(key->intf_id);
@@ -557,13 +511,8 @@
     bcmbal_subscriber_terminal_tiwi_data *data =
         &(((bcmbal_subscriber_terminal_tiwi*)obj)->data);
 
-    std::cout << "onu transmission interference warning indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id
-         << ", alarm: "
-         << data->tiwi_status
-         << ", drift: " << data->drift_value << std::endl;
+    BCM_LOG(WARNING, openolt_log_id,  "onu transmission interference warning indication, intf_id %d, onu_id %d, alarm %d, drift %d\n",
+        key->intf_id, key->sub_term_id, data->tiwi_status, data->drift_value);
 
     tiwi_ind->set_intf_id(key->intf_id);
     tiwi_ind->set_onu_id(key->sub_term_id);
@@ -585,10 +534,8 @@
     bcmbal_subscriber_terminal_key *key =
         &(((bcmbal_subscriber_terminal_sub_term_act_fail*)obj)->key);
 
-    std::cout << "onu activation failure indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id << std::endl;
+    BCM_LOG(WARNING, openolt_log_id, "onu activation failure indication, intf_id %d, onu_id %d\n",
+        key->intf_id, key->sub_term_id);
 
 
     activation_fail_ind->set_intf_id(key->intf_id);
@@ -609,10 +556,8 @@
     bcmbal_subscriber_terminal_key *key =
         &(((bcmbal_subscriber_terminal_processing_error*)obj)->key);
 
-    std::cout << "onu processing error indication, intf_id:"
-         << key->intf_id
-         << ", onu_id:"
-         << key->sub_term_id << std::endl;
+    BCM_LOG(WARNING, openolt_log_id, "onu processing error indication, intf_id %d, onu_id %d\n",
+        key->intf_id, key->sub_term_id);
 
 
     onu_proc_error_ind->set_intf_id(key->intf_id);
diff --git a/src/indications.h b/src/indications.h
index 774e689..db064d3 100644
--- a/src/indications.h
+++ b/src/indications.h
@@ -22,7 +22,13 @@
 #include <openolt.grpc.pb.h>
 #include "Queue.h"
 
+extern "C" {
+    #include <bcm_dev_log_task.h>
+}
+
 extern Queue<openolt::Indication> oltIndQ;
 extern grpc::Status SubscribeIndication();
+extern dev_log_id openolt_log_id;
+extern dev_log_id omci_log_id;
 
 #endif
diff --git a/src/stats_collection.cc b/src/stats_collection.cc
index 559b2c1..8afc5f2 100644
--- a/src/stats_collection.cc
+++ b/src/stats_collection.cc
@@ -93,9 +93,8 @@
         port_stats->set_bip_errors(stat.data.bip_errors);
 
     } else {
-        std::cout << "ERROR: Failed to retrieve port statistics"
-                  << " intf_id:" << key.intf_id
-                  << " intf_type:" << key.intf_type << std::endl;
+        BCM_LOG(ERROR, openolt_log_id,  "Failed to retrieve port statistics, intf_id %d, intf_type %d\n",
+            (int)key.intf_id, (int)key.intf_type);
     }
 
     port_stats->set_intf_id(interface_key_to_port_no(key));
@@ -151,16 +150,16 @@
 void stats_collection() {
 
     if (!state.is_connected()) {
-        std::cout << "Voltha is not connected, do not collect stats" << std::endl;
+        BCM_LOG(INFO, openolt_log_id, "Voltha is not connected, do not collect stats\n");
         return;
     }
     if (!state.is_activated()) {
-        std::cout << "The OLT is not up, do not collect stats" << std::endl;
+        BCM_LOG(INFO, openolt_log_id, "The OLT is not up, do not collect stats\n");
         return;
     }
 
 
-    std::cout << "Collecting statistics" << std::endl;
+    BCM_LOG(INFO, openolt_log_id, "Collecting statistics\n");
 
     //Ports statistics