diff --git a/mbtk/libgsw_lib/gsw_data_interface.c b/mbtk/libgsw_lib/gsw_data_interface.c
index b12841e..96e893c 100755
--- a/mbtk/libgsw_lib/gsw_data_interface.c
+++ b/mbtk/libgsw_lib/gsw_data_interface.c
@@ -9,6 +9,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <pthread.h>
+#include "gsw_log_interface.h"
 
 
 //mbtk include
@@ -146,98 +147,9 @@
 int (*mbtk_data_call_state_get)(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6);
 int (*mbtk_apn_set)(mbtk_info_handle_t* handle, int cid, mbtk_ip_type_enum ip_type, const void* apn_name, const void *user_name, const void *user_pass, const void *auth);
 int (*ipv6_2_str)(const void *ipv6, void *ipv6_str);
-static void (*mbtk_log)(int level, const char *format, ...);
-static void (*mbtk_log_init)(char *path, char *tag);
-
-#ifndef LOG_ERR_LEVEL
-#define LOG_ERR_LEVEL  3      /* error conditions */
-#endif
-#ifndef LOG_WARN_LEVEL
-#define LOG_WARN_LEVEL 4   /* warning conditions */
-#endif
-#ifndef LOG_INFO_LEVEL
-#define LOG_INFO_LEVEL 6      /* informational */
-#endif
-#ifndef LOG_DEBUG_LEVEL
-#define LOG_DEBUG_LEVEL 7     /* debug-level messages */
-#endif
-#ifndef LOG_VERBOSE_LEVEL
-#define LOG_VERBOSE_LEVEL 8
-#endif
 
 #define GSW_DATA "[HAL][GSW_DATA]"
 
-#define LOGV(fmt, args ...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGI(fmt, args...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGD(fmt, args...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGW(fmt, args...) \
-    do{ \
-        char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-#define LOGE(fmt, args...) \
-    do{ \
-		char *file_ptr_1001 = __FILE__; \
-        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \
-        char line_1001[10] = {0}; \
-        sprintf(line_1001, "%d", __LINE__); \
-        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
-            if(*ptr_1001 == '/') \
-                 break; \
-            ptr_1001--; \
-        } \
-        mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
-    } while(0)
-
-
 //define
 #define lib_mbtk_path "/lib/libmbtk_lib.so"
 pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -253,7 +165,7 @@
     (*linkState) = (Wan_State_ind_s *)malloc(sizeof(Wan_State_ind_s));
     if((*linkState) == NULL)
     {
-        LOGE("malloc Wan_State_ind_s fail\n");
+        LOGE(GSW_DATA,"malloc Wan_State_ind_s fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -298,7 +210,7 @@
 {
     if ((*linkState) == NULL) 
     {
-        LOGE("(*linkState) is null\n");
+        LOGE(GSW_DATA,"(*linkState) is null\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -343,79 +255,67 @@
     {
         return GSW_HAL_NORMAL_FAIL;
     }
-
-    mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
-    if (mbtk_log_init == NULL) 
-    {
-        return GSW_HAL_NORMAL_FAIL;
-    }
-
-    mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
-    if (mbtk_log == NULL) 
-    {
-        return GSW_HAL_NORMAL_FAIL;
-    }
     
     mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
     if (mbtk_info_handle_get == NULL) 
     {
-        LOGE("mbtk_info_handle_get dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_info_handle_get dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
     if (mbtk_info_handle_free == NULL) 
     {
-        LOGE("mbtk_info_handle_free dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_info_handle_free dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     mbtk_pdp_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_pdp_state_change_cb_reg");
     if (mbtk_pdp_state_change_cb_reg == NULL) 
     {
-        LOGE("mbtk_pdp_state_change_cb_reg dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_pdp_state_change_cb_reg dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     mbtk_qser_apn_set = (int (*)(mbtk_info_handle_t* handle, mbtk_qser_apn_info_s *apninfo, unsigned char *cid))dlsym(dlHandle_mbtk, "mbtk_qser_apn_set");
     if (mbtk_qser_apn_set == NULL) 
     {
-        LOGE("mbtk_qser_apn_set dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_qser_apn_set dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     mbtk_data_call_start = (int (*)(mbtk_info_handle_t* handle, int cid, int auto_conn_interval, bool boot_conn, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_start");
     if (mbtk_data_call_start == NULL) 
     {
-        LOGE("mbtk_data_call_start dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_data_call_start dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     mbtk_data_call_stop = (int (*)(mbtk_info_handle_t* handle, int cid, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_stop");
     if (mbtk_data_call_stop == NULL) 
     {
-        LOGE("mbtk_data_call_stop dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_data_call_stop dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     mbtk_data_call_state_get = (int (*)(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6))dlsym(dlHandle_mbtk, "mbtk_data_call_state_get");
     if (mbtk_data_call_state_get == NULL) 
     {
-        LOGE("mbtk_data_call_state_get dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_data_call_state_get dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     mbtk_apn_set = (int (*)(mbtk_info_handle_t* handle, int cid, mbtk_ip_type_enum ip_type, const void* apn_name, const void *user_name, const void *user_pass, const void *auth))dlsym(dlHandle_mbtk, "mbtk_apn_set");
     if (mbtk_apn_set == NULL) 
     {
-        LOGE("mbtk_apn_set dlsym fail\n");
+        LOGE(GSW_DATA,"mbtk_apn_set dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     ipv6_2_str = (int (*)(const void *ipv6, void *ipv6_str))dlsym(dlHandle_mbtk, "ipv6_2_str");
     if (ipv6_2_str == NULL) 
     {
-        LOGE("ipv6_2_str dlsym fail\n");
+        LOGE(GSW_DATA,"ipv6_2_str dlsym fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -447,63 +347,63 @@
     }
 
     //ip
-    LOGD("ipv4.valid = %d", ipv4->valid);
+    LOGD(GSW_DATA,"ipv4.valid = %d", ipv4->valid);
     if(ipv4->valid)
     {
         if(linkState==NULL)
         {
-            LOGE("linkState is NULL");
+            LOGE(GSW_DATA,"linkState is NULL");
             return GSW_HAL_NORMAL_FAIL;
         }
 
         //parse ipv4_addr,gw,dns,sdns
         if(inet_ntop(AF_INET, &(ipv4->IPAddr), linkState->v4_ip , GSW_PDP_ADDR_MAX_LEN) == NULL) {
-            LOGE("IPv4 error");
+            LOGE(GSW_DATA,"IPv4 error");
         } else {
-            LOGD("IPv4 : %s", linkState->v4_ip);
+            LOGD(GSW_DATA,"IPv4 : %s", linkState->v4_ip);
             
         }
 
 
         if(inet_ntop(AF_INET, &(ipv4->GateWay), linkState->v4_gw , GSW_PDP_ADDR_MAX_LEN) == NULL) {
-            LOGE("GateWay error");
+            LOGE(GSW_DATA,"GateWay error");
         } else {
-            LOGE("GateWay : %s", linkState->v4_gw);
+            LOGE(GSW_DATA,"GateWay : %s", linkState->v4_gw);
         }
 
         if(inet_ntop(AF_INET, &(ipv4->PrimaryDNS), linkState->v4_pdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
-            LOGE("PrimaryDNS error");
+            LOGE(GSW_DATA,"PrimaryDNS error");
         } else {
-            LOGD("PrimaryDNS : %s", linkState->v4_pdns);
+            LOGD(GSW_DATA,"PrimaryDNS : %s", linkState->v4_pdns);
         }
 
         if(inet_ntop(AF_INET, &(ipv4->SecondaryDNS), linkState->v4_sdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
-            LOGE("SecondaryDNS error");
+            LOGE(GSW_DATA,"SecondaryDNS error");
         } else {
-            LOGD("SecondaryDNS : %s", linkState->v4_sdns);
+            LOGD(GSW_DATA,"SecondaryDNS : %s", linkState->v4_sdns);
         }
     }
 
-    LOGD("ipv6.valid = %d", ipv6->valid);
+    LOGD(GSW_DATA,"ipv6.valid = %d", ipv6->valid);
     if(ipv6->valid)
     {
         //parse ipv6_addr,gw,dns,sdns
         if(ipv6_2_str(&(ipv6->IPV6Addr), linkState->v6_ip)) {
-            LOGE("IPv6 error");
+            LOGE(GSW_DATA,"IPv6 error");
         } else {
-            LOGD("IPv6 : %s", linkState->v6_ip);
+            LOGD(GSW_DATA,"IPv6 : %s", linkState->v6_ip);
         }
 
         if(ipv6_2_str(&(ipv6->PrimaryDNS), linkState->v6_pdns)) {
-            LOGE("PrimaryDNS error");
+            LOGE(GSW_DATA,"PrimaryDNS error");
         } else {
-            LOGD("PrimaryDNS : %s", linkState->v6_pdns);
+            LOGD(GSW_DATA,"PrimaryDNS : %s", linkState->v6_pdns);
         }
 
         if(ipv6_2_str(&(ipv6->SecondaryDNS), linkState->v6_sdns)) {
-            LOGE("SecondaryDNS error");
+            LOGE(GSW_DATA,"SecondaryDNS error");
         } else {
-            LOGD("SecondaryDNS : %s", linkState->v6_sdns);
+            LOGD(GSW_DATA,"SecondaryDNS : %s", linkState->v6_sdns);
         }
     }
 
@@ -513,32 +413,32 @@
 
 static void data_call_state_change_cb(const void* data, int data_len)
 {
-    LOGE("data_call_state_change_cb() start\n");
+    LOGE(GSW_DATA,"data_call_state_change_cb() start\n");
 
     if(data == NULL || data_len != sizeof(mbtk_pdp_cb_info_s))
     {
-        LOGE("data = [NULL], data_len(%d) != sizeof(mbtk_pdp_cb_info_s)(%d)", data_len, sizeof(mbtk_pdp_cb_info_s));
+        LOGE(GSW_DATA,"data = [NULL], data_len(%d) != sizeof(mbtk_pdp_cb_info_s)(%d)", data_len, sizeof(mbtk_pdp_cb_info_s));
         return;
     }
 
     int ret = -1;
 
-    LOGD("Wan_State_ind_malloc start\n");
+    LOGD(GSW_DATA,"Wan_State_ind_malloc start\n");
     ret = Wan_State_ind_malloc(&linkState_arr);
     if (ret != 0) 
     {
-        LOGE("Wan_State_ind_malloc[0] fail\n");
+        LOGE(GSW_DATA,"Wan_State_ind_malloc[0] fail\n");
         return ;
     }
 
     if(linkState_arr == NULL)
     {
-        LOGE("linkState_arr is NULL");
+        LOGE(GSW_DATA,"linkState_arr is NULL");
         return ;
     }
     else
     {
-        LOGE("linkState_arr is not NULL");
+        LOGE(GSW_DATA,"linkState_arr is not NULL");
     }
 
     mbtk_pdp_cb_info_s *pdp_cb_info = (mbtk_pdp_cb_info_s *)data;
@@ -562,7 +462,7 @@
     ret = Wan_State_ind_free(&linkState_arr);
     if (ret != 0) 
     {
-        LOGE("Wan_State_ind_free fail\n");
+        LOGE(GSW_DATA,"Wan_State_ind_free fail\n");
     }
 
 }
@@ -585,7 +485,7 @@
             }
             default :
             {
-                LOGE("[%s] gsw_id(linkid) unknown.[%d]", __func__, gsw_id);
+                LOGE(GSW_DATA,"[%s] gsw_id(linkid) unknown.[%d]", __func__, gsw_id);
                 return -1;
             }
         }
@@ -608,7 +508,7 @@
             }
             default :
             {
-                LOGE("[%s] gsw_id(apnid) unknown.[%d]", __func__, gsw_id);
+                LOGE(GSW_DATA,"[%s] gsw_id(apnid) unknown.[%d]", __func__, gsw_id);
                 return -1;
             }
         }
@@ -643,21 +543,21 @@
 
     if (ret != GSW_HAL_SUCCESS) 
     {
-        LOGE("mbtk_data_api_import fail\n");
+        LOGE(GSW_DATA,"mbtk_data_api_import fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     data_info_handle = (mbtk_info_handle_t*)mbtk_info_handle_get();
     if (data_info_handle == NULL) 
     {
-        LOGE("mbtk_info_handle_get fail\n");
+        LOGE(GSW_DATA,"mbtk_info_handle_get fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     ret = mbtk_pdp_state_change_cb_reg((mbtk_info_handle_t*)data_info_handle, data_call_state_change_cb);
     if (ret != 0) 
     {
-        LOGE("mbtk_pdp_state_change_cb_reg fail\n");
+        LOGE(GSW_DATA,"mbtk_pdp_state_change_cb_reg fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -684,7 +584,7 @@
     ret = mbtk_info_handle_free((mbtk_info_handle_t**)&data_info_handle);
     if (ret != 0) 
     {
-        LOGE("mbtk_info_handle_free fail\n");
+        LOGE(GSW_DATA,"mbtk_info_handle_free fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -708,7 +608,7 @@
 
     if(LinkInf == NULL)
     {
-        LOGE("apn info is null");
+        LOGE(GSW_DATA,"apn info is null");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -722,21 +622,21 @@
     if(strcmp(LinkInf->normalProtocol,"IP") == 0)
     {
         ip_type = MBTK_IP_TYPE_IP;
-        LOGE("pdp_type(protocol) is IP");
+        LOGE(GSW_DATA,"pdp_type(protocol) is IP");
     }
     else if(strcmp(LinkInf->normalProtocol,"IPV6") == 0)
     {
         ip_type = MBTK_IP_TYPE_IPV6;
-        LOGE("pdp_type(protocol) is IPV6");
+        LOGE(GSW_DATA,"pdp_type(protocol) is IPV6");
     }
     else if(strcmp(LinkInf->normalProtocol,"IPV4V6") == 0)
     {
         ip_type = MBTK_IP_TYPE_IPV4V6;
-        LOGE("pdp_type(protocol) is IPV4V6");
+        LOGE(GSW_DATA,"pdp_type(protocol) is IPV4V6");
     }
     else
     {
-        LOGE("pdp_type(protocol) error");
+        LOGE(GSW_DATA,"pdp_type(protocol) error");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -744,7 +644,7 @@
     ret = gsw_id_convert_to_channel_id(apnid, GSW_ID_CONVERT_TYPE_APNID, &cid);
     if(0 != ret)
     {
-        LOGE("[%s] gsw_id_convert_to_channel_id() fail", __func__);
+        LOGE(GSW_DATA,"[%s] gsw_id_convert_to_channel_id() fail", __func__);
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -771,19 +671,19 @@
     else if(0 == strcmp(LinkInf->authType, "3"))
     {
         //nonsupport
-        LOGE("[%s] LinkInf->authType(3) nonsupport", __func__);
+        LOGE(GSW_DATA,"[%s] LinkInf->authType(3) nonsupport", __func__);
         return GSW_HAL_NORMAL_FAIL;
     }
     else
     {
-        LOGE("[%s] LinkInf->authType(%s) unknown", __func__, LinkInf->authType);
+        LOGE(GSW_DATA,"[%s] LinkInf->authType(%s) unknown", __func__, LinkInf->authType);
         return GSW_HAL_NORMAL_FAIL;
     }
 
     ret = mbtk_apn_set(data_info_handle, cid, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);
     if(ret != 0)
     {
-        LOGE("[%s] mbtk_apn_set fail() fail.[%d]", __func__, ret);
+        LOGE(GSW_DATA,"[%s] mbtk_apn_set fail() fail.[%d]", __func__, ret);
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -811,28 +711,28 @@
 
     if(LinkInf == NULL)
     {
-        LOGE("apn info is null");
+        LOGE(GSW_DATA,"apn info is null");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     ret = gsw_data_call_set_apn(LinkInf);
     if(ret != GSW_HAL_SUCCESS)
     {
-        LOGE("[%s] gsw_data_call_set_apn() fail", __func__);
+        LOGE(GSW_DATA,"[%s] gsw_data_call_set_apn() fail", __func__);
         return GSW_HAL_NORMAL_FAIL;
     }
 
     ret = gsw_id_convert_to_channel_id(linkid, GSW_ID_CONVERT_TYPE_LINKID, &cid);
     if(0 != ret)
     {
-        LOGE("[%s] gsw_id_convert_to_channel_id() fail", __func__);
+        LOGE(GSW_DATA,"[%s] gsw_id_convert_to_channel_id() fail", __func__);
         return GSW_HAL_NORMAL_FAIL;
     }
     
     ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, cid, 0, FALSE, 0);
     if(ret != 0)
     {
-        LOGE("[%s] mbtk_data_call_start fail.[%d]", __func__, ret);
+        LOGE(GSW_DATA,"[%s] mbtk_data_call_start fail.[%d]", __func__, ret);
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -864,21 +764,21 @@
 
     if(LinkInf == NULL)
     {
-        LOGE("apn info is null");
+        LOGE(GSW_DATA,"apn info is null");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     ret = gsw_id_convert_to_channel_id(linkid, GSW_ID_CONVERT_TYPE_LINKID, &cid);
     if(0 != ret)
     {
-        LOGE("[%s] gsw_id_convert_to_channel_id() fail", __func__);
+        LOGE(GSW_DATA,"[%s] gsw_id_convert_to_channel_id() fail", __func__);
         return GSW_HAL_NORMAL_FAIL;
     }
     
     ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, cid, 15);
     if(ret != 0)
     {
-        LOGE("[%s] mbtk_data_call_stop() fail.[%d]",__func__, ret);
+        LOGE(GSW_DATA,"[%s] mbtk_data_call_stop() fail.[%d]",__func__, ret);
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -920,7 +820,7 @@
     FILE *fp = popen(command, "r");
     if(fp == NULL)
     {
-        LOGE("popen fail\n");
+        LOGE(GSW_DATA,"popen fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -938,7 +838,7 @@
         }
         //  RX bytes
         if (strstr(buffer, "RX bytes")) {
-            LOGE("RX bytes %s\n",strstr(buffer, "RX bytes"));
+            LOGE(GSW_DATA,"RX bytes %s\n",strstr(buffer, "RX bytes"));
             sscanf(buffer, " RX bytes:%llu ", &rx_bytes);
         }
         //  RX packets
@@ -952,16 +852,16 @@
     pclose(fp);
 
     // 输出结果
-    LOGE("TX Bytes: %llu\n", tx_bytes);
-    LOGE("TX Packets: %llu\n", tx_packets);
-    LOGE("TX Dropped: %llu\n", tx_dropped);
-    LOGE("RX Bytes: %llu\n", rx_bytes);
-    LOGE("RX Packets: %llu\n", rx_packets);
-    LOGE("RX Dropped: %llu\n", rx_dropped);
+    LOGE(GSW_DATA,"TX Bytes: %llu\n", tx_bytes);
+    LOGE(GSW_DATA,"TX Packets: %llu\n", tx_packets);
+    LOGE(GSW_DATA,"TX Dropped: %llu\n", tx_dropped);
+    LOGE(GSW_DATA,"RX Bytes: %llu\n", rx_bytes);
+    LOGE(GSW_DATA,"RX Packets: %llu\n", rx_packets);
+    LOGE(GSW_DATA,"RX Dropped: %llu\n", rx_dropped);
 
     if(data_pkt == NULL)
     {
-        LOGE("data_pkt is null\n");
+        LOGE(GSW_DATA,"data_pkt is null\n");
         return GSW_HAL_NORMAL_FAIL;
     }
 
