diff --git a/mbtk/mbtk_logd/syslog_read.c b/mbtk/mbtk_logd/syslog_read.c
index 1d6da4b..f2130ca 100755
--- a/mbtk/mbtk_logd/syslog_read.c
+++ b/mbtk/mbtk_logd/syslog_read.c
@@ -20,10 +20,13 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/un.h>
 #include <sys/socket.h>
 
 #define SYSLOG_NAMES
 #include <syslog.h>
+#include "json/json.h"
+#include "json/printbuf.h"
 
 #include <libubox/ustream.h>
 #include <libubox/blobmsg_json.h>
@@ -74,6 +77,7 @@
 static struct file_list_t file_list;
 static struct filter_list_t *filter_log = NULL;
 static char tmp_log[48] = {0};
+pthread_t attr = -1;
 
 static const char* getcodetext(int value, CODE *codetable) {
 	CODE *i;
@@ -131,6 +135,7 @@
 static int syslog_fileter_log(int pri, char *tag, struct filter_list_t *filter)
 {
     struct filter_list_t *_filter = filter;
+	struct filter_list_t *_filter_common = _filter;
 
     while(_filter)
     {
@@ -150,15 +155,16 @@
                 }
            }
         }else{ // have no tag
-            if(pri > p)
-                return -1;
-            else
-                return 0;
+			_filter_common = _filter;
         }
         _filter = _filter->next;
     }
+	//common tag
+	int p = filter_char_to_pri(_filter_common->priority);
+	if(pri > p)
+		return -1;
 
-    return -1;
+	return 0;
 }
 static int log_notify(struct blob_attr *msg)
 {
@@ -269,6 +275,177 @@
 {
 }
 
+int lynq_update_log_level()
+{
+    json_object* jsonobj = NULL;
+    json_object* tmpjson = NULL;
+    json_object* datajson = NULL;
+    json_object* listjson = NULL;
+    json_object* fileterjson = NULL;
+    json_object* fileter_listjson = NULL;
+	struct filter_list_t* filter_list_head = NULL;
+	struct filter_list_t* tmp_filter_list = NULL;
+	struct filter_list_t* _filter_list = NULL;
+
+    int n;
+	int array_length;
+    char* tmp_string = NULL;
+
+    jsonobj = json_object_from_file(LOG_CONFIG_PATH);
+    if (NULL == jsonobj) {
+        printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
+        return -1;
+    }
+    /***获取data***/
+    json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
+    datajson = json_object_array_get_idx(tmpjson, 0);//syslog index is 0
+    if (NULL == datajson) {
+        json_object_put(jsonobj);
+        return -1;
+    }
+    json_object_object_get_ex(datajson, "filter_list", &listjson);
+    if (NULL == listjson) {
+        printf("%s %d: object failure!\n", __FUNCTION__, __LINE__);
+        json_object_put(listjson);
+        return -1;
+    }
+	filter_list_head = (struct filter_list_t*)malloc(sizeof(struct filter_list_t));
+	_filter_list = filter_list_head;
+
+	array_length = json_object_array_length(listjson);
+    for (n = 0 ; n < array_length; n++) {
+            fileterjson = json_object_array_get_idx(listjson, n);
+            if (NULL == fileterjson) {
+                printf("the fileterjson exit\n");
+                free(tmp_filter_list->next);
+                tmp_filter_list->next = NULL;
+                break;
+            }
+            memset(_filter_list, 0, sizeof(struct filter_list_t));
+            json_object_object_get_ex(fileterjson, "priority", &fileter_listjson);
+            char* str = json_object_get_string(fileter_listjson);
+            if (str) {
+                _filter_list->priority = str[0];
+                printf("fileter_listjson: %c\n", _filter_list->priority);
+            }
+
+            json_object_object_get_ex(fileterjson, "tag", &fileter_listjson);
+ 
+            str = json_object_get_string(fileter_listjson);
+            if (str) {
+                _filter_list->tag = strdup(str);
+                printf("fileter_listjson: %s\n", _filter_list->tag);
+            }
+            else
+            {
+                _filter_list->tag = "\0";
+            }
+            //json_object_put(fileter_listjson);
+            _filter_list->next = (struct filter_list_t*)malloc(sizeof(struct filter_list_t));
+            if (NULL == _filter_list->next) {
+                printf("%s %d: malloc failure!\n", __FUNCTION__, __LINE__);
+                break;
+            }
+            tmp_filter_list = _filter_list;
+            _filter_list = _filter_list->next;
+			_filter_list->next = NULL;
+    }
+    /***释放json对象***/
+    json_object_put(jsonobj);
+
+	tmp_filter_list = filter_log;
+	filter_log = filter_list_head;
+
+    while(tmp_filter_list != NULL) {
+		_filter_list = tmp_filter_list;
+        free(tmp_filter_list);
+        tmp_filter_list = _filter_list->next;
+    }
+	
+    return 0;
+}
+
+
+int wait_update_log_level()
+{
+	int i = 0;
+	char recvBuff[100];
+	int serverFd,clientFd,addrLen;
+    struct sockaddr_un serverAddr,clientAddr;
+
+	pthread_detach(pthread_self());
+	printf("MBTK: in wait_update_log_level\n");
+
+    memset(&serverAddr,0,sizeof(serverAddr));
+    serverAddr.sun_family = AF_UNIX;
+    sprintf(serverAddr.sun_path,"%s","/var/log_server.socket");
+
+    unlink("/var/log_server.socket");   /* in case it already exists */
+
+    if ((serverFd = socket(AF_UNIX,SOCK_STREAM,0)) < 0)
+    {
+        printf("err -1\n");
+        return -1;
+    }
+
+    if (bind(serverFd,(struct sockaddr *)&serverAddr,sizeof(serverAddr)) < 0)
+    {
+        printf("err -2\n");
+        close(serverFd);
+        return -2;
+    }
+
+    if(listen(serverFd,10) < 0)
+    {
+        printf("err -3\n");
+        return -3;
+    }
+
+    while(1)
+    {
+        addrLen = sizeof(clientAddr);
+        memset(&clientAddr,0,sizeof(clientAddr));
+        memset(&recvBuff,0,100);
+
+        if((clientFd = accept(serverFd,(struct sockaddr*)&clientAddr,&addrLen)) < 0)
+        {
+            printf("err -4\n");
+            continue;
+        }
+		printf("MBTK: wait recv\n");
+        if(recv(clientFd,recvBuff,100,0) < 0)
+        {
+            printf("err -5");
+            close(clientFd);
+            continue;
+        }
+        if(strncmp(recvBuff, "update", strlen("update")) == 0)
+        {
+            lynq_update_log_level();
+        }
+
+        close(clientFd);
+    }
+    close(serverFd);
+
+	return 0;
+}
+
+int syslog_pthread_create()
+{
+    int ret;
+    
+	ret = pthread_create(&attr, NULL, wait_update_log_level, NULL);
+
+    if (ret < 0)
+    {
+        printf("MBTK:pthread create fail");
+        return -1;
+    }
+
+    return -1;
+}
+
 void* syslog_main(void* argv)
 {
 	static struct ubus_request req;
@@ -288,6 +465,8 @@
 	signal(SIGPIPE, SIG_IGN);
 	uloop_init();
 
+
+	syslog_pthread_create();
     //log_file = config->out_path;
 	memset(log_file, 0, sizeof(log_file));
 	memset(log_ip, 0, sizeof(log_ip));
@@ -379,6 +558,13 @@
 		uloop_done();
 
 	} while (ret && tries--);
+	
+	if (attr) {
+		if (pthread_join(attr, &tret) != 0) {
+			printf("MBTK:Join thread: %d error!\n", attr);
+			exit(1);
+		}
+	}
 
     pthread_exit(NULL);
 	return NULL;
