Add aaa-12 补充日志文件配置获取的元素

RCA:
SOL:
修改人:liangxia
检视人:
This commit is contained in:
liangxia 2019-09-04 08:52:16 +08:00
parent 71afb103cc
commit 088b12d8b1
5 changed files with 289 additions and 30 deletions

View File

@ -19,6 +19,16 @@
#define CONF_LOG_REMOTE_DEL_HOST_FUNC "conf_log_del_remote"
#define CONF_LOG_REMOTE_LEVEL_FUNC "conf_log_remote_level"
#define LOGROTATE_CONF "%s\n" \
"{\n" \
" rotate %u\n" \
" daily\n" \
" missingok\n" \
"%s" \
" postrotate\n" \
" /usr/lib/rsyslog/rsyslog-rotate\n" \
" endscript\n" \
"}"
typedef struct _level_str {
u32 level;
char str[10];

View File

@ -99,8 +99,13 @@ int cm_log_check_file_is_exist(const char *file_str)
}
/* 适用于log-console.conf与log-pty.conf的解析 */
ret_code cm_log_get_module_from_file(const char *file_str, char *value_str, int value_len)
/* 适用于log-console.conf、log-pty.conf的解析
* :
* :msg,contains,"[module_test]"
* *.=emerg;*.=alert;*.=crit;*.=err;*.=warn;*.=notice;*.=info;*.=debug /dev/pts/0
* : module_test
*/
ret_code cm_log_get_module_from_file(const char *file_str, char *value_str, uint value_len)
{
ret_code ret = RET_ERR;
FILE *fp = NULL;
@ -108,7 +113,7 @@ ret_code cm_log_get_module_from_file(const char *file_str, char *value_str, int
char *pos2 = NULL;
size_t tmp_len = 0;
if (NULL == file_str || '\0' == file_str[0] || (NULL == value_str && value_len>0))
if (NULL == file_str || '\0' == file_str[0] || NULL == value_str || 0 == value_len)
{
ULOG_ERR(g_log_h, "get log module from file: bad input");
return ret;
@ -154,7 +159,11 @@ ret_code cm_log_get_module_from_file(const char *file_str, char *value_str, int
return ret;
}
/* 适用于log-console.conf与log-pty.conf的解析 */
/* 适用于log-console.conf、log-pty.conf、log-file.conf的解析
* :
* *.=emerg;*.=alert;*.=crit;*.=err;*.=warn;*.=notice;*.=info;*.=debug /dev/ttyS0
* : debug
*/
ret_code cm_log_get_level_from_file(const char *file_str, u8 *value)
{
ret_code ret = RET_ERR;
@ -212,11 +221,19 @@ ret_code cm_log_get_level_from_file(const char *file_str, u8 *value)
pos = sub_line+strlen(".=");
}
pos2 = strstr(pos, " ");
if (pos != NULL && pos2 != NULL)
if (pos != NULL)
{
pos2 = strstr(pos, " ");
if (pos2 != NULL)
{
tmp_len = pos2-pos;
}
else
{
tmp_len = strlen(pos);
}
strncpy(tmp_str, pos, tmp_len);
tmp_str[tmp_len] = '\0';
@ -241,3 +258,93 @@ ret_code cm_log_get_level_from_file(const char *file_str, u8 *value)
}
/* 适用于log-file.conf的解析
* :
* *.=emerg;*.=alert;*.=crit;*.=err;*.=warn;*.=notice;*.=info;*.=debug /etc/rsyslog.d/filetest.conf
* : /etc/rsyslog.d/filetest.conf
*/
ret_code cm_log_get_path_from_file(const char *file_str, char *value_str, uint value_len)
{
ret_code ret = RET_ERR;
FILE *fp = NULL;
ssize_t n;
char *line = NULL;
char *sub_line = NULL;
char *pos = NULL;
size_t tmp_len = 0;
if (NULL == file_str || '\0' == file_str[0] || NULL == value_str || 0 == value_len)
{
ULOG_ERR(g_log_h, "get log path from file: bad input");
return ret;
}
fp = fopen(file_str, "r");
if (NULL == fp)
{
return ret;
}
if (fseek(fp, 0, SEEK_SET) == -1)
{
ULOG_ERR(g_log_h, "Seeknig config to begin is faiure:%s", strerror(errno));
fclose(fp);
return ret;
}
while ((getline(&line, &n, fp)) != -1)
{
pos = line;
if (NULL == strstr(pos, ".="))
{
continue;
}
/* 找到最后一个空格 */
while (1)
{
sub_line = strstr(pos, " ");
if (NULL == sub_line)
{
break;
}
if (strlen(sub_line) <= strlen(" "))
{
break;
}
pos = sub_line+strlen(" ");
}
if (pos != NULL)
{
tmp_len = strlen(pos);
if (tmp_len < value_len)
{
strncpy(value_str, pos, tmp_len);
value_str[tmp_len] = '\0';
/* 需要滤除掉行尾的换行符 */
if ('\n' == value_str[tmp_len-1])
{
value_str[tmp_len-1] = '\0';
}
}
break;
}
}
ret = RET_OK;
if (NULL != fp)
{
fclose(fp);
}
return ret;
}

View File

@ -55,10 +55,23 @@ ret_code log_rpc_exec(char* service_name, char* method_name, pointer input, int
ret_code cm_log_get_keyvalue_from_file(const char *file_str, const char *key_str, char *value_str, int value_len);
int cm_log_check_file_is_exist(const char *file_str);
ret_code cm_log_get_module_from_file(const char *file_str, char *value_str, int value_len);
ret_code cm_log_get_module_from_file(const char *file_str, char *value_str, uint value_len);
ret_code cm_log_get_level_from_file(const char *file_str, u8 *value);
ret_code cm_log_get_path_from_file(const char *file_str, char *value_str, uint value_len);
#ifndef CM_LOG_CONF_LOG_SCHED_FILE
#define CM_LOG_CONF_LOG_SCHED_FILE "/etc/log-sched.conf"
#endif
#ifndef CM_LOG_CONF_LOGROTATE_FILE
#define CM_LOG_CONF_LOGROTATE_FILE "/etc/logrotate.d/log-syslog"
#endif
#ifndef CM_LOG_CONF_LOGFILE_FILE
#define CM_LOG_CONF_LOGFILE_FILE "/etc/rsyslog.d/log-file.conf"
#endif
#ifndef CM_LOG_CONF_CONSOLE_FILE
#define CM_LOG_CONF_CONSOLE_FILE "/etc/rsyslog.d/log-console.conf"
#endif
@ -72,11 +85,7 @@ ret_code cm_log_get_level_from_file(const char *file_str, u8 *value);
#endif
#ifndef CM_LOG_CONF_REMOTE_LEVEL_FILE
#define CM_LOG_CONF_REMOTE_LEVEL_FILE "/etc/log-sched.conf"
#endif
#ifndef CM_LOG_CONF_LOGFILE_FILE
#define CM_LOG_CONF_LOGFILE_FILE "/etc/log-sched.conf"
#define CM_LOG_CONF_REMOTE_LEVEL_FILE CM_LOG_CONF_LOG_SCHED_FILE
#endif
#endif

View File

@ -1,3 +1,4 @@
#include <errno.h>
#include "log_config.h"
#include "log_config_cm.h"
#include "rpc.h"
@ -27,9 +28,129 @@ ret_code log_file_config_proc(uint source, uint config_type,
}
static ret_code cm_log_get_logrotate_conf(const char *file_str, log_file_t *ret_conf)
{
ret_code ret = RET_ERR;
FILE *fp = NULL;
ssize_t n;
char *line = NULL;
char *pos = NULL;
if (NULL == file_str || '\0' == file_str[0]
|| NULL == ret_conf)
{
ULOG_ERR(g_log_h, "get logrotate conf from file: bad input");
}
memset(ret_conf, 0, sizeof(*ret_conf));
fp = fopen(file_str, "r");
if (NULL == fp)
{
return ret;
}
if (fseek(fp, 0, SEEK_SET) == -1)
{
ULOG_ERR(g_log_h, "Seeknig config to begin is faiure:%s", strerror(errno));
goto END;
}
/* 解析日志存放路径,位于文件首行 */
if ((getline(&line, &n, fp)) == -1 || NULL == line || strlen(line) == 0)
{
ULOG_DEBUG(g_log_h, "File %s is empty", file_str);
goto END;
}
else
{
strncpy(ret_conf->path, line, strlen(line));
ret_conf->path[strlen(line)] = '\0';
/* 需要滤除掉行尾的换行符 */
if ('\n' == ret_conf->path[strlen(line)-1])
{
ret_conf->path[strlen(line)-1] = '\0';
}
}
/* 跳过 “{” 行 */
if (getline(&line, &n, fp) == -1)
{
goto END;
}
/* 解析日志存放最大天数 */
if ((getline(&line, &n, fp)) != -1)
{
pos = strstr(line, "rotate ");
if (NULL == pos)
{
goto END;
}
if (strlen(pos) == strlen("rotate "))
{
goto END;
}
pos += strlen("rotate ");
/* 需要滤除掉行尾的换行符 */
if ('\n' == pos[strlen(pos)-1])
{
pos[strlen(pos)-1] = '\0';
}
ret_conf->del_over_days = (uint)atoi(pos);
}
else
{
goto END;
}
/* 跳过 “daily” 行 */
if (getline(&line, &n, fp) == -1)
{
goto END;
}
/* 跳过 missingok 行 */
if (getline(&line, &n, fp) == -1)
{
goto END;
}
/* 解析日志是否压缩 */
if ((getline(&line, &n, fp)) != -1)
{
if (NULL != strstr(line, "compress"))
{
ret_conf->is_compress = LOG_COMPRESS;
}
else
{
ret_conf->is_compress = LOG_UNCOMPRESS;
}
}
ret = RET_OK;
END:
if (NULL != fp)
{
fclose(fp);
}
return ret;
}
static ret_code cm_get_log_file_elems(log_file_t *log_file_conf, int *err_no)
{
char value[MAX_LINE_SZ] = "";
char value_str[MAX_LINE_SZ] = "";
u8 tmp_level = 6; /* INFO */
log_file_t tmp_file_conf = {0};
if (NULL == log_file_conf || NULL == err_no)
{
@ -38,16 +159,39 @@ static ret_code cm_get_log_file_elems(log_file_t *log_file_conf, int *err_no)
memset(log_file_conf, 0, sizeof(*log_file_conf));
/* level、path、is_compress、del_over_days暂未实现 */
/* 日志记录级别level */
if (cm_log_get_level_from_file(CM_LOG_CONF_LOGFILE_FILE, &tmp_level) == 0)
{
log_file_conf->level = tmp_level;
}
/* 日志记录路径path */
memset(value_str, 0, MAX_LINE_SZ);
if (cm_log_get_path_from_file(CM_LOG_CONF_LOGFILE_FILE, value_str, MAX_PATH_SZ) == 0)
{
memset(log_file_conf->path, 0, MAX_PATH_SZ);
strncpy(log_file_conf->path, value_str, strlen(value_str));
}
/* 日志文件是否压缩is_compress
* del_over_days */
if (cm_log_check_file_is_exist(CM_LOG_CONF_CONSOLE_FILE) == 1)
{
if (RET_OK == cm_log_get_logrotate_conf(CM_LOG_CONF_LOGROTATE_FILE, &tmp_file_conf))
{
log_file_conf->is_compress = tmp_file_conf.is_compress;
log_file_conf->del_over_days = tmp_file_conf.del_over_days;
}
}
/* 日志文件大小上限del_over_size */
memset(value, 0, MAX_LINE_SZ);
if (cm_log_get_keyvalue_from_file(CM_LOG_CONF_LOGFILE_FILE, LOG_CONF_KEY_FILE_MAX_SIZE_STR, value, sizeof(value)) == 0)
memset(value_str, 0, MAX_LINE_SZ);
if (cm_log_get_keyvalue_from_file(CM_LOG_CONF_LOG_SCHED_FILE, LOG_CONF_KEY_FILE_MAX_SIZE_STR, value_str, sizeof(value_str)) == 0)
{
if (strlen(value) < MAX_U64_SZ)
if (strlen(value_str) < MAX_U64_SZ)
{
memset(log_file_conf->del_over_size, 0, MAX_U64_SZ);
strncpy(log_file_conf->del_over_size, value, strlen(value));
strncpy(log_file_conf->del_over_size, value_str, strlen(value_str));
}
}

View File

@ -14,17 +14,6 @@
#define DEFAULT_LOG_FILE "/var/log/syslog-test"
#define DEFAULT_LOG_DEL_OVER_DAYS (30 * 6)
#define LOGROTATE_CONF "%s\n" \
"{\n" \
" rotate %u\n" \
" daily\n" \
" missingok\n" \
"%s" \
" postrotate\n" \
" /usr/lib/rsyslog/rsyslog-rotate\n" \
" endscript\n" \
"}"
#define STR_COMPRESS " compress\n"
#define LOG_CONF_KEY_FILE_MAX_SIZE_STR "file.max_size"