122 lines
3.0 KiB
C++
122 lines
3.0 KiB
C++
/**
|
|
* Lightweight logging tool. Automatically prepend messages with prefixes and store in log file.
|
|
*
|
|
* Author: Jason Luu
|
|
* Date: Sept 5, 2014
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h> /* Allows for variable arguments, necessary for wrapping printf */
|
|
#include "log.h"
|
|
|
|
#define LOG_DEFAULT_FILE_NAME "output.log"
|
|
|
|
static int log_warning = 0;
|
|
static int log_error = 0;
|
|
FILE *log_stream = nullptr;
|
|
|
|
|
|
static void check_init();
|
|
|
|
/* Set the output file of logger.
|
|
If different than current log file, close current log file and reopen to new log file
|
|
*/
|
|
void log_set_output_file(const char *filename) {
|
|
if(log_stream != nullptr) {
|
|
fclose(log_stream);
|
|
}
|
|
|
|
if (filename == nullptr) {
|
|
log_stream = nullptr;
|
|
} else {
|
|
|
|
log_stream = fopen(filename, "w");
|
|
if(log_stream == nullptr) {
|
|
printf("Error writing to file %s\n\n", filename);
|
|
}
|
|
}
|
|
}
|
|
|
|
void log_print_direct(const char* message, ...) {
|
|
va_list args;
|
|
va_start(args, message);
|
|
vprintf(message, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void log_print_info(const char* message, ...) {
|
|
check_init(); /* Check if output log file setup, if not, then this function also sets it up */
|
|
|
|
va_list args;
|
|
va_start(args, message);
|
|
vprintf(message, args);
|
|
va_end(args);
|
|
|
|
if (log_stream) {
|
|
va_start(args, message); /* Must reset variable arguments so that they can be read again */
|
|
vfprintf(log_stream, message, args);
|
|
va_end(args);
|
|
|
|
fflush(log_stream);
|
|
}
|
|
}
|
|
|
|
void log_print_warning(const char* /*filename*/, unsigned int /*line_num*/, const char* message, ...) {
|
|
check_init(); /* Check if output log file setup, if not, then this function also sets it up */
|
|
|
|
va_list args;
|
|
va_start(args, message);
|
|
log_warning++;
|
|
|
|
printf("Warning %d: ", log_warning);
|
|
vprintf(message, args);
|
|
va_end(args);
|
|
|
|
if (log_stream) {
|
|
va_start(args, message); /* Must reset variable arguments so that they can be read again */
|
|
fprintf(log_stream, "Warning %d: ", log_warning);
|
|
vfprintf(log_stream, message, args);
|
|
|
|
va_end(args);
|
|
fflush(log_stream);
|
|
}
|
|
}
|
|
|
|
void log_print_error(const char* /*filename*/, unsigned int /*line_num*/, const char* message, ...) {
|
|
check_init(); /* Check if output log file setup, if not, then this function also sets it up */
|
|
|
|
va_list args;
|
|
va_start(args, message);
|
|
log_error++;
|
|
|
|
check_init();
|
|
fprintf(stderr, "Error %d: ", log_error);
|
|
vfprintf(stderr, message, args);
|
|
va_end(args);
|
|
|
|
if (log_stream) {
|
|
va_start(args, message); /* Must reset variable arguments so that they can be read again */
|
|
fprintf(log_stream, "Error %d: ", log_error);
|
|
vfprintf(log_stream, message, args);
|
|
|
|
va_end(args);
|
|
|
|
fflush(log_stream);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if output log file setup, if not, then this function also sets it up
|
|
*/
|
|
static void check_init() {
|
|
//We now allow a nullptr log_stream (i.e. no log file) so nothing to do here
|
|
}
|
|
|
|
|
|
void log_close() {
|
|
if (log_stream) {
|
|
fclose(log_stream);
|
|
}
|
|
}
|