summaryrefslogtreecommitdiff
path: root/log
diff options
context:
space:
mode:
Diffstat (limited to 'log')
-rwxr-xr-xlog/log.c114
-rwxr-xr-xlog/log.h41
-rwxr-xr-xlog/main.c22
3 files changed, 177 insertions, 0 deletions
diff --git a/log/log.c b/log/log.c
new file mode 100755
index 0000000..2d3cbac
--- /dev/null
+++ b/log/log.c
@@ -0,0 +1,114 @@
+#include "log.h"
+
+
+static struct {
+ char *name;
+ int set;
+ FILE *fps[MAX_LOGFILES];
+ int nfps;
+ int stder;
+#ifdef COLOR
+ char *color;
+#endif
+} log_levels[LOG_LEVEL_COUNT] = {
+ {
+ .name = "DEBUG", .set = 1, .fps = {0}, .nfps = 0, .stder = 1,
+#ifdef COLOR
+ .color = "\e[38;2;255;255;0m"
+#endif
+ },
+ {
+ .name = "INFO", .set = 1, .fps = {0}, .nfps = 0, .stder = 1,
+#ifdef COLOR
+ .color = "\e[38;2;0;224;255m"
+#endif
+ },
+ {
+ .name = "WARN", .set = 1, .fps = {0}, .nfps = 0, .stder = 1,
+#ifdef COLOR
+ .color = "\e[38;2;255;165;0m"
+#endif
+ },
+ {
+ .name = "ERROR", .set = 1, .fps = {0}, .nfps = 0, .stder = 1,
+#ifdef COLOR
+ .color = "\e[38;2;255;0;0m"
+#endif
+ }
+};
+
+static char time_format[16] = "%T";
+static int nanosecond_precision = 0;
+
+
+int log_set_stderr(int level, int of){
+ if(level >= 0 && level < LOG_LEVEL_COUNT){
+ return log_levels[level].stder = of;
+ }
+ return 0;
+}
+
+void log_set_level(int level, int of){
+ if(level >= 0 && level < LOG_LEVEL_COUNT){
+ log_levels[level].set = of;
+ }
+}
+
+int log_add_fp(int level, FILE *fp){
+ if(level >= 0 && level < LOG_LEVEL_COUNT && log_levels[level].nfps < MAX_LOGFILES-1){
+ log_levels[level].fps[log_levels[level].nfps++] = fp;
+ return 0;
+ }
+ return 1;
+}
+
+void log_time_format(char *tf){
+ strncpy(time_format, tf, sizeof(time_format)/sizeof(time_format[0]));
+}
+
+int log_nanoseconds(int n){
+ return nanosecond_precision = n%10;
+}
+
+void log_message(int level, char *file, int line, char *fmt, ...){
+ struct timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ if(level >= 0 && level < LOG_LEVEL_COUNT && log_levels[level].set){
+ struct tm *lt = localtime(&ts.tv_sec);
+ char t[32] = {0};
+ strftime(t, 31, time_format, lt);
+ char ns[9] = {0};
+ snprintf(ns, nanosecond_precision+1, "%ld", ts.tv_nsec);
+ char msg[MSG_LIMIT] = {0};
+ int written = snprintf(msg, MSG_LIMIT-2,
+#ifdef PID
+ "[%d] "
+#endif
+ "%s%s%s%s%s%s%s\t",
+#ifdef PID
+ getpid(),
+#endif
+ t, nanosecond_precision ? "." : "", ns,
+ t[0] != '\0' ? " " : "",
+#ifdef COLOR
+ log_levels[level].color,
+#else
+ "",
+#endif
+ log_levels[level].name, "\e[0m"
+ );
+ if(level == LOG_DEBUG){
+ written += snprintf(msg+written, MSG_LIMIT-2-written, "%s:%d: ",file, line);
+ }
+ va_list args;
+ va_start(args, fmt);
+ written += vsnprintf(msg+written, MSG_LIMIT-2-written, fmt, args);
+ msg[written] = '\n';
+ if(log_levels[level].stder) fputs(msg, stderr);
+ for(int i = 0; i < log_levels[level].nfps; i++){
+ if(log_levels[level].fps[i] != NULL)
+ fputs(msg, log_levels[level].fps[i++]);
+ }
+ }
+}
+
diff --git a/log/log.h b/log/log.h
new file mode 100755
index 0000000..09b93bb
--- /dev/null
+++ b/log/log.h
@@ -0,0 +1,41 @@
+#ifndef LOG_H
+#define LOG_H
+
+#define PID
+#define COLOR
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <stdarg.h>
+#ifdef PID
+#include <unistd.h>
+#endif
+
+
+enum {
+ LOG_DEBUG,
+ LOG_INFO,
+ LOG_WARN,
+ LOG_ERROR,
+ LOG_LEVEL_COUNT
+};
+
+#define MAX_LOGFILES (8)
+#define MSG_LIMIT (256)
+
+
+int log_set_stderr(int level, int of);
+void log_set_level(int level, int of);
+int log_add_fp(int level, FILE *fp);
+void log_time_format(char *tf);
+int log_nanoseconds(int n);
+void log_message(int level, char *file, int line, char *fmt, ...);
+
+#define log_debug(...) log_message(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
+#define log_info(...) log_message(LOG_INFO, __FILE__, __LINE__, __VA_ARGS__)
+#define log_warn(...) log_message(LOG_WARN, __FILE__, __LINE__, __VA_ARGS__)
+#define log_error(...) log_message(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
+
+#endif
diff --git a/log/main.c b/log/main.c
new file mode 100755
index 0000000..47ae6f7
--- /dev/null
+++ b/log/main.c
@@ -0,0 +1,22 @@
+#define COLOR
+#include "log.h"
+
+
+int main(void){
+
+ int r, g, b;
+ while(1){
+ printf("select RBG trio: ");
+ scanf("%d %d %d", &r, &g, &b);
+ if(r > 255) r = 255;
+ if(g > 255) g = 255;
+ if(b > 255) b = 255;
+ printf("%d %d %d\n", r, g, b);
+ printf("\t\e[38;2;%d;%d;%dmDEBUG%s\n", r, g, b, CRESET);
+ printf("\t\e[38;2;%d;%d;%dmINFO%s\n", r, g, b, CRESET);
+ printf("\t\e[38;2;%d;%d;%dmWARN%s\n", r, g, b, CRESET);
+ printf("\t\e[38;2;%d;%d;%dmERROR%s\n", r, g, b, CRESET);
+ }
+
+ return 0;
+}