16static struct loggers logs = { PTHREAD_MUTEX_INITIALIZER, {NULL}, 0 };
22 const char* home = getenv(
"HOME");
25 const char* suffix =
"/.bitlab/logs";
26 char*
logs_dir = malloc(strlen(home) + strlen(suffix) + 1);
42 struct stat st = { 0 };
48 perror(
"Failed to create logs directory");
57 snprintf(full_path,
sizeof(full_path),
"%s/%s",
logs_dir, filename);
68 perror(
"Failed to allocate memory for filename");
77 perror(
"Failed to open log file");
96 fprintf(stderr,
"Failed to create logs directory\n");
119 log = fopen(full_path,
"a");
123 fprintf(stderr,
"Failed to create or open log file: %s\n", full_path);
136 perror(
"Failed to allocate memory for filename");
153 error = flock(
fileno(log), LOCK_EX | LOCK_NB);
154 while (error == -1 && (errno == EWOULDBLOCK || errno == EAGAIN))
161 fprintf(stderr,
"Log file locking timed out: %s\n", full_path);
165 error = flock(
fileno(log), LOCK_EX | LOCK_NB);
168 fseek(log, 0, SEEK_END);
170 const char* level_str;
173 case LOG_DEBUG: level_str =
"DEBUG";
break;
174 case LOG_INFO: level_str =
"INFO";
break;
175 case LOG_WARN: level_str =
"WARN";
break;
176 case LOG_ERROR: level_str =
"ERROR";
break;
177 case LOG_FATAL: level_str =
"FATAL";
break;
178 default: level_str =
"UNKNOWN";
break;
186 va_start(args, format);
187 vsnprintf(message,
sizeof(message), format, args);
190 fprintf(log,
"%s - %s - %s - %s\n", timestamp, level_str, source_file, message);
194 flock(
fileno(log), LOCK_UN);
void finish_logging()
Finish logging used to finish logging and close the log file.
void log_message(log_level level, const char *filename, const char *source_file, const char *format,...)
Log a message used to log a message to the console or a file.
static const char * logs_dir
void init_logging(const char *filename)
Initialize logging used to initialize the logging system, open and preserve the log file.
const char * create_logs_dir()
Create logs directory used to create the logs directory if it does not exist.
static struct loggers logs
#define LOCKED_FILE_RETRY_TIME
log_level
The log level enumeration used to define the level of logging that is being used.
#define LOCKED_FILE_TIMEOUT
The logger structure used to store the logger for the logging system.
The loggers structure used to store the loggers for the logging system.
logger * array[MAX_LOG_FILES]
pthread_mutex_t log_mutex
int fileno(FILE *__stream)
void get_formatted_timestamp(char *buffer, size_t buffer_size)
Get the formatted timestamp.
void usleep(unsigned int usec)