mirror of
https://github.com/emqx/neuron.git
synced 2026-10-16 20:30:39 +08:00
fix(api): automatically switch to default log level
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user