Last active
September 19, 2017 04:25
-
-
Save xiaoshuai/7f458139d5dd14ec0b01efdf7a59ef3d to your computer and use it in GitHub Desktop.
single c header colorful logger. base on https://github.com/zakird/zdlibc/blob/master/logger.h.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdarg.h> | |
#ifndef HEADER_SINGLELIBC_LOGGER_H | |
#define HEADER_SINGLELIBC_LOGGER_H | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <sys/time.h> | |
#include <math.h> | |
#define CL_NONE "\e[0m" | |
#define CL_FATAL "\e[1;31m" | |
#define CL_ERROR "\e[1;35m" | |
#define CL_WARN "\e[1;33m" | |
#define CL_INFO "\e[1;36m" | |
#define CL_DEBUG "\e[1;32m" | |
#define CL_TRACE "\e[1;37m" | |
enum LogLevel { | |
LOG_LEVEL_FATAL, LOG_LEVEL_ERROR, LOG_LEVEL_WARN, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_TRACE | |
}; | |
int log_init(FILE *stream, enum LogLevel level); | |
int log_error(const char *log_name, const char *log_msg, ...); | |
int log_warn(const char *log_name, const char *log_msg, ...); | |
int log_info(const char *log_name, const char *log_msg, ...); | |
int log_debug(const char *log_name, const char *log_msg, ...); | |
static enum LogLevel log_output_level = LOG_LEVEL_INFO; | |
static FILE *log_output_stream = NULL; | |
static char *log_level_name[] = {"FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"}; | |
static char *log_level_color[] = {CL_FATAL, CL_ERROR, CL_WARN, CL_INFO, CL_DEBUG, CL_TRACE}; | |
static int LogLogVA(enum LogLevel level, const char *name, const char *message, va_list args) { | |
if (!log_output_stream) { | |
log_output_stream = stdout; | |
} | |
if (level <= log_output_level) { | |
char *level_name = log_level_name[level]; | |
char *level_color = log_level_color[level]; | |
struct timeval now; | |
char timestamp[20]; | |
gettimeofday(&now, NULL); | |
time_t sec = now.tv_sec; | |
struct tm *ptm = localtime(&sec); | |
strftime(timestamp, 20, "%FT%H:%M:%S", ptm); | |
if (log_output_stream == stdout) { | |
fputs(level_color, log_output_stream); | |
} | |
// ISO_8601 | |
fprintf(log_output_stream, "[%s.%03ldZ][%s]", timestamp, (long) (now.tv_usec / 1000), level_name); | |
if (name) { | |
fprintf(log_output_stream, "[%s] - ", name); | |
} | |
if (message) { | |
vfprintf(log_output_stream, message, args); | |
} | |
if (log_output_stream == stdout) { | |
fputs(CL_NONE, log_output_stream); | |
} | |
if (name || message) { | |
fputs("\n", log_output_stream); | |
} | |
} | |
return 0; | |
} | |
int log_init(FILE *stream, enum LogLevel level) { | |
log_output_stream = stream; | |
log_output_level = level; | |
return 0; | |
} | |
int log_error(const char *name, const char *message, ...) { | |
va_list va; | |
va_start(va, message); | |
int ret = LogLogVA(LOG_LEVEL_ERROR, name, message, va); | |
va_end(va); | |
return ret; | |
} | |
int log_warn(const char *name, const char *message, ...) { | |
va_list va; | |
va_start(va, message); | |
int ret = LogLogVA(LOG_LEVEL_WARN, name, message, va); | |
va_end(va); | |
return ret; | |
} | |
int log_info(const char *name, const char *message, ...) { | |
va_list va; | |
va_start(va, message); | |
int ret = LogLogVA(LOG_LEVEL_INFO, name, message, va); | |
va_end(va); | |
return ret; | |
} | |
int log_debug(const char *name, const char *message, ...) { | |
va_list va; | |
va_start(va, message); | |
int ret = LogLogVA(LOG_LEVEL_DEBUG, name, message, va); | |
va_end(va); | |
return ret; | |
} | |
#endif//HEADER_SINGLELIBC_LOGGER_H |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
without bold font