Skip to content

Instantly share code, notes, and snippets.

@xiaoshuai
Last active September 19, 2017 04:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xiaoshuai/7f458139d5dd14ec0b01efdf7a59ef3d to your computer and use it in GitHub Desktop.
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.
#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
@xiaoshuai
Copy link
Author

without bold font

#define CL_NONE                 "\e[0m"
#define CL_FATAL                "\e[31m"
#define CL_ERROR                "\e[35m"
#define CL_WARN                 "\e[33m"
#define CL_INFO                 "\e[36m"
#define CL_DEBUG                "\e[32m"
#define CL_TRACE                "\e[37m"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment