|
@@ -38,6 +38,7 @@ struct logger_s {
|
|
|
|
|
|
|
|
int level;
|
|
int level;
|
|
|
int enable_color;
|
|
int enable_color;
|
|
|
|
|
+ char format[64];
|
|
|
|
|
|
|
|
// for file logger
|
|
// for file logger
|
|
|
char filepath[256];
|
|
char filepath[256];
|
|
@@ -59,6 +60,8 @@ static void logger_init(logger_t* logger) {
|
|
|
|
|
|
|
|
logger->level = DEFAULT_LOG_LEVEL;
|
|
logger->level = DEFAULT_LOG_LEVEL;
|
|
|
logger->enable_color = 0;
|
|
logger->enable_color = 0;
|
|
|
|
|
+ logger->format[0] = '\0';
|
|
|
|
|
+ // strncpy(logger->format, DEFAULT_LOG_FORMAT, sizeof(logger->format));
|
|
|
|
|
|
|
|
logger->fp_ = NULL;
|
|
logger->fp_ = NULL;
|
|
|
logger->max_filesize = DEFAULT_LOG_MAX_FILESIZE;
|
|
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;
|
|
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) {
|
|
void logger_set_remain_days(logger_t* logger, int days) {
|
|
|
logger->remain_days = 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, ...) {
|
|
int logger_print(logger_t* logger, int level, const char* fmt, ...) {
|
|
|
if (level < logger->level)
|
|
if (level < logger->level)
|
|
|
return -10;
|
|
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, 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) {
|
|
if (logger->enable_color) {
|
|
|
len += snprintf(buf + len, bufsize - len, "%s", CLR_CLR);
|
|
len += snprintf(buf + len, bufsize - len, "%s", CLR_CLR);
|