瀏覽代碼

add logger

ithewei 6 年之前
父節點
當前提交
12242a0ed6
共有 2 個文件被更改,包括 98 次插入77 次删除
  1. 79 70
      base/hlog.c
  2. 19 7
      base/hlog.h

+ 79 - 70
base/hlog.c

@@ -6,6 +6,8 @@
 
 #include "htime.h"  // for get_datetime
 
+static int      s_initialized = 0;
+static hlog_handler s_logger = DEFAULT_LOGGER;
 static char     s_logfile[256] = DEFAULT_LOG_FILE;
 static int      s_loglevel = DEFAULT_LOG_LEVEL;
 static bool     s_logcolor = false;
@@ -15,21 +17,76 @@ static char     s_logbuf[LOG_BUFSIZE];
 
 // for thread-safe
 #include "hmutex.h"
-#ifdef OS_WIN
 static hmutex_t  s_mutex;
-static honce_t   s_once = HONCE_INIT;
-static void WINAPI __mutex_init() {
-    hmutex_init(&s_mutex);
+
+void hlog_set_logger(hlog_handler fn) {
+    s_logger = fn;
 }
-#define HLOG_LOCK\
-    honce(&s_once, __mutex_init);\
+
+void hlog_set_level(int level) {
+    s_loglevel = level;
+}
+
+void hlog_set_remain_days(int days) {
+    s_remain_days = days;
+}
+
+int hlog_printf(int level, const char* fmt, ...) {
+    if (level < s_loglevel)
+        return -10;
+
+    datetime_t now = datetime_now();
+    const char* pcolor = "";
+    const char* plevel = "";
+#define CASE_LOG(id, str, clr) \
+    case id: plevel = str; pcolor = clr; break;
+
+    switch (level) {
+        FOREACH_LOG(CASE_LOG)
+    }
+#undef CASE_LOG
+
+    if (!s_logcolor) {
+        pcolor = "";
+    }
+
+    if (!s_initialized) {
+        s_initialized = 1;
+        hmutex_init(&s_mutex);
+    }
+
+    // lock s_logbuf, s_logger
     hmutex_lock(&s_mutex);
+    int len = snprintf(s_logbuf, LOG_BUFSIZE, "%s[%04d-%02d-%02d %02d:%02d:%02d.%03d][%s]: ",
+        pcolor,
+        now.year, now.month, now.day, now.hour, now.min, now.sec, now.ms, plevel);
 
-#else
-static hmutex_t s_mutex = PTHREAD_MUTEX_INITIALIZER;
-#define HLOG_LOCK       hmutex_lock(&s_mutex);
-#endif
-#define HLOG_UNLOCK     hmutex_unlock(&s_mutex);
+    va_list ap;
+    va_start(ap, fmt);
+    len += vsnprintf(s_logbuf + len, LOG_BUFSIZE - len, fmt, ap);
+    va_end(ap);
+
+    if (s_logcolor) {
+        len += snprintf(s_logbuf + len, LOG_BUFSIZE - len, "%s", CL_CLR);
+    }
+
+    s_logger(s_logbuf, len);
+
+    hmutex_unlock(&s_mutex);
+    return len;
+}
+
+void hlog_enable_color(int on) {
+    s_logcolor = on;
+}
+
+void stdout_logger(const char* buf, int len) {
+    fprintf(stdout, "%s\n", buf);
+}
+
+void stderr_logger(const char* buf, int len) {
+    fprintf(stderr, "%s\n", buf);
+}
 
 static void ts_logfile(time_t ts, char* buf, int len) {
     struct tm* tm = localtime(&ts);
@@ -91,6 +148,15 @@ static FILE* shift_logfile() {
     return s_logfp;
 }
 
+void file_logger(const char* buf, int len) {
+    FILE* fp = shift_logfile();
+    if (fp == NULL) return;
+    fprintf(fp, "%s\n", buf);
+    if (s_fflush) {
+        fflush(fp);
+    }
+}
+
 int hlog_set_file(const char* logfile) {
     if (logfile == NULL || strlen(logfile) == 0)    return -10;
 
@@ -104,72 +170,15 @@ int hlog_set_file(const char* logfile) {
     return 0;
 }
 
-void hlog_set_level(int level) {
-    s_loglevel = level;
-}
-
-void hlog_set_remain_days(int days) {
-    s_remain_days = days;
-}
-
-void hlog_enable_color(int on) {
-    s_logcolor = on;
-}
-
-int hlog_printf(int level, const char* fmt, ...) {
-    if (level < s_loglevel)
-        return -10;
-
-    const char* pcolor = "";
-    const char* plevel = "";
-#define CASE_LOG(id, str, clr) \
-    case id: plevel = str; pcolor = clr; break;
-
-    switch (level) {
-        FOREACH_LOG(CASE_LOG)
-    }
-#undef CASE_LOG
-
-    HLOG_LOCK
-
-    FILE* fp = shift_logfile();
-    if (fp == NULL) {
-        HLOG_UNLOCK
-        return -20;
-    }
-
-    datetime_t now = datetime_now();
-    int len = snprintf(s_logbuf, LOG_BUFSIZE, "[%04d-%02d-%02d %02d:%02d:%02d.%03d][%s]: ",
-        now.year, now.month, now.day, now.hour, now.min, now.sec, now.ms, plevel);
-
-    va_list ap;
-    va_start(ap, fmt);
-    len += vsnprintf(s_logbuf + len, LOG_BUFSIZE-len, fmt, ap);
-    va_end(ap);
-
-    if (s_logcolor) {
-        fprintf(fp, "%s%s%s\n", pcolor, s_logbuf, CL_CLR);
-    }
-    else {
-        fprintf(fp, "%s\n", s_logbuf);
-    }
-    if (s_fflush) {
-        fflush(fp);
-    }
-
-    HLOG_UNLOCK
-    return len;
-}
-
 void hlog_set_fflush(int on) {
     s_fflush = on;
 }
 
 void hlog_fflush() {
-    HLOG_LOCK
+    hmutex_lock(&s_mutex);
     FILE* fp = shift_logfile();
     if (fp) {
         fflush(fp);
     }
-    HLOG_UNLOCK
+    hmutex_unlock(&s_mutex);
 }

+ 19 - 7
base/hlog.h

@@ -44,28 +44,40 @@ enum LOG_LEVEL {
     LOG_LEVEL_SILENT
 };
 
+#define DEFAULT_LOGGER              file_logger
 #define DEFAULT_LOG_FILE            "default"
 #define DEFAULT_LOG_LEVEL           LOG_LEVEL_VERBOSE
 #define DEFAULT_LOG_REMAIN_DAYS     1
 #define LOG_BUFSIZE                 (1<<13)  // 8k
 #define MAX_LOG_FILESIZE            (1<<23)  // 8M
 
-int     hlog_set_file(const char* file);
+// logger
+typedef void (*hlog_handler)(const char* buf, int len);
+void    stderr_logger(const char* buf, int len);
+void    stdout_logger(const char* buf, int len);
+void    file_logger(const char* buf, int len);
+
+// common log settings
+void    hlog_set_logger(hlog_handler fn);
 void    hlog_set_level(int level);
 void    hlog_set_remain_days(int days);
-void    hlog_enable_color(int on);
+
 int     hlog_printf(int level, const char* fmt, ...);
+#define hlogd(fmt, ...) hlog_printf(LOG_LEVEL_DEBUG, fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
+#define hlogi(fmt, ...) hlog_printf(LOG_LEVEL_INFO,  fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
+#define hlogw(fmt, ...) hlog_printf(LOG_LEVEL_WARN,  fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
+#define hloge(fmt, ...) hlog_printf(LOG_LEVEL_ERROR, fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
+#define hlogf(fmt, ...) hlog_printf(LOG_LEVEL_FATAL, fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
 
+// below for file logger
+int     hlog_set_file(const char* file);
 // NOTE: fflush cache page => disk, slow
 // fflush, default enable
 void    hlog_set_fflush(int on);
 void    hlog_fflush();
 
-#define hlogd(fmt, ...) hlog_printf(LOG_LEVEL_DEBUG, fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
-#define hlogi(fmt, ...) hlog_printf(LOG_LEVEL_INFO,  fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
-#define hlogw(fmt, ...) hlog_printf(LOG_LEVEL_WARN,  fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
-#define hloge(fmt, ...) hlog_printf(LOG_LEVEL_ERROR, fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
-#define hlogf(fmt, ...) hlog_printf(LOG_LEVEL_FATAL, fmt " [%s:%d:%s]", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
+// below for stdout/stderr logger
+void    hlog_enable_color(int on);
 
 // below for android
 #include "hplatform.h"