#include #include #include "log_file.h" #include "log_common.h" #include "ulog_in.h" #include "rpc_conn.h" #define LOG_CONF_FILE_NAME "log-file.conf" #define LOG_LOGROTATE_FILE_NAME "/etc/logrotate.d/log-syslog" #define DEFAULT_LOG_FILE "/var/log/syslog-test" #define DEFAULT_LOG_DEL_OVER_DAYS (30 * 6) #define STR_COMPRESS " compress\n" #define LOG_CONF_KEY_FILE_MAX_SIZE_STR "file.max_size" /* typedef struct _level_str { u32 level; char str[10]; } level_str_t; static level_str_t g_level_array[] = { {LOG_EMERG, "emerg"}, {LOG_ALERT, "alert"}, {LOG_CRIT, "crit"}, {LOG_ERR, "err"}, {LOG_WARNING, "warn"}, {LOG_NOTICE, "notice"}, {LOG_INFO, "info"}, {LOG_DEBUG, "debug"} }; */ #define MAX_LOG_LEVEL_VALUE (sizeof(g_level_array) / sizeof(level_str_t)) static int write_logrotate_conf(const log_file_t *conf, const char *log_path) { int ret = -1; FILE *fp = NULL; /********** logrotate **********/ char str_compress[sizeof(STR_COMPRESS)] = {0}; if (conf->is_compress == LOG_COMPRESS) { strncpy(str_compress, STR_COMPRESS, sizeof(str_compress)); } u32 days = DEFAULT_LOG_DEL_OVER_DAYS; if (conf->del_over_days > 0) { days = conf->del_over_days; } char line[1024] = {0}; if (snprintf(line, sizeof(line), LOGROTATE_CONF, log_path, days, str_compress) < 0) { ULOG_ERR(g_log, "Setting content of logratote is failure"); goto END; } fp = fopen(LOG_LOGROTATE_FILE_NAME, "w"); if (fp == NULL) { ULOG_ERR(g_log, "Opening logratate file:%s is failure:%s", LOG_CONF_FILE_NAME, strerror(errno)); goto END; } if (fputs(line, fp) == EOF) { ULOG_ERR(g_log, "Configure file of logratate which is written is failure:%s", strerror(errno)); goto END; } ret = 0; END: if (fp != NULL) { fclose(fp); } return ret; } 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; } char path[sizeof(conf->path)]; if (strlen(conf->path) > 0) { strncpy(path, conf->path, sizeof(path)); } else { strncpy(path, DEFAULT_LOG_FILE, sizeof(path)); } ULOG_DEBUG(g_log, "write_conf_content:%x", write_conf_content); if (log_conf(conf->level, LOG_CONF_PATH, LOG_CONF_FILE_NAME, NULL, write_conf_content, (void *)path) != 0) { ULOG_ERR(g_log, "Log configure which is written is failure"); return -1; } /********** logrotate **********/ if (write_logrotate_conf(conf, path) != 0) { ULOG_ERR(g_log, "Logratate configure which is written is failure"); return -1; } /* 将日志文件大小上限写入本程序配置文件中 */ memset(value_str, 0, sizeof(value_str)); if (strlen(conf->del_over_size) > 0) { sprintf(value_str, "%s", 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) { rpc_conf_proc(conn, input, input_len, sizeof(log_file_t), __rpc_conf_log_file, NULL); }