diff --git a/Platform/user/ulog/log-sched/log_common.c b/Platform/user/ulog/log-sched/log_common.c index 3a110f826..73064ae5f 100755 --- a/Platform/user/ulog/log-sched/log_common.c +++ b/Platform/user/ulog/log-sched/log_common.c @@ -9,6 +9,8 @@ #include "ulog_in.h" #define FILTER_CONTENT ":msg,contains,\""MODULE_FMT"\"\n" +#define DEFAULT_CONFIG_FILE_TMP "/etc/log-sched.conf.tmp" + static int copy_file(const char *src, const char *dst) { @@ -271,3 +273,147 @@ FAIL: rpc_return_error(conn, RET_ERR, str_err); } +/* 写配置到配置文件。追加在配置文件最后 */ +int write_log_file_conf(const char *p_key_str, const char *p_value_str) +{ + char conf_value_str[MAX_LINE_SZ] = ""; + + char buffer[MAX_LINE_SZ] = ""; + char *p_pos = NULL; + int is_exist = 0; + FILE *tmp_conf_fp = NULL; + + if (NULL == p_key_str || '\0' == p_key_str[0] || NULL == p_value_str) { + ULOG_ERR(g_log, "Bad input"); + return -1; + } + + /* 定位到起始位置 */ + if (fseek(g_conf_fp, 0, SEEK_SET) == -1) { + ULOG_ERR(g_log, "Seeknig config to begin is faiure:%s", strerror(errno)); + return -1; + } + + /* 查看配置是否已存在 */ + while (fgets(buffer,MAX_LINE_SZ,g_conf_fp)!=NULL) { + p_pos = strstr(buffer, p_key_str); + if (p_pos != NULL) { + memset(conf_value_str, 0, sizeof(conf_value_str)); + strcpy(conf_value_str, p_pos+strlen(p_key_str)); + + is_exist = 1; + break; + } + } + + if (is_exist == 1) { + /* 判断已有配置是否与当前传入配置相同 */ + if (strlen(conf_value_str) == strlen(p_value_str) && 0 == strcmp(conf_value_str, p_value_str)) { + /* 无需做任何变更,本函数返回 */ + return 0; + } + + /* 定位到起始位置 */ + if (fseek(g_conf_fp, 0, SEEK_SET) == -1) { + ULOG_ERR(g_log, "Seeknig config to begin is faiure:%s", strerror(errno)); + return -1; + } + + /* 打开临时文件 */ + tmp_conf_fp = fopen(DEFAULT_CONFIG_FILE_TMP, "w+"); + if (NULL == tmp_conf_fp){ + ULOG_ERR(g_log, "Open temp config file failed: %s", strerror(errno)); + return -1; + } + + /* 将原文件内容写入临时文件,但跳过当前配置相关项 */ + while (fgets(buffer,MAX_LINE_SZ,g_conf_fp)!=NULL) { + if (strstr(buffer, p_key_str) != NULL) { + continue; + } + fputs(buffer,tmp_conf_fp); + } + fflush(tmp_conf_fp); + + /* 将临时文件写回原配置文件 */ + truncate(g_conf_file, 0); + // fclose(g_conf_fp); + // g_conf_fp = fopen(g_conf_file, "w+"); + + if (fseek(g_conf_fp, 0, SEEK_SET) == -1) { + ULOG_ERR(g_log, "Seeknig config to begin is faiure:%s", strerror(errno)); + return -1; + } + + if (fseek(tmp_conf_fp, 0, SEEK_SET) == -1) { + ULOG_ERR(g_log, "Seeknig config to begin is faiure:%s", strerror(errno)); + return -1; + } + + while (fgets(buffer,MAX_LINE_SZ,tmp_conf_fp)!=NULL) { + fputs(buffer,g_conf_fp); + } + fflush(g_conf_fp); + + /* 关闭临时文件 */ + fclose(tmp_conf_fp); + tmp_conf_fp = NULL; + } + else { + /* 定位到结束位置 */ + if (fseek(g_conf_fp, 0, SEEK_END) == -1) { + ULOG_ERR(g_log, "Seeknig config to end is faiure:%s", strerror(errno)); + return -1; + } + } + + /* 向配置文件中追加配置项 */ + char fmt[MAX_LINE_SZ]=""; + snprintf(fmt, sizeof(fmt), "%s=%s\n", p_key_str, p_value_str); + ULOG_DEBUG(g_log, "Configure content is %s", fmt); + int len = strlen(fmt); + int n = fwrite(fmt, 1, len, g_conf_fp); + if (len != n) { + ULOG_ERR(g_log, "Writing conf is failure:%s", strerror(errno)); + return -1; + } + fflush(g_conf_fp); + + return 0; +} + +int get_log_file_conf(const char *key_str, char *value_str, int value_len) +{ + int ret = -1; + if (fseek(g_conf_fp, 0, SEEK_SET) == -1) { + ULOG_ERR(g_log, "Seeknig config to begin is faiure:%s", strerror(errno)); + return ret; + } + + ssize_t n, n1, n2; + char *line = NULL; + char tmp_key[MAX_LINE_SZ], tmp_value[MAX_LINE_SZ]; + while ((n1 = getline(&line, &n, g_conf_fp)) != -1) { + ULOG_DEBUG(g_log, "config file line:%s", line); + n2 = sscanf(line, "%s=%s", tmp_key, tmp_value); + if (n2 == 1) { + if (strcmp(tmp_key, key_str) == 0) { + strncpy(value_str, tmp_value, value_len); + ret = 0; + break; + } + } else if (n2 == EOF) { + ULOG_ERR(g_log, "Parsing level from configure is failure:%s", strerror(errno)); + break; + } else { + ULOG_DEBUG(g_log, "Unknown row:%s", line); + } + } + + return ret; +} + + + + + diff --git a/Platform/user/ulog/log-sched/log_common.h b/Platform/user/ulog/log-sched/log_common.h index 371eec309..a87e4a0e6 100755 --- a/Platform/user/ulog/log-sched/log_common.h +++ b/Platform/user/ulog/log-sched/log_common.h @@ -30,5 +30,8 @@ int write_conf_content_authorizing(FILE *fp, const u8 level, const char *filter_ int log_level_to_str(const u8 level, char *str, u32 len); int log_off_with_file(const char *path, const char *file_name); void rpc_conf_proc(rpc_conn *conn, pointer input, int input_len, int need_len, rpc_cb cb, void *arg); +int write_log_file_conf(const char *p_key_str, const char *p_value_str); +int get_log_file_conf(const char *key_str, char *value_str, int value_len); + #endif diff --git a/Platform/user/ulog/log-sched/log_file.c b/Platform/user/ulog/log-sched/log_file.c index e45d55a4b..a53ac6d64 100755 --- a/Platform/user/ulog/log-sched/log_file.c +++ b/Platform/user/ulog/log-sched/log_file.c @@ -27,6 +27,8 @@ #define STR_COMPRESS " compress\n" +#define LOG_CONF_KEY_FILE_MAX_SIZE_STR "file.max_size" + /* typedef struct _level_str { u32 level; @@ -94,6 +96,7 @@ static int conf_log_file(const log_file_t *conf) { int ret = -1; u32 max_level = MAX_LOG_LEVEL_VALUE; + char value_str[128] = ""; if (conf->level > max_level) { ULOG_WARNING(g_log, "Configure log level:%u more than max value:%u", conf->level, max_level); return -1; @@ -119,14 +122,27 @@ static int conf_log_file(const log_file_t *conf) return -1; } - - if (conf->del_over_size > 0) { - } + /* 将日志文件大小上限写入本程序配置文件中 */ + memset(value_str, 0, sizeof(value_str)); + sprintf(value_str, "%llu", conf->del_over_size); + if (write_log_file_conf(LOG_CONF_KEY_FILE_MAX_SIZE_STR, value_str) != 0) { + ULOG_ERR(g_log, "Del-over-size which is written is failure"); + return -1; + } ret = 0; return ret; } +static int __rpc_conf_log_file(pointer input, const void *arg, char *str_err, int str_len) +{ + if (conf_log_file((const log_file_t *)input) != 0) { + strncpy(str_err, "Configuring file of log is faiure", str_len); + return -1; + } + return 0; +} + void rpc_conf_log_file(rpc_conn *conn, pointer input, int input_len, pointer data) { u32 need_len = sizeof(log_file_t); @@ -143,5 +159,7 @@ void rpc_conf_log_file(rpc_conn *conn, pointer input, int input_len, pointer dat return; } rpc_return_null(conn); + + rpc_conf_proc(conn, input, input_len, sizeof(log_file_t), __rpc_conf_log_file, NULL); } diff --git a/Platform/user/ulog/log-sched/log_remote.c b/Platform/user/ulog/log-sched/log_remote.c index c3157d5b8..7656f6c36 100755 --- a/Platform/user/ulog/log-sched/log_remote.c +++ b/Platform/user/ulog/log-sched/log_remote.c @@ -15,7 +15,7 @@ #define RESET_SEEK(fp) fseek(fp, 0, SEEK_SET) -#define LOG_CONF_KEY_REMOTE_LEVEL "remote.level=" +#define LOG_CONF_KEY_REMOTE_LEVEL "remote.level" typedef enum { LOG_REMOTE_OP_ADD = 0, @@ -56,7 +56,7 @@ static int match_remote_config(const char *line, const void *src) ULOG_DEBUG(g_log, "The line:%s can't be parsed", line); } - return -1; + return 1; } static int remote_conf_content(FILE *fp, const u8 level, const char *filter_mod, @@ -89,6 +89,8 @@ static int remote_conf_content(FILE *fp, const u8 level, const char *filter_mod, } else if (match == 0) { ULOG_DEBUG(g_log, "Be matched"); continue; + } else { + ULOG_DEBUG(g_log, "Not be matched"); } ULOG_DEBUG(g_log, "Recover old line:%s to file:%s", line, path); @@ -197,25 +199,9 @@ static int modify_remote_conf_log_level(FILE *fp, const u8 level, const char *fi static int get_log_level() { - if (RESET_SEEK(g_conf_fp) == -1) { - ULOG_ERR(g_log, "[get log level]Seeknig config to begin is faiure:%s", strerror(errno)); - return -1; - } - - ssize_t n, n1, n2; - char *line = NULL; - u8 value; - while ((n1 = getline(&line, &n, g_conf_fp)) != -1) { - ULOG_DEBUG(g_log, "config file line:%s", line); - n2 = sscanf(line, LOG_CONF_KEY_REMOTE_LEVEL"%u", &value); - if (n2 == 1) { - return value; - } else if (n2 == EOF) { - ULOG_ERR(g_log, "Parsing level from configure is failure:%s", strerror(errno)); - return -1; - } else { - ULOG_DEBUG(g_log, "Unknown level row:%s", line); - } + char value[MAX_LINE_SZ]; + if (get_log_file_conf(LOG_CONF_KEY_REMOTE_LEVEL, value, sizeof(value)) == 0) { + return atoi(value); } return LOG_INFO; @@ -297,34 +283,24 @@ static int config_log_remote_host(const log_op_t op, const log_remote_h static int config_log_remote_level(const log_remote_level_t *level) { - if (truncate(g_conf_file, 0) == -1) { - ULOG_ERR(g_log, "Truncate configure:%s is faiure:%s", g_conf_file, strerror(errno)); + char str_level[4] = {0}; + if (snprintf(str_level, sizeof(str_level), "%u", level->level) < 0) { + ULOG_ERR(g_log, "Building level value:%u to string is failure", level->level); return -1; } - /* 定位到开始位置 */ - if (RESET_SEEK(g_conf_fp) == -1) { - ULOG_ERR(g_log, "Seeknig config to begin is faiure:%s", strerror(errno)); + if (write_log_file_conf(LOG_CONF_KEY_REMOTE_LEVEL, str_level) != 0) { + ULOG_ERR(g_log, "Writeing key-value[%s-%s] to config file is failure", LOG_CONF_KEY_REMOTE_LEVEL, str_level); return -1; } - char fmt[MAX_LINE_SZ]; - snprintf(fmt, sizeof(fmt), LOG_CONF_KEY_REMOTE_LEVEL"%u", level->level); - ULOG_DEBUG(g_log, "Configure content is %s", fmt); - int len = strlen(fmt); - int n = fwrite(fmt, 1, len, g_conf_fp); - if (len != n) { - ULOG_ERR(g_log, "Writing remote level is failure:%s", strerror(errno)); - return -1; - } - fflush(g_conf_fp); //判断是否有rsyslog的remote配置,如果有,才写入 char path[MAX_PATH_SZ]; if (snprintf(path, sizeof(path), BAK_FILE, LOG_CONF_REMOTE_FILE_NAME) < 0) { - ULOG_DEBUG(g_log, "Build backup path(%s) is failure", BAK_FILE, LOG_CONF_REMOTE_FILE_NAME); + ULOG_ERR(g_log, "Build backup path(%s) is failure", BAK_FILE, LOG_CONF_REMOTE_FILE_NAME); return -1; } if(access(path, F_OK) != 0) { - ULOG_DEBUG(g_log, "Backup file:%s is not exist:%s", path, strerror(errno)); + ULOG_ERR(g_log, "Backup file:%s is not exist:%s", path, strerror(errno)); return 1; } else { if (log_conf(level->level, LOG_CONF_PATH, LOG_CONF_REMOTE_FILE_NAME, NULL,