diff --git a/include/neuron/adapter.h b/include/neuron/adapter.h index fb0712c1..0bf16a41 100644 --- a/include/neuron/adapter.h +++ b/include/neuron/adapter.h @@ -91,6 +91,8 @@ typedef enum neu_reqresp_type { NEU_REQRESP_TRANS_DATA, NEU_REQRESP_NODES_STATE, NEU_REQRESP_NODE_DELETED, + + NEU_REQ_UPDATE_LOG_LEVEL, } neu_reqresp_type_e; typedef enum { @@ -152,6 +154,8 @@ static const char *neu_reqresp_type_string_t[] = { [NEU_REQRESP_TRANS_DATA] = "NEU_REQRESP_TRANS_DATA", [NEU_REQRESP_NODES_STATE] = "NEU_REQRESP_NODES_STATE", [NEU_REQRESP_NODE_DELETED] = "NEU_REQRESP_NODE_DELETED", + + [NEU_REQ_UPDATE_LOG_LEVEL] = "NEU_REQ_UPDATE_LOG_LEVEL", }; inline static const char *neu_reqresp_type_string(neu_reqresp_type_e type) @@ -416,6 +420,10 @@ typedef struct { char node[NEU_NODE_NAME_LEN]; } neu_reqresp_node_deleted_t; +typedef struct neu_req_update_log_level { + char node[NEU_NODE_NAME_LEN]; +} neu_req_update_log_level_t; + void *neu_msg_gen(neu_reqresp_head_t *header, void *data); inline static void neu_msg_exchange(neu_reqresp_head_t *header) diff --git a/include/neuron/errcodes.h b/include/neuron/errcodes.h index f3c7ba68..6fdc2b3c 100644 --- a/include/neuron/errcodes.h +++ b/include/neuron/errcodes.h @@ -44,8 +44,7 @@ typedef enum { NEU_ERR_FILE_NOT_EXIST = 1011, NEU_ERR_INVALID_PASSWORD_LEN = 1012, NEU_ERR_DUPLICATE_PASSWORD = 1013, - NEU_ERR_LOG_LEVEL_IS_WRONG = 1014, - NEU_ERR_COMMAND_EXECUTION_FAILED = 1015, + NEU_ERR_COMMAND_EXECUTION_FAILED = 1014, NEU_ERR_NODE_EXIST = 2002, NEU_ERR_NODE_NOT_EXIST = 2003, diff --git a/plugins/restful/handle.c b/plugins/restful/handle.c index f6fd247d..a35e20f2 100644 --- a/plugins/restful/handle.c +++ b/plugins/restful/handle.c @@ -104,6 +104,12 @@ struct neu_rest_handler cors_handler[] = { { .url = "/api/v2/password", }, + { + .url = "/api/v2/logs", + }, + { + .url = "/api/v2/log/level", + }, }; struct neu_rest_handler api_handlers[] = { @@ -290,7 +296,7 @@ struct neu_rest_handler api_handlers[] = { { .method = NEU_REST_METHOD_PUT, .type = NEU_REST_HANDLER_FUNCTION, - .url = "/api/v2/level", + .url = "/api/v2/log/level", .value.handler = handle_log_level, }, { diff --git a/plugins/restful/http.c b/plugins/restful/http.c index 73e65786..ff193b5a 100644 --- a/plugins/restful/http.c +++ b/plugins/restful/http.c @@ -327,7 +327,6 @@ int http_response(nng_aio *aio, neu_err_code_e code, char *content) case NEU_ERR_LICENSE_NOT_FOUND: case NEU_ERR_GROUP_NOT_EXIST: case NEU_ERR_GROUP_NOT_SUBSCRIBE: - case NEU_ERR_LOG_LEVEL_IS_WRONG: case NEU_ERR_COMMAND_EXECUTION_FAILED: status = NNG_HTTP_STATUS_NOT_FOUND; break; diff --git a/plugins/restful/log_handle.c b/plugins/restful/log_handle.c index 356898b0..82a4a925 100644 --- a/plugins/restful/log_handle.c +++ b/plugins/restful/log_handle.c @@ -123,11 +123,11 @@ void handle_logs_files(nng_aio *aio) void handle_log_level(nng_aio *aio) { + neu_plugin_t *plugin = neu_rest_get_plugin(); + REST_PROCESS_HTTP_REQUEST_VALIDATE_JWT( aio, neu_json_update_log_level_req_t, neu_json_decode_update_log_level_req, { - int lev = 0; - char level[NEU_LOG_LEVEL_LEN] = { 0 }; char node_name[NEU_NODE_NAME_LEN] = { 0 }; UT_array *log_files = collect_log_files(); @@ -140,42 +140,32 @@ void handle_log_level(nng_aio *aio) } } - strcpy(level, req->level); - if (strcmp(level, "DEBUG") == 0) { - lev = ZLOG_LEVEL_DEBUG; - } else if (strcmp(level, "INFO") == 0) { - lev = ZLOG_LEVEL_INFO; - } else if (strcmp(level, "WARN") == 0) { - lev = ZLOG_LEVEL_WARN; - } else if (strcmp(level, "ERROR") == 0) { - lev = ZLOG_LEVEL_ERROR; - } else if (strcmp(level, "NOTICE") == 0) { - lev = ZLOG_LEVEL_NOTICE; - } else if (strcmp(level, "FATAL") == 0) { - lev = ZLOG_LEVEL_FATAL; - } - if (strlen(node_name) == 0) { NEU_JSON_RESPONSE_ERROR(NEU_ERR_NODE_NOT_EXIST, { http_response(aio, error_code.error, result_error); }); - } else if (lev == 0) { - NEU_JSON_RESPONSE_ERROR(NEU_ERR_LOG_LEVEL_IS_WRONG, { - http_response(aio, error_code.error, result_error); - }); } else { - zlog_category_t *ct = zlog_get_category(node_name); + int ret = 0; + neu_reqresp_head_t header = { 0 }; + neu_req_update_log_level_t cmd = { 0 }; + zlog_category_t * ct = zlog_get_category(node_name); - int rv = zlog_level_switch(ct, lev); - - if (rv != 0) { - nlog_error("Modify log level fail"); + ret = zlog_level_switch(ct, ZLOG_LEVEL_DEBUG); + if (ret != 0) { + nlog_error("Modify log level fail, ret: %d", ret); NEU_JSON_RESPONSE_ERROR(NEU_ERR_EINTERNAL, { http_response(aio, error_code.error, result_error); }); - } else { - NEU_JSON_RESPONSE_ERROR(NEU_ERR_SUCCESS, { - http_response(aio, NEU_ERR_SUCCESS, result_error); + } + + header.ctx = aio; + header.type = NEU_REQ_UPDATE_LOG_LEVEL; + strcpy(cmd.node, req->node_name); + + ret = neu_plugin_op(plugin, header, &cmd); + if (ret != 0) { + NEU_JSON_RESPONSE_ERROR(NEU_ERR_IS_BUSY, { + http_response(aio, NEU_ERR_IS_BUSY, result_error); }); } } diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 5c1d9d3a..b7902324 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -55,6 +55,7 @@ static int adapter_update_metric(neu_adapter_t *adapter, inline static void reply(neu_adapter_t *adapter, neu_reqresp_head_t *header, void *data); static int update_timestamp(void *usr_data); +static int level_check(void *usr_data); static const adapter_callbacks_t callback_funs = { .command = adapter_command, @@ -80,6 +81,8 @@ static const adapter_callbacks_t callback_funs = { neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) { + extern char log_init_config[128]; + int rv = 0; neu_adapter_t * adapter = NULL; neu_event_io_param_t param = { 0 }; @@ -89,6 +92,12 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) .cb = update_timestamp, }; + neu_event_timer_param_t timer_level = { + .second = 30, + .millisecond = 0, + .cb = level_check, + }; + switch (info->module->type) { case NEU_NA_TYPE_DRIVER: adapter = (neu_adapter_t *) neu_adapter_driver_create(); @@ -107,6 +116,8 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) adapter->cb_funs.update_metric = callback_funs.update_metric; adapter->module = info->module; + adapter->timestamp_lev = 0; + rv = nng_pair1_open(&adapter->sock); assert(rv == 0); nng_socket_set_int(adapter->sock, NNG_OPT_RECVBUF, 128); @@ -138,6 +149,10 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) common->log = zlog_get_category(adapter->name); strcpy(common->name, adapter->name); + if (0 == strcmp(log_init_config, "./config/zlog.conf")) { + zlog_level_switch(common->log, ZLOG_LEVEL_INFO); + } + adapter->module->intf_funs->init(adapter->plugin); if (adapter_load_setting(adapter->name, &adapter->setting) == 0) { if (adapter->module->intf_funs->setting(adapter->plugin, @@ -161,6 +176,8 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) rv = nng_dial(adapter->sock, neu_manager_get_url(), &adapter->dialer, 0); assert(rv == 0); + timer_level.usr_data = (void *) adapter; + adapter->timer_lev = neu_event_add_timer(adapter->events, timer_level); timer_param.usr_data = (void *) adapter; adapter->timer = neu_event_add_timer(adapter->events, timer_param); @@ -297,6 +314,11 @@ static int adapter_command(neu_adapter_t *adapter, neu_reqresp_head_t header, strcpy(header.receiver, cmd->node); break; } + case NEU_REQ_UPDATE_LOG_LEVEL: { + neu_req_update_log_level_t *cmd = (neu_req_update_log_level_t *) data; + strcpy(header.receiver, cmd->node); + break; + } default: break; } @@ -707,6 +729,19 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) } break; } + case NEU_REQ_UPDATE_LOG_LEVEL: { + neu_resp_error_t error = { 0 }; + + struct timeval tv = { 0 }; + gettimeofday(&tv, NULL); + adapter->timestamp_lev = tv.tv_sec; + + neu_msg_exchange(header); + header->type = NEU_RESP_ERROR; + reply(adapter, header, &error); + + break; + } default: assert(false); @@ -754,6 +789,7 @@ int neu_adapter_uninit(neu_adapter_t *adapter) } neu_event_del_timer(adapter->events, adapter->timer); + neu_event_del_timer(adapter->events, adapter->timer_lev); nlog_info("Stop the adapter(%s)", adapter->name); return 0; @@ -986,6 +1022,29 @@ inline static void reply(neu_adapter_t *adapter, neu_reqresp_head_t *header, nng_sendmsg(adapter->sock, msg, 0); } +static int level_check(void *usr_data) +{ + neu_adapter_t *adapter = (neu_adapter_t *) usr_data; + + if (0 != adapter->timestamp_lev) { + struct timeval tv = { 0 }; + int64_t diff = 0; + int64_t delay_s = 600; + zlog_category_t *ct = zlog_get_category(adapter->name); + + gettimeofday(&tv, NULL); + diff = tv.tv_sec - adapter->timestamp_lev; + if (delay_s <= diff) { + int ret = zlog_level_switch(ct, ZLOG_LEVEL_INFO); + if (0 != ret) { + nlog_error("Modify default log level fail, ret:%d", ret); + } + } + } + + return 0; +} + static int update_timestamp(void *usr_data) { neu_adapter_t *adapter = (neu_adapter_t *) usr_data; @@ -1139,6 +1198,9 @@ void *neu_msg_gen(neu_reqresp_head_t *header, void *data) case NEU_RESP_GET_DRIVER_GROUP: data_size = sizeof(neu_resp_get_driver_group_t); break; + case NEU_REQ_UPDATE_LOG_LEVEL: + data_size = sizeof(neu_req_update_log_level_t); + break; default: assert(false); break; diff --git a/src/adapter/adapter_internal.h b/src/adapter/adapter_internal.h index c509d95a..e4edf4fd 100644 --- a/src/adapter/adapter_internal.h +++ b/src/adapter/adapter_internal.h @@ -52,6 +52,9 @@ struct neu_adapter { neu_event_timer_t *timer; int recv_fd; + neu_event_timer_t *timer_lev; + int64_t timestamp_lev; + // metrics neu_node_metrics_t *metrics; }; diff --git a/src/argparse.c b/src/argparse.c index 8004bf79..6e1a9b90 100644 --- a/src/argparse.c +++ b/src/argparse.c @@ -33,6 +33,8 @@ #include "persist/persist.h" #include "version.h" +char log_init_config[128] = { 0 }; + #define OPTIONAL_ARGUMENT_IS_PRESENT \ ((optarg == NULL && optind < argc && argv[optind][0] != '-') \ ? (bool) (optarg = argv[optind++]) \ @@ -228,6 +230,8 @@ void neu_cli_args_init(neu_cli_args_t *args, int argc, char *argv[]) goto quit; } + strncpy(log_init_config, log_init_file, strlen(log_init_file)); + // passing information by global variable is not a good style g_config_dir = args->config_dir; g_plugin_dir = args->plugin_dir; diff --git a/src/core/manager.c b/src/core/manager.c index 44a5c54b..9bc2e726 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -562,6 +562,18 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) case NEU_RESP_ERROR: case NEU_RESP_READ_GROUP: forward_msg(manager, msg, header->receiver); + break; + case NEU_REQ_UPDATE_LOG_LEVEL: + if (neu_node_manager_find(manager->node_manager, header->receiver) == + NULL) { + neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST }; + header->type = NEU_RESP_ERROR; + neu_msg_exchange(header); + reply(manager, header, &e); + } else { + forward_msg(manager, msg, header->receiver); + } + break; default: assert(false); diff --git a/src/main.c b/src/main.c index af288ad7..90f74c94 100644 --- a/src/main.c +++ b/src/main.c @@ -100,6 +100,10 @@ int main(int argc, char *argv[]) zlog_init(args.log_init_file); neuron = zlog_get_category("neuron"); + if (0 == strcmp(args.log_init_file, "./config/zlog.conf")) { + zlog_level_switch(neuron, ZLOG_LEVEL_INFO); + } + if (neuron_already_running()) { nlog_fatal("neuron process already running, exit."); rv = -1; diff --git a/src/parser/neu_json_log.c b/src/parser/neu_json_log.c index d35897f2..612d4536 100644 --- a/src/parser/neu_json_log.c +++ b/src/parser/neu_json_log.c @@ -43,13 +43,9 @@ int neu_json_decode_update_log_level_req( } neu_json_elem_t req_elems[] = { { - .name = "level", - .t = NEU_JSON_STR, - }, - { - .name = "node_name", - .t = NEU_JSON_STR, - } }; + .name = "node", + .t = NEU_JSON_STR, + } }; ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems), req_elems); @@ -57,8 +53,7 @@ int neu_json_decode_update_log_level_req( goto decode_fail; } - req->level = req_elems[0].v.val_str; - req->node_name = req_elems[1].v.val_str; + req->node_name = req_elems[0].v.val_str; *result = req; goto decode_exit; @@ -76,7 +71,6 @@ decode_exit: void neu_json_decode_update_log_level_req_free( neu_json_update_log_level_req_t *req) { - free(req->level); free(req->node_name); free(req); diff --git a/src/parser/neu_json_log.h b/src/parser/neu_json_log.h index 3ba6caf5..323f10cd 100644 --- a/src/parser/neu_json_log.h +++ b/src/parser/neu_json_log.h @@ -34,7 +34,6 @@ extern "C" { typedef char *neu_json_get_log_resp_row_t; typedef struct { - char *level; char *node_name; } neu_json_update_log_level_req_t; diff --git a/zlog.conf b/zlog.conf index 66e7dd48..13e1a261 100644 --- a/zlog.conf +++ b/zlog.conf @@ -8,4 +8,4 @@ simple = "%d [%V] %f:%L %m%n" [rules] -*.INFO "./logs/%c.log", 10MB * 3 ~ "./logs/%c.#2s.log"; simple +*.* "./logs/%c.log", 10MB * 3 ~ "./logs/%c.#2s.log"; simple