Explorar o código

Impl logger_set_format

ithewei %!s(int64=4) %!d(string=hai) anos
pai
achega
81f6e4124f
Modificáronse 2 ficheiros con 86 adicións e 8 borrados
  1. 82 8
      base/hlog.c
  2. 4 0
      base/hlog.h

+ 82 - 8
base/hlog.c

@@ -38,6 +38,7 @@ struct logger_s {
 
     int             level;
     int             enable_color;
+    char            format[64];
 
     // for file logger
     char                filepath[256];
@@ -59,6 +60,8 @@ static void logger_init(logger_t* logger) {
 
     logger->level = DEFAULT_LOG_LEVEL;
     logger->enable_color = 0;
+    logger->format[0] = '\0';
+    // strncpy(logger->format, DEFAULT_LOG_FORMAT, sizeof(logger->format));
 
     logger->fp_ = NULL;
     logger->max_filesize = DEFAULT_LOG_MAX_FILESIZE;
@@ -129,6 +132,14 @@ void logger_set_level_by_str(logger_t* logger, const char* szLoglevel) {
     logger->level = loglevel;
 }
 
+void logger_set_format(logger_t* logger, const char* format) {
+    if (format) {
+        strncpy(logger->format, format, sizeof(logger->format));
+    } else {
+        logger->format[0] = '\0';
+    }
+}
+
 void logger_set_remain_days(logger_t* logger, int days) {
     logger->remain_days = days;
 }
@@ -273,6 +284,18 @@ static void logfile_write(logger_t* logger, const char* buf, int len) {
     }
 }
 
+static int i2a(int i, char* buf, int len) {
+    for (int l = len - 1; l >= 0; --l) {
+        if (i == 0) {
+            buf[l] = '0';
+        } else {
+            buf[l] = i % 10 + '0';
+            i /= 10;
+        }
+    }
+    return len;
+}
+
 int logger_print(logger_t* logger, int level, const char* fmt, ...) {
     if (level < logger->level)
         return -10;
@@ -324,14 +347,65 @@ int logger_print(logger_t* logger, int level, const char* fmt, ...) {
         len = snprintf(buf, bufsize, "%s", pcolor);
     }
 
-    len += snprintf(buf + len, bufsize - len, "%04d-%02d-%02d %02d:%02d:%02d.%03d %s ",
-        year, month, day, hour, min, sec, ms,
-        plevel);
-
-    va_list ap;
-    va_start(ap, fmt);
-    len += vsnprintf(buf + len, bufsize - len, fmt, ap);
-    va_end(ap);
+    const char* p = logger->format;
+    if (*p) {
+        while (*p) {
+            if (*p == '%') {
+                switch(*++p) {
+                case 'y':
+                    len += i2a(year, buf + len, 4);
+                    break;
+                case 'm':
+                    len += i2a(month, buf + len, 2);
+                    break;
+                case 'd':
+                    len += i2a(day, buf + len, 2);
+                    break;
+                case 'H':
+                    len += i2a(hour, buf + len, 2);
+                    break;
+                case 'M':
+                    len += i2a(min, buf + len, 2);
+                    break;
+                case 'S':
+                    len += i2a(sec, buf + len, 2);
+                    break;
+                case 'Z':
+                    len += i2a(ms, buf + len, 3);
+                    break;
+                case 'l':
+                    buf[len++] = *plevel;
+                    break;
+                case 'L':
+                    for (int i = 0; i < 5; ++i) {
+                        buf[len++] = plevel[i];
+                    }
+                    break;
+                case 's':
+                {
+                    va_list ap;
+                    va_start(ap, fmt);
+                    len += vsnprintf(buf + len, bufsize - len, fmt, ap);
+                    va_end(ap);
+                }
+                    break;
+                default: break;
+                }
+            } else {
+                buf[len++] = *p;
+            }
+            ++p;
+        }
+    } else {
+        len += snprintf(buf + len, bufsize - len, "%04d-%02d-%02d %02d:%02d:%02d.%03d %s ",
+            year, month, day, hour, min, sec, ms,
+            plevel);
+
+        va_list ap;
+        va_start(ap, fmt);
+        len += vsnprintf(buf + len, bufsize - len, fmt, ap);
+        va_end(ap);
+    }
 
     if (logger->enable_color) {
         len += snprintf(buf + len, bufsize - len, "%s", CLR_CLR);

+ 4 - 0
base/hlog.h

@@ -63,6 +63,7 @@ typedef enum {
 
 #define DEFAULT_LOG_FILE            "libhv"
 #define DEFAULT_LOG_LEVEL           LOG_LEVEL_INFO
+#define DEFAULT_LOG_FORMAT          "%y-%m-%d %H:%M:%S.%Z %L %s"
 #define DEFAULT_LOG_REMAIN_DAYS     1
 #define DEFAULT_LOG_MAX_BUFSIZE     (1<<14)  // 16k
 #define DEFAULT_LOG_MAX_FILESIZE    (1<<24)  // 16M
@@ -85,6 +86,7 @@ HV_EXPORT void logger_set_handler(logger_t* logger, logger_handler fn);
 HV_EXPORT void logger_set_level(logger_t* logger, int level);
 // level = [VERBOSE,DEBUG,INFO,WARN,ERROR,FATAL,SILENT]
 HV_EXPORT void logger_set_level_by_str(logger_t* logger, const char* level);
+HV_EXPORT void logger_set_format(logger_t* logger, const char* format);
 HV_EXPORT void logger_set_max_bufsize(logger_t* logger, unsigned int bufsize);
 HV_EXPORT void logger_enable_color(logger_t* logger, int on);
 HV_EXPORT int  logger_print(logger_t* logger, int level, const char* fmt, ...);
@@ -110,6 +112,8 @@ HV_EXPORT void      hv_destroy_default_logger();
 #define hlog_set_file(filepath)         logger_set_file(hlog, filepath)
 #define hlog_set_level(level)           logger_set_level(hlog, level)
 #define hlog_set_level_by_str(level)    logger_set_level_by_str(hlog, level)
+#define hlog_set_handler(fn)            logger_set_handler(hlog, fn)
+#define hlog_set_format(format)         logger_set_format(hlog, format)
 #define hlog_set_max_filesize(filesize) logger_set_max_filesize(hlog, filesize)
 #define hlog_set_max_filesize_by_str(filesize) logger_set_max_filesize_by_str(hlog, filesize)
 #define hlog_set_remain_days(days)      logger_set_remain_days(hlog, days)