From c46051185f7f55194edc01b008fe04c478df0fff Mon Sep 17 00:00:00 2001 From: Shriniwas Sharma Date: Sat, 25 Aug 2018 03:12:43 +0200 Subject: [PATCH 1/5] Enhancements * Separate log levels for file and console logging * Exposing function to get log level names --- src/log.c | 23 +++++++++++++++-------- src/log.h | 5 ++++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/log.c b/src/log.c index 2e183b0..b5e1361 100644 --- a/src/log.c +++ b/src/log.c @@ -32,7 +32,8 @@ static struct { void *udata; log_LockFn lock; FILE *fp; - int level; + int console_level; + int file_level; int quiet; } L; @@ -47,6 +48,9 @@ static const char *level_colors[] = { }; #endif +const char* getLevelName(int level) { + return level_names[level]; +} static void lock(void) { if (L.lock) { @@ -77,10 +81,13 @@ void log_set_fp(FILE *fp) { } -void log_set_level(int level) { - L.level = level; +void log_set_console_level(int level) { + L.console_level = level; } +void log_set_file_level(int level) { + L.file_level = level; +} void log_set_quiet(int enable) { L.quiet = enable ? 1 : 0; @@ -88,7 +95,7 @@ void log_set_quiet(int enable) { void log_log(int level, const char *file, int line, const char *fmt, ...) { - if (level < L.level) { + if (level < L.console_level && level < L.file_level) { return; } @@ -100,10 +107,10 @@ void log_log(int level, const char *file, int line, const char *fmt, ...) { struct tm *lt = localtime(&t); /* Log to stderr */ - if (!L.quiet) { + if (!L.quiet && level >= L.console_level) { va_list args; - char buf[16]; - buf[strftime(buf, sizeof(buf), "%H:%M:%S", lt)] = '\0'; + char buf[24]; + buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt)] = '\0'; #ifdef LOG_USE_COLOR fprintf( stderr, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ", @@ -119,7 +126,7 @@ void log_log(int level, const char *file, int line, const char *fmt, ...) { } /* Log to file */ - if (L.fp) { + if (L.fp && level >= L.file_level) { va_list args; char buf[32]; buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt)] = '\0'; diff --git a/src/log.h b/src/log.h index b3df494..53c60db 100644 --- a/src/log.h +++ b/src/log.h @@ -27,9 +27,12 @@ enum { LOG_TRACE, LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR, LOG_FATAL }; void log_set_udata(void *udata); void log_set_lock(log_LockFn fn); void log_set_fp(FILE *fp); -void log_set_level(int level); +void log_set_console_level(int level); +void log_set_file_level(int level); void log_set_quiet(int enable); void log_log(int level, const char *file, int line, const char *fmt, ...); +const char* getLevelName(int level); + #endif From ed068c90d6b9221938c10d6af55d26094a66c2e8 Mon Sep 17 00:00:00 2001 From: Shriniwas Sharma Date: Fri, 7 Sep 2018 11:48:53 +0200 Subject: [PATCH 2/5] Changes 1) Timestamp changed to "YYYY-MM-DD HH:MM:SS.ms" 2) Function to print the log level names 3) Indentation 4 spaces --- src/log.c | 213 ++++++++++++++++++++++++++++++++---------------------- src/log.h | 4 + 2 files changed, 130 insertions(+), 87 deletions(-) diff --git a/src/log.c b/src/log.c index b5e1361..95ab84c 100644 --- a/src/log.c +++ b/src/log.c @@ -25,119 +25,158 @@ #include #include #include - #include "log.h" - -static struct { - void *udata; - log_LockFn lock; - FILE *fp; - int console_level; - int file_level; - int quiet; +#include + +static struct +{ + void *udata; + log_LockFn lock; + FILE *fp; + int console_level; + int file_level; + int quiet; } L; +static void time_to_str(char *); + +static int year; +static int month; +static int day; +static int hour; +static int minutes; +static int seconds; +static int msec; + +char time_string[25]; -static const char *level_names[] = { - "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" -}; +static struct timeval tv; +static struct tm *tm; #ifdef LOG_USE_COLOR static const char *level_colors[] = { - "\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m" -}; + "\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"}; #endif -const char* getLevelName(int level) { +const char *getLevelName(int level) +{ return level_names[level]; } -static void lock(void) { - if (L.lock) { - L.lock(L.udata, 1); - } +static void lock(void) +{ + if (L.lock) + { + L.lock(L.udata, 1); + } } - -static void unlock(void) { - if (L.lock) { - L.lock(L.udata, 0); - } +static void unlock(void) +{ + if (L.lock) + { + L.lock(L.udata, 0); + } } - -void log_set_udata(void *udata) { - L.udata = udata; +void log_set_udata(void *udata) +{ + L.udata = udata; } - -void log_set_lock(log_LockFn fn) { - L.lock = fn; +void log_set_lock(log_LockFn fn) +{ + L.lock = fn; } - -void log_set_fp(FILE *fp) { - L.fp = fp; +void log_set_fp(FILE *fp) +{ + L.fp = fp; } - -void log_set_console_level(int level) { - L.console_level = level; +void log_set_console_level(int level) +{ + L.console_level = level; } -void log_set_file_level(int level) { - L.file_level = level; +void log_set_file_level(int level) +{ + L.file_level = level; } -void log_set_quiet(int enable) { - L.quiet = enable ? 1 : 0; +void log_set_quiet(int enable) +{ + L.quiet = enable ? 1 : 0; } - -void log_log(int level, const char *file, int line, const char *fmt, ...) { - if (level < L.console_level && level < L.file_level) { - return; - } - - /* Acquire lock */ - lock(); - - /* Get current time */ - time_t t = time(NULL); - struct tm *lt = localtime(&t); - - /* Log to stderr */ - if (!L.quiet && level >= L.console_level) { - va_list args; - char buf[24]; - buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt)] = '\0'; -#ifdef LOG_USE_COLOR - fprintf( - stderr, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ", - buf, level_colors[level], level_names[level], file, line); -#else - fprintf(stderr, "%s %-5s %s:%d: ", buf, level_names[level], file, line); -#endif - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - fprintf(stderr, "\n"); - fflush(stderr); - } - - /* Log to file */ - if (L.fp && level >= L.file_level) { - va_list args; - char buf[32]; - buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt)] = '\0'; - fprintf(L.fp, "%s %-5s %s:%d: ", buf, level_names[level], file, line); - va_start(args, fmt); - vfprintf(L.fp, fmt, args); - va_end(args); - fprintf(L.fp, "\n"); - fflush(L.fp); - } - - /* Release lock */ - unlock(); +void log_log(int level, const char *file, int line, const char *fmt, ...) +{ + if (level < L.console_level && level < L.file_level) + { + return; + } + + /* Acquire lock */ + lock(); + time_to_str(time_string); + /* Log to stderr */ + if (!L.quiet && level >= L.console_level) + { + va_list args; + + #ifdef LOG_USE_COLOR + fprintf( + stderr, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ", + time_string, level_colors[level], level_names[level], file, line); + #else + fprintf(stderr, "%s %-5s %s:%d: ", time_string, level_names[level], file, line); + #endif + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + fprintf(stderr, "\n"); + fflush(stderr); + } + + /* Log to file */ + if (L.fp && level >= L.file_level) + { + va_list args; + fprintf(L.fp, "%s %-5s %s:%d: ", time_string, level_names[level], file, line); + va_start(args, fmt); + vfprintf(L.fp, fmt, args); + va_end(args); + fprintf(L.fp, "\n"); + fflush(L.fp); + } + + /* Release lock */ + unlock(); } + +/* Write time to buf in format YYYY-MM-DD HH:MM:SS.ms */ +static void time_to_str(char *buf) +{ + gettimeofday(&tv, NULL); + tm = localtime(&tv.tv_sec); + /* Add 1900 to get the right year value read the manual page for localtime() */ + year = tm->tm_year + 1900; + /* Months are 0 indexed in struct tm */ + month = tm->tm_mon + 1; + day = tm->tm_mday; + hour = tm->tm_hour; + minutes = tm->tm_min; + seconds = tm->tm_sec; + msec = (int)(tv.tv_usec / 1000); + // buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt)] = '\0'; + int len = sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d.%03d ", + year, + month, + day, + hour, + minutes, + seconds, + msec); + buf[len] = '\0'; + printf("Time string length is : %d", len); +} \ No newline at end of file diff --git a/src/log.h b/src/log.h index 53c60db..2445837 100644 --- a/src/log.h +++ b/src/log.h @@ -11,6 +11,10 @@ #include #include +static const char *level_names[] = { + "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" +}; + #define LOG_VERSION "0.1.0" typedef void (*log_LockFn)(void *udata, int lock); From 9f0c54b9a5dd16a92caafcbb58617b040a0feabc Mon Sep 17 00:00:00 2001 From: Shriniwas Sharma Date: Mon, 10 Sep 2018 00:44:32 +0200 Subject: [PATCH 3/5] Remove unnecesary print --- src/log.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/log.c b/src/log.c index 95ab84c..092f6b2 100644 --- a/src/log.c +++ b/src/log.c @@ -178,5 +178,4 @@ static void time_to_str(char *buf) seconds, msec); buf[len] = '\0'; - printf("Time string length is : %d", len); -} \ No newline at end of file +} From bf611de0246690059b77bf89cec85ce5e21a7e54 Mon Sep 17 00:00:00 2001 From: Shriniwas Sharma Date: Sat, 15 Sep 2018 03:05:32 +0200 Subject: [PATCH 4/5] Fix getLogLevel function --- src/log.c | 5 ++++- src/log.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/log.c b/src/log.c index 092f6b2..e75c0a4 100644 --- a/src/log.c +++ b/src/log.c @@ -60,7 +60,10 @@ static const char *level_colors[] = { const char *getLevelName(int level) { - return level_names[level]; + if (level >= MIN_LOG_LEVEL && level <= MAX_LOG_LEVEL) + return level_names[level]; + else + return "INVALID LOG LEVEL"; } static void lock(void) diff --git a/src/log.h b/src/log.h index 2445837..5f9605f 100644 --- a/src/log.h +++ b/src/log.h @@ -11,6 +11,8 @@ #include #include +#define MIN_LOG_LEVEL 0 // TRACE +#define MAX_LOG_LEVEL 5 // FATAL static const char *level_names[] = { "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" }; From 44dca5f3ccbbda68f996f8610ab52e1140e9699a Mon Sep 17 00:00:00 2001 From: Shriniwas Sharma Date: Thu, 27 Sep 2018 11:48:56 +0200 Subject: [PATCH 5/5] Change to microseconds from milliseconds --- src/log.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/log.c b/src/log.c index e75c0a4..f9e43f6 100644 --- a/src/log.c +++ b/src/log.c @@ -46,7 +46,7 @@ static int day; static int hour; static int minutes; static int seconds; -static int msec; +static int usec; char time_string[25]; @@ -170,15 +170,16 @@ static void time_to_str(char *buf) hour = tm->tm_hour; minutes = tm->tm_min; seconds = tm->tm_sec; - msec = (int)(tv.tv_usec / 1000); + usec = tv.tv_usec; + // msec // buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt)] = '\0'; - int len = sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d.%03d ", + int len = sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d.%06d ", year, month, day, hour, minutes, seconds, - msec); + usec); buf[len] = '\0'; }