Logger: Difference between revisions
Jump to navigation
Jump to search
(Created page with "// Module: log.c // // logging library // ANSI escape codes: // gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <time.h> #include "log.h" #include <unistd.h> #ifndef u8 #define u8 uint8_t #define s8 int8_t #endif // Define ANSI colors, to be used within printf() text // The foreground colors 30 - 38, are the "normal" darker colors // The foreground colors 90 - 98, are the "bright" lighter colors...") |
No edit summary |
||
Line 1: | Line 1: | ||
// Module: log.c | // Module: log.c | ||
// | // | ||
// logging library | // logging library | ||
// ANSI escape codes: | // ANSI escape codes: | ||
// gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797 | // gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797 | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdint.h> | #include <stdint.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
#include <time.h> | #include <time.h> | ||
#include "log.h" | #include "log.h" | ||
#include <unistd.h> | #include <unistd.h> | ||
#ifndef u8 | #ifndef u8 | ||
#define u8 uint8_t | #define u8 uint8_t | ||
#define s8 int8_t | #define s8 int8_t | ||
#endif | #endif | ||
// Define ANSI colors, to be used within printf() text | // Define ANSI colors, to be used within printf() text | ||
// The foreground colors 30 - 38, are the "normal" darker colors | // The foreground colors 30 - 38, are the "normal" darker colors | ||
// The foreground colors 90 - 98, are the "bright" lighter colors | // The foreground colors 90 - 98, are the "bright" lighter colors | ||
// These #defines rely on string concatenation to function as desired | // These #defines rely on string concatenation to function as desired | ||
#define COLOR_YELLOW_ON_BLACK "\033[93m\033[40m" | #define COLOR_YELLOW_ON_BLACK "\033[93m\033[40m" | ||
#define COLOR_YELLOW_ON_BLUE "\033[93m\033[44m" | #define COLOR_YELLOW_ON_BLUE "\033[93m\033[44m" | ||
#define COLOR_YELLOW_ON_GREEN "\033[93m\033[42m" | #define COLOR_YELLOW_ON_GREEN "\033[93m\033[42m" | ||
#define COLOR_YELLOW_ON_RED "\033[93m\033[41m" | #define COLOR_YELLOW_ON_RED "\033[93m\033[41m" | ||
#define COLOR_YELLOW_ON_VIOLET "\033[93m\033[45m" | #define COLOR_YELLOW_ON_VIOLET "\033[93m\033[45m" | ||
#define COLOR_WHITE | #define COLOR_WHITE | ||
#define COLOR_RED | #define COLOR_RED | ||
#define COLOR_GREEN "\033[92m" /* Bright Green text */ | #define COLOR_GREEN "\033[92m" /* Bright Green text */ | ||
#define COLOR_VIOLET "\033[95m" /* Bright Violet text */ | #define COLOR_VIOLET "\033[95m" /* Bright Violet text */ | ||
#define COLOR_YELLOW "\033[93m" /* Bright Yellow text */ | #define COLOR_YELLOW "\033[93m" /* Bright Yellow text */ | ||
#define COLOR_RESET "\033[0m" /* Reset text color to previous color */ | #define COLOR_RESET "\033[0m" /* Reset text color to previous color */ | ||
#define TEXT_ADMIN "\e[31m" | #define TEXT_ADMIN "\e[31m" | ||
#define TEXT_ORANGE "\e[38;5;202m" | #define TEXT_ORANGE "\e[38;5;202m" | ||
#define TEXT_BROWN "\e[38;5;130m" | #define TEXT_BROWN "\e[38;5;130m" | ||
#define TEXT_YELLOW "\e[93m" | #define TEXT_YELLOW "\e[93m" | ||
#define TEXT_PUKE "\e[33m" | #define TEXT_PUKE "\e[33m" | ||
#define TEXT_LIME "\e[92m" | #define TEXT_LIME "\e[92m" | ||
#define TEXT_GREEN "\e[32m"` | #define TEXT_GREEN "\e[32m"` | ||
#define TEXT_AQUA "\e[96m" | #define TEXT_AQUA "\e[96m" | ||
#define MAX_LOG_ITEM 150 // maximum number of bytes for a log (with length, time, level, and text | #define MAX_LOG_ITEM 150 // maximum number of bytes for a log (with length, time, level, and text | ||
// Definition of a "log item": | // Definition of a "log item": | ||
typedef struct { | typedef struct { | ||
u8 length; // includes sizeof(time), sizeof(level), strlen(text) | |||
u8 time[4]; // 32 bits, stored in network byte order, MSB first (index 0) | |||
u8 level; | |||
char text[MAX_LOG_ITEM-6]; // log text | |||
} log_item_t; | } log_item_t; | ||
// Implementation rules / notes: | // Implementation rules / notes: | ||
// 1) Use a "staging buffer" of some max length to write formatted text into | // 1) Use a "staging buffer" of some max length to write formatted text into | ||
// This buffer will NOT contain ANSI color escapes or line termination. | // This buffer will NOT contain ANSI color escapes or line termination. | ||
// 2) A small data structure is used on the front of the "log item" to | // 2) A small data structure is used on the front of the "log item" to | ||
// contain time stamp, log level, and string length. | // contain time stamp, log level, and string length. | ||
// u8 length - bytes following | // u8 length - bytes following | ||
uint32_t get_time(void) | uint32_t get_time(void) | ||
{ | { | ||
uint32_t milliseconds; | |||
struct timespec ts; | |||
if (clock_gettime(CLOCK_MONOTONIC_RAW /*CLOCK_MONOTONIC*/, &ts) == -1) { | |||
perror("clock_gettime"); | |||
exit(EXIT_FAILURE); | exit(EXIT_FAILURE); | ||
} | } | ||
Line 69: | Line 69: | ||
printf("%s: %u\n",__func__,milliseconds); | printf("%s: %u\n",__func__,milliseconds); | ||
return milliseconds; | return milliseconds; | ||
} | } | ||
int main(int argc, const char* argv[]) | int main(int argc, const char* argv[]) | ||
{ | { | ||
get_time(); | |||
printf(COLOR_VIOLET "COLOR_VIOLET" COLOR_RESET "\n"); | |||
for(int ansi = 30; ansi<=37; ansi++) | |||
printf("\033[%dm Foreground Color: %d\033[0m\n",ansi,ansi); | |||
for(int ansi = 90; ansi<=97; ansi++) | |||
printf("\033[%dm Foreground Color: %d\033[0m\n",ansi,ansi); | |||
for(int ansi = 40; ansi<=47; ansi++) | |||
printf("\033[%dm Background Color: %d\033[0m\n",ansi,ansi); | |||
for(int ansi = 100; ansi<=107; ansi++) | |||
printf("\033[%dm Background Color: %d\033[0m\n",ansi,ansi); | |||
usleep(1000); | |||
get_time(); | |||
return 0; | |||
} | } |
Latest revision as of 16:42, 28 June 2024
// Module: log.c // // logging library // ANSI escape codes: // gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <time.h> #include "log.h" #include <unistd.h> #ifndef u8 #define u8 uint8_t #define s8 int8_t #endif // Define ANSI colors, to be used within printf() text // The foreground colors 30 - 38, are the "normal" darker colors // The foreground colors 90 - 98, are the "bright" lighter colors // These #defines rely on string concatenation to function as desired #define COLOR_YELLOW_ON_BLACK "\033[93m\033[40m" #define COLOR_YELLOW_ON_BLUE "\033[93m\033[44m" #define COLOR_YELLOW_ON_GREEN "\033[93m\033[42m" #define COLOR_YELLOW_ON_RED "\033[93m\033[41m" #define COLOR_YELLOW_ON_VIOLET "\033[93m\033[45m" #define COLOR_WHITE #define COLOR_RED #define COLOR_GREEN "\033[92m" /* Bright Green text */ #define COLOR_VIOLET "\033[95m" /* Bright Violet text */ #define COLOR_YELLOW "\033[93m" /* Bright Yellow text */ #define COLOR_RESET "\033[0m" /* Reset text color to previous color */ #define TEXT_ADMIN "\e[31m" #define TEXT_ORANGE "\e[38;5;202m" #define TEXT_BROWN "\e[38;5;130m" #define TEXT_YELLOW "\e[93m" #define TEXT_PUKE "\e[33m" #define TEXT_LIME "\e[92m" #define TEXT_GREEN "\e[32m"` #define TEXT_AQUA "\e[96m" #define MAX_LOG_ITEM 150 // maximum number of bytes for a log (with length, time, level, and text // Definition of a "log item": typedef struct { u8 length; // includes sizeof(time), sizeof(level), strlen(text) u8 time[4]; // 32 bits, stored in network byte order, MSB first (index 0) u8 level; char text[MAX_LOG_ITEM-6]; // log text } log_item_t; // Implementation rules / notes: // 1) Use a "staging buffer" of some max length to write formatted text into // This buffer will NOT contain ANSI color escapes or line termination. // 2) A small data structure is used on the front of the "log item" to // contain time stamp, log level, and string length. // u8 length - bytes following uint32_t get_time(void) { uint32_t milliseconds; struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC_RAW /*CLOCK_MONOTONIC*/, &ts) == -1) { perror("clock_gettime"); exit(EXIT_FAILURE); } milliseconds = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000); // convert seconds into milliseconds & nanoseconds into milliseconds printf("%s: %u\n",__func__,milliseconds); return milliseconds; } int main(int argc, const char* argv[]) { get_time(); printf(COLOR_VIOLET "COLOR_VIOLET" COLOR_RESET "\n"); for(int ansi = 30; ansi<=37; ansi++) printf("\033[%dm Foreground Color: %d\033[0m\n",ansi,ansi); for(int ansi = 90; ansi<=97; ansi++) printf("\033[%dm Foreground Color: %d\033[0m\n",ansi,ansi); for(int ansi = 40; ansi<=47; ansi++) printf("\033[%dm Background Color: %d\033[0m\n",ansi,ansi); for(int ansi = 100; ansi<=107; ansi++) printf("\033[%dm Background Color: %d\033[0m\n",ansi,ansi); usleep(1000); get_time(); return 0; }