diff --git a/src/log/log.c b/src/log/log.c index 57420c2..0ef1b4b 100644 --- a/src/log/log.c +++ b/src/log/log.c @@ -1,13 +1,19 @@ // vim:fileencoding=utf-8:foldmethod=marker #include "log.h" +#include "../base/strings/str8/str8.h" #include "../common/aliases/aliases.h" #include "../common/assert/assert.h" -#include "../os/file/file.h" #include "../common/misc/misc_utils.h" +#include "../os/file/file.h" +#include -#define LOG_LEVEL_STR_LENGTH 8 -#define LOG_PREFIX_BUF_LENGTH 16 +#define MIN_LOG_MSG_LENGTH 32 +#define TIME_BUF_CAPACITY 70 + +wapp_intern Str8RO L_BRACKET = wapp_str8_lit_ro("["); +wapp_intern Str8RO R_BRACKET_SPACE = wapp_str8_lit_ro("] "); +wapp_intern Str8RO R_BRACKET_NEWLINE = wapp_str8_lit_ro("]\n"); typedef struct { WFile *outlog; @@ -21,14 +27,15 @@ wapp_intern LogConfig LOG_CONFIG = { .level = WAPP_LOG_DEBUG, }; wapp_intern Str8RO LOG_LEVEL_STRINGS[COUNT_LOG_LEVEL] = { - [WAPP_LOG_FATAL] = wapp_str8_lit_ro_initialiser_list("[ FATAL ] "), - [WAPP_LOG_CRITICAL] = wapp_str8_lit_ro_initialiser_list("[ CRITICAL ] "), - [WAPP_LOG_ERROR] = wapp_str8_lit_ro_initialiser_list("[ ERROR ] "), - [WAPP_LOG_WARNING] = wapp_str8_lit_ro_initialiser_list("[ WARNING ] "), - [WAPP_LOG_INFO] = wapp_str8_lit_ro_initialiser_list("[ INFO ] "), - [WAPP_LOG_DEBUG] = wapp_str8_lit_ro_initialiser_list("[ DEBUG ] "), + [WAPP_LOG_FATAL] = wapp_str8_lit_ro_initialiser_list("fatal "), + [WAPP_LOG_CRITICAL] = wapp_str8_lit_ro_initialiser_list("critical "), + [WAPP_LOG_ERROR] = wapp_str8_lit_ro_initialiser_list("error "), + [WAPP_LOG_WARNING] = wapp_str8_lit_ro_initialiser_list("warning "), + [WAPP_LOG_INFO] = wapp_str8_lit_ro_initialiser_list("info "), + [WAPP_LOG_DEBUG] = wapp_str8_lit_ro_initialiser_list("debug "), }; +wapp_intern void _get_current_time_string(Str8 *dst); wapp_intern void _write_log_line(WFile *fp, const Logger *logger, Str8 msg, LogLevel level); void wapp_log_set_level(LogLevel level) { @@ -93,10 +100,38 @@ void wapp_log_fatal(const Logger *logger, Str8 msg) { _write_log_line(fp, logger, msg, WAPP_LOG_FATAL); } -wapp_intern void _write_log_line(WFile *fp, const Logger *logger, Str8 msg, LogLevel level) { - wapp_file_write((void *)LOG_LEVEL_STRINGS[level].buf, fp, LOG_LEVEL_STRINGS[level].size); - wapp_file_write((void *)logger->name.buf, fp, logger->name.size); - wapp_file_write((void *)": ", fp, 2); - wapp_file_write((void *)msg.buf, fp, msg.size); - wapp_file_write((void *)"\n", fp, 1); +wapp_intern void _get_current_time_string(Str8 *dst) { + // TODO (Abdelrahman): Replace with proper date/time utilities + char buf[TIME_BUF_CAPACITY]; + time_t now = time(NULL); + struct tm utc; + gmtime_r(&now, &utc); + strftime(buf, sizeof(buf), "%FT%TZ ", &utc); + wapp_str8_copy_cstr_capped(dst, buf); +} + +wapp_intern void _write_log_line(WFile *fp, const Logger *logger, Str8 msg, LogLevel level) { + Str8 padding = wapp_str8_buf(MIN_LOG_MSG_LENGTH); + u32 padding_size = msg.size < MIN_LOG_MSG_LENGTH ? MIN_LOG_MSG_LENGTH - msg.size + 1 : 0; + wapp_str8_format(&padding, "%-*s", padding_size, " "); + + Str8 time_str = wapp_str8_buf(TIME_BUF_CAPACITY); + _get_current_time_string(&time_str); + + Str8RO **strings = wapp_array( + Str8RO *, + &time_str, + &L_BRACKET, + &LOG_LEVEL_STRINGS[level], + &R_BRACKET_SPACE, + &msg, + &padding, + &L_BRACKET, + &logger->name, + &R_BRACKET_NEWLINE + ); + + for (u64 i = 0; i < wapp_array_count(strings); ++i) { + wapp_file_write_str8(strings[i], fp); + } }