summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorliuxueli <[email protected]>2018-11-15 17:10:05 +0800
committerliuxueli <[email protected]>2018-11-15 17:10:05 +0800
commit075accef5fbd934e13cc90079974dd7d8961ba9e (patch)
treef135f4879e745ef51034cc8b3d5d4183d6e6cf97 /src
同步内网版本
Diffstat (limited to 'src')
-rw-r--r--src/MESA_handle_logger.c218
-rw-r--r--src/Makefile25
2 files changed, 243 insertions, 0 deletions
diff --git a/src/MESA_handle_logger.c b/src/MESA_handle_logger.c
new file mode 100644
index 0000000..b24104b
--- /dev/null
+++ b/src/MESA_handle_logger.c
@@ -0,0 +1,218 @@
+#include "MESA_handle_logger.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include<sys/stat.h>
+
+typedef struct log_handle_t
+{
+ int runtime_log_level;
+ char runtime_log_file[1200];
+} log_handle_t;
+
+#define THREAD_CTIME(t, buf, len) thread_safe_ctime(t, buf, len)
+#define LOGMSG_MAX_LEN 4096
+
+const int HANDLE_LOGGER_VERSION_20170816 = 1;
+
+char *thread_safe_ctime(const time_t *tp, char *buf, int len)
+{
+ unsigned int year, month, day, weekday, hour, min, sec;
+ unsigned int year_days = 365;
+ unsigned int month_days[12] =
+ {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+ static unsigned char weekday_str[7][4] =
+ {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+ static unsigned char month_str[12][4] = {"Jan", "Feb", "Mar", "Apr",
+ "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+ sec = * tp;
+ min = sec / 60; sec = sec % 60;
+ hour = min / 60; min = min % 60; hour += 8;
+ day = hour / 24; hour = hour % 24;
+ weekday = day % 7; weekday = (weekday + 4) % 7;
+
+ for(year = 1970; day >= year_days;)
+ {
+ day -= year_days;
+ year ++;
+
+ if(0 == year % 4 && (0 != year % 100 || 0 == year % 400))
+ year_days = 366;
+ else year_days = 365;
+ }
+
+ if(366 == year_days) month_days[1] = 29;
+
+ //bug fix by yw 20120808
+ for(month = 0; day >= month_days[month];)
+ {
+ day -= month_days[month];
+ month ++;
+ }
+
+ /*
+ snprintf(buf, len, "%02d:%02d:%02d, %04d/%02d/%02d, %s",
+ hour, min, sec, year, month, day, weekday_str[week_day]);
+ */
+ snprintf(buf, len, "%s %s %d %02d:%02d:%02d %d", weekday_str[weekday],
+ month_str[month], day + 1, hour, min, sec, year);
+ return buf;
+}
+
+static int create_dir(const char *dir_path, int path_len)
+{
+ if(dir_path == NULL)
+ return -1;
+
+ char *buf = (char *)calloc(path_len+1, 1);
+ int ret = -1;
+
+ memcpy(buf, dir_path, path_len);
+ if(access(buf, R_OK) != 0)
+ {
+ if(mkdir(buf, 0755)!= 0)
+ ret = -1;
+ else
+ ret = 0;
+ }
+ else
+ ret = 1;
+ free(buf);
+ buf = NULL;
+ return ret;
+}
+
+static int create_path(const char *path, int path_len)
+{
+ const char *p_cur = path;
+ int i = 0;
+
+ if(create_dir(path, path_len) >= 0)
+ return 0;
+
+ for(;i<=path_len;i++,p_cur++)
+ {
+ if(*p_cur == '/')
+ {
+ if(create_dir(path, i+1) < 0)
+ return -1;
+ }
+ }
+ return 0;
+}
+
+void *MESA_create_runtime_log_handle(const char *file_path, int level)
+{
+ if(file_path == NULL)
+ return NULL;
+
+ FILE *fp = NULL;
+ log_handle_t *p_handle = NULL;
+
+ //creating file_path failed, return NULL
+ char *p_path = rindex(file_path, '/');
+ if(p_path != 0)
+ {
+ if(create_path(file_path, p_path - file_path) < 0)
+ return NULL;
+ }
+ if(NULL == (fp = fopen(file_path, "w")))
+ return NULL;
+
+ fclose(fp);
+ //remove(file_path);
+ p_handle = (log_handle_t *)calloc(sizeof(log_handle_t), 1);
+
+ if(p_handle == NULL)
+ return NULL;
+
+ strncpy(p_handle->runtime_log_file, file_path, 1024);
+ p_handle->runtime_log_file[1024] = '\0';
+ p_handle->runtime_log_level = level;
+ return (void *)p_handle;
+}
+
+void MESA_destroy_runtime_log_handle(void *handle)
+{
+ if(handle != NULL)
+ {
+ free(handle);
+ handle = NULL;
+ }
+
+ return;
+}
+
+void MESA_handle_runtime_log(void *handle, int level, const char *module, const char *fmt, ...)
+{
+ char buf[LOGMSG_MAX_LEN + 1];
+ time_t t;
+ int len;
+ va_list ap;
+ FILE *fp;
+ struct tm local_time;
+ char tmp_log_file_name[1201];
+ log_handle_t *p_handle = (log_handle_t *)handle;
+
+ if(p_handle == NULL || p_handle->runtime_log_file == NULL)return;
+
+ if(level < p_handle->runtime_log_level) return;
+
+ time(&t);
+ THREAD_CTIME(&t, buf, LOGMSG_MAX_LEN);
+ len = strlen(buf);
+
+ switch(level)
+ {
+ case RLOG_LV_DEBUG:
+ len += snprintf(buf + len,
+ LOGMSG_MAX_LEN - len, ", %s, ", "DEBUG");
+ break;
+
+ case RLOG_LV_INFO:
+ len += snprintf(buf + len,
+ LOGMSG_MAX_LEN - len, ", %s, ", "INFO");
+ break;
+
+ case RLOG_LV_FATAL:
+ len += snprintf(buf + len,
+ LOGMSG_MAX_LEN - len, ", %s, ", "FATAL");
+ break;
+
+ default:
+ len += snprintf(buf + len,
+ LOGMSG_MAX_LEN - len, ", %s, ", "UNKNOWN");
+ break;
+ }
+
+ if(0 >= LOGMSG_MAX_LEN - len) return;
+
+ len += snprintf(buf + len, LOGMSG_MAX_LEN - len, "%s, ", module);
+
+ if(0 >= LOGMSG_MAX_LEN - len) return;
+
+ va_start(ap, fmt);
+ len += vsnprintf(buf + len, LOGMSG_MAX_LEN - len, fmt, ap);
+ va_end(ap);
+
+ if(0 >= LOGMSG_MAX_LEN - len) return;
+
+ len += snprintf(buf + len, LOGMSG_MAX_LEN - len, "\n");
+
+ if(NULL == (localtime_r(&t, &local_time))) return;
+
+ sprintf(tmp_log_file_name, "%s.%04d-%02d-%02d", p_handle->runtime_log_file,
+ local_time.tm_year + 1900, local_time.tm_mon + 1,
+ local_time.tm_mday);
+
+ if(NULL == (fp = fopen(tmp_log_file_name, "a"))) return;
+
+ fprintf(fp, "%s", buf);
+ fclose(fp);
+}
+
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..a7a913c
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,25 @@
+CC=gcc
+VPATH=../inc
+CFLAGS= -g3 -Wall -fPIC -O -Werror
+CFLAGS+=-I../inc/
+
+SRC=MESA_handle_logger.c
+OBJS=$(SRC:.c=.o)
+
+TARGET=libMESA_handle_logger.a libMESA_handle_logger.so
+
+all:$(TARGET)
+ cp -f $(TARGET) ../lib
+
+libMESA_handle_logger.a:$(OBJS)
+ ar cqs $@ $<
+
+libMESA_handle_logger.so:$(OBJS)
+ $(CC) $(CFLAGS) -shared $< -o $@
+.c.o:
+
+#$(OBJS):$(SRC)
+# $(CC) $(CFLAGS) $(INC) -c $< -o $@
+
+clean :
+ rm -f $(OBJS) $(TARGET)