log: make settings to be read from env #1

This commit is contained in:
tylen 2024-09-24 22:03:08 +00:00 committed by Vasily Davydov
parent dd15119a08
commit 9c138ddaca
4 changed files with 72 additions and 43 deletions

View File

@ -1,9 +1,13 @@
#define CDO_LOG_IMPLEMENTATION
#include <stdio.h> #include <stdio.h>
#include "cmd.h" #include "cmd.h"
#include "tools/log.h"
static void __attribute__((constructor)) init_cdo(void) { static void __attribute__((constructor)) init_cdo(void) {
atexit(exit_cmd); atexit(exit_cmd);
init_log();
init_cmd(); init_cmd();
} }

View File

@ -75,6 +75,7 @@ void init_cmd(void) {
LOG_ERROR("Undefined argument iterator %d", i); LOG_ERROR("Undefined argument iterator %d", i);
} }
} }
LOG_DEBUG("Cmd module initialised.")
} }
void exit_cmd(void) { void exit_cmd(void) {

16
src/tools/log.c Normal file
View File

@ -0,0 +1,16 @@
#include "log.h"
char* cdo_log_enable_color = NULL;
char* cdo_log_enable_debug = NULL;
void init_log(void) {
cdo_log_enable_color = getenv(LOG_COLORED_OUTPUT_ENV);
cdo_log_enable_debug = getenv(LOG_DEBUG_MESSAGES_ENV);
LOG_DEBUG("Log module initialised.");
if (!cdo_log_enable_color) {
LOG_DEBUG("%s env not defined.", LOG_COLORED_OUTPUT_ENV);
}
if (!cdo_log_enable_debug) {
LOG_DEBUG("%s env not defined", LOG_DEBUG_MESSAGES_ENV);
}
}

View File

@ -5,34 +5,38 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#define LOG_COLORED_OUTPUT_ENV "CDO_LOG_ENABLE_COLOR"
#define LOG_DEBUG_MESSAGES_ENV "CDO_LOG_ENABLE_DEBUG"
/* ================= Settings ================== */
#define LOG_COLORED_OUTPUT
#define HIGH_PRIORITY_DEBUG
#define LOG_DEBUG_MESSAGES 0
/* ================= Settings ================== */
// internal debug defines
#ifdef HIGH_PRIORITY_DEBUG
#include <assert.h> #include <assert.h>
#define INT_ASSERT(statement) assert(statement) #define INT_ASSERT(statement) assert(statement)
#else
#define INT_ASSERT(statement)
#endif
#ifdef LOG_COLORED_OUTPUT
#define C_INFO "\x1b[34mINFO\x1b[0m" typedef enum LogLevel {
#define C_DEBUG "\x1b[35mDEBUG\x1b[0m" LEVEL_INFO,
#define C_DEBUG_ISR "\x1b[36mDEBUG_ISR\x1b[0m" LEVEL_DEBUG,
#define C_WARN "\x1b[33mWARNING\x1b[0m" LEVEL_WARNING,
#define C_ERROR "\x1b[31mERROR\x1b[0m" LEVEL_ERROR
#else } LogLevel;
#define C_INFO "INFO"
#define C_DEBUG "DEBUG" static const char* coloredLogLevels[] = {
#define C_DEBUG_ISR "DEBUG_ISR" "\x1b[34mINFO\x1b[0m",
#define C_WARN "WARNING" "\x1b[35mDEBUG\x1b[0m",
#define C_ERROR "ERROR" "\x1b[33mWARNING\x1b[0m",
#endif "\x1b[31mERROR\x1b[0m"
};
static const char* plainLogLevels[] = {
"INFO",
"DEBUG",
"WARNING",
"ERROR"
};
extern char* cdo_log_enable_color;
extern char* cdo_log_enable_debug;
extern void init_log(void);
#define LOG_BUFFER_MAX_CAP 256 #define LOG_BUFFER_MAX_CAP 256
#define LOG_MESSAGE_MAX_CAP 150 #define LOG_MESSAGE_MAX_CAP 150
@ -53,19 +57,19 @@ static void create_log_line(const char * _status,
va_end(args); va_end(args);
char buffer [LOG_BUFFER_MAX_CAP] = {0}; char buffer [LOG_BUFFER_MAX_CAP] = {0};
int buffer_len = snprintf(buffer, LOG_BUFFER_MAX_CAP, int buffer_len = snprintf(buffer, LOG_BUFFER_MAX_CAP,
"[%s] In [File: %s] [Func: %s] [Line: %zu] %.*s\n", "[%s] In [File: %s] [Func: %s] [Line: %zu] %.*s\n",
_status, _status,
_location, _location,
_func, _func,
_line, _line,
message_len, message_len,
message); message);
_LOG_STREAMOUT(buffer, buffer_len); _LOG_STREAMOUT(buffer, buffer_len);
} }
static void create_log_line_simple(const char * _status, static void create_log_line_simple(const char * _status,
const char * _fmt, ...) const char * _fmt, ...)
{ {
va_list args; va_list args;
va_start(args, _fmt); va_start(args, _fmt);
@ -74,31 +78,35 @@ static void create_log_line_simple(const char * _status,
va_end(args); va_end(args);
char buffer [LOG_BUFFER_MAX_CAP] = {0}; char buffer [LOG_BUFFER_MAX_CAP] = {0};
int buffer_len = snprintf(buffer, LOG_BUFFER_MAX_CAP, int buffer_len = snprintf(buffer, LOG_BUFFER_MAX_CAP,
"[%s] %.*s\n", "[%s] %.*s\n",
_status, _status,
message_len, message_len,
message); message);
_LOG_STREAMOUT(buffer, buffer_len); _LOG_STREAMOUT(buffer, buffer_len);
} }
#define GET_LOG_SEVERITY_STR(SEVERITY)( \
(cdo_log_enable_color) ? coloredLogLevels[SEVERITY] : plainLogLevels[SEVERITY] \
)
#define LOG_INFO( fmt, ...) \ #define LOG_INFO( fmt, ...) \
create_log_line(C_INFO, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); create_log_line(GET_LOG_SEVERITY_STR(LEVEL_INFO), __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__);
#define LOG_WARNING(fmt, ...) \ #define LOG_WARNING(fmt, ...) \
create_log_line(C_WARN, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); create_log_line(GET_LOG_SEVERITY_STR(LEVEL_WARNING), __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__);
#define LOG_ERROR(fmt, ...) \ #define LOG_ERROR(fmt, ...) \
create_log_line(C_ERROR, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); \ create_log_line(GET_LOG_SEVERITY_STR(LEVEL_ERROR), __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); \
exit(1); exit(1);
#define LOG_ERROR_USER(fmt, ...) \ #define LOG_ERROR_USER(fmt, ...) \
create_log_line_simple(C_ERROR, fmt, ##__VA_ARGS__); create_log_line_simple(GET_LOG_SEVERITY_STR(LEVEL_ERROR), fmt, ##__VA_ARGS__);
#if LOG_DEBUG_MESSAGES
#define LOG_DEBUG(fmt, ...) \ #define LOG_DEBUG(fmt, ...) \
create_log_line(C_DEBUG, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); create_log_line(GET_LOG_SEVERITY_STR(LEVEL_DEBUG), __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__);
#endif
#endif /* __THREAD_COMMON_LOG_H_ */ #endif /* __THREAD_COMMON_LOG_H_ */