fix(api): automatically switch to default log level

This commit is contained in:
lixiumei123
2022-10-27 06:52:46 +00:00
parent af29f27a66
commit 03ef8add7e
13 changed files with 125 additions and 45 deletions
+8
View File
@@ -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)
+1 -2
View File
@@ -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,
+7 -1
View File
@@ -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,
},
{
-1
View File
@@ -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;
+19 -29
View File
@@ -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);
});
}
}
+62
View File
@@ -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;
+3
View File
@@ -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;
};
+4
View File
@@ -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;
+12
View File
@@ -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);
+4
View File
@@ -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;
+4 -10
View File
@@ -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);
-1
View File
@@ -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;
+1 -1
View File
@@ -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