diff --git a/server/include/utils.h b/server/include/utils.h index 5f12fee73..a22abc167 100644 --- a/server/include/utils.h +++ b/server/include/utils.h @@ -22,14 +22,21 @@ #endif /* Some color escape codes for pretty log messages */ -#define RED(str) "\x1B[31m" str "\x1B[0m" /**< Print str in red */ -#define GRN(str) "\x1B[32m" str "\x1B[0m" /**< Print str in green */ -#define YEL(str) "\x1B[33m" str "\x1B[0m" /**< Print str in yellow */ -#define BLU(str) "\x1B[34m" str "\x1B[0m" /**< Print str in blue */ -#define MAG(str) "\x1B[35m" str "\x1B[0m" /**< Print str in magenta */ -#define CYN(str) "\x1B[36m" str "\x1B[0m" /**< Print str in cyan */ -#define WHT(str) "\x1B[37m" str "\x1B[0m" /**< Print str in white */ -#define BLD(str) "\x1B[1m" str "\x1B[0m" /**< Print str in bold */ +#define GRY(str) "\e[30m" str "\e[0m" /**< Print str in gray */ +#define RED(str) "\e[31m" str "\e[0m" /**< Print str in red */ +#define GRN(str) "\e[32m" str "\e[0m" /**< Print str in green */ +#define YEL(str) "\e[33m" str "\e[0m" /**< Print str in yellow */ +#define BLU(str) "\e[34m" str "\e[0m" /**< Print str in blue */ +#define MAG(str) "\e[35m" str "\e[0m" /**< Print str in magenta */ +#define CYN(str) "\e[36m" str "\e[0m" /**< Print str in cyan */ +#define WHT(str) "\e[37m" str "\e[0m" /**< Print str in white */ +#define BLD(str) "\e[1m" str "\e[0m" /**< Print str in bold */ + +#define GFX(chr) "\e(0" chr "\e(B" +#define UP(n) "\e[" ## n ## "A" +#define DOWN(n) "\e[" ## n ## "B" +#define RIGHT(n) "\e[" ## n ## "C" +#define LEFT(n) "\e[" ## n ## "D" /** The log level which is passed as first argument to print() */ enum log_level { DEBUG, INFO, WARN, ERROR }; @@ -38,8 +45,22 @@ enum log_level { DEBUG, INFO, WARN, ERROR }; struct settings; struct sockaddr_in; struct sockaddr; +struct timespec; -extern int debug; +/* These global variables allow changing the output style and verbosity */ +extern int _debug; +extern int _indent; + +void outdent(int *old); + +#ifdef __GNUC__ + #define INDENT int __attribute__ ((__cleanup__(outdent), unused)) _old_indent = _indent++; +#else + #define INDENT ; +#endif + +/** Reset the wallclock of debugging outputs */ +void epoch_reset(); /** Logs variadic messages to stdout. * @@ -93,7 +114,7 @@ void hist_dump(unsigned *hist, int length); /** Printf alike debug message with level. */ #define debug(lvl, msg, ...) do { \ - if (lvl <= debug) \ + if (lvl <= _debug) \ print(DEBUG, msg, ##__VA_ARGS__); \ } while (0) diff --git a/server/src/utils.c b/server/src/utils.c index c9ca59a48..4a976b4f7 100644 --- a/server/src/utils.c +++ b/server/src/utils.c @@ -22,7 +22,20 @@ #include "utils.h" /* This global variable contains the debug level for debug() and assert() macros */ -int debug = V; +int _debug = V; +int _indent = 0; + +struct timespec epoch; + +void outdent(int *old) +{ + _indent = *old; +} + +void epoch_reset() +{ + clock_gettime(CLOCK_REALTIME, &epoch); +} void print(enum log_level lvl, const char *fmt, ...) { @@ -31,23 +44,20 @@ void print(enum log_level lvl, const char *fmt, ...) va_list ap; va_start(ap, fmt); - clock_gettime(CLOCK_REALTIME, &ts); - /* Timestamp */ - printf("%15.4f", ts.tv_sec + ts.tv_nsec / 1e9); + clock_gettime(CLOCK_REALTIME, &ts); + fprintf(stderr, "%8.3f ", timespec_delta(&epoch, &ts)); switch (lvl) { - case DEBUG: printf(" [" BLU("Debug") "] "); break; - case INFO: printf(" [" WHT("Info ") "] "); break; - case WARN: printf(" [" YEL("Warn ") "] "); break; - case ERROR: printf(" [" RED("Error") "] "); break; + case DEBUG: fprintf(stderr, BLD("%-5s "), GRY("Debug")); break; + case INFO: fprintf(stderr, BLD("%-5s "), " " ); break; + case WARN: fprintf(stderr, BLD("%-5s "), YEL(" Warn")); break; + case ERROR: fprintf(stderr, BLD("%-5s "), RED("Error")); break; } - vprintf(fmt, ap); - printf("\n"); - - va_end(ap); -} + if (_indent) { + for (int i = 0; i < _indent-1; i++) + fprintf(stderr, GFX("\x78") " "); int print_addr(struct sockaddr *sa, char *buf, size_t len) { @@ -75,6 +85,7 @@ int print_addr(struct sockaddr *sa, char *buf, size_t len) default: error("Unsupported address family"); + fprintf(stderr, GFX("\x74") " "); } } @@ -107,8 +118,11 @@ int parse_addr(const char *addr, struct sockaddr_in *sa, int flags) } free(tmp); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); return ret; + va_end(ap); } cpu_set_t to_cpu_set(int set) @@ -160,7 +174,6 @@ void hist_plot(unsigned *hist, int length) max = i; } - /* Print header */ info("%2s | %5s | %s", "Id", "Value", "Histogram Plot:");