Logging is now working with all types + formatting

Can provide raw data types like ints, long, float, byte, double etc. Will be printed out as a full line. This cannot be avoided as writing requires the prefix, which cannot be calculated via discrete macro calls. At least not easily.
Performance of the logging needs to be tested
plus writing to filesystem is required.
v1
Brett 2023-01-24 15:16:47 -05:00
parent 5e1deefe48
commit 6816ddaf7a
3 changed files with 116 additions and 127 deletions

View File

@ -7,6 +7,8 @@
#ifndef BLT_TESTS_LOGGING_H
#define BLT_TESTS_LOGGING_H
#include <string>
namespace blt::logging {
enum LOG_LEVEL {
@ -26,51 +28,47 @@ namespace blt::logging {
};
void init(LOG_PROPERTIES properties);
void log(LOG_LEVEL level, bool auto_line, const char* format, ...);
void log(const std::string& format, LOG_LEVEL level, int auto_line, ...);
void log(int i, LOG_LEVEL level, int auto_line);
void log(long i, LOG_LEVEL level, int auto_line);
void log(unsigned int i, LOG_LEVEL level, int auto_line);
void log(unsigned long i, LOG_LEVEL level, int auto_line);
void log(char i, LOG_LEVEL level, int auto_line);
void log(unsigned char i, LOG_LEVEL level, int auto_line);
void log(short i, LOG_LEVEL level, int auto_line);
void log(unsigned short i, LOG_LEVEL level, int auto_line);
void log(float f, LOG_LEVEL level, int auto_line);
void log(double f, LOG_LEVEL level, int auto_line);
}
#ifdef BLT_DISABLE_LOGGING
#define BLT_TRACE(format)
#define BLT_DEBUG(format)
#define BLT_INFO(format)
#define BLT_WARN(format)
#define BLT_ERROR(format)
#define BLT_FATAL(format)
#define BLT_TRACE(format, args...)
#define BLT_DEBUG(format, args...)
#define BLT_INFO(format, args...)
#define BLT_WARN(format, args...)
#define BLT_ERROR(format, args...)
#define BLT_FATAL(format, args...)
#define BLT_TRACE_FMT(format, args...)
#define BLT_DEBUG_FMT(format, args...)
#define BLT_INFO_FMT(format, args...)
#define BLT_WARN_FMT(format, args...)
#define BLT_ERROR_FMT(format, args...)
#define BLT_FATAL_FMT(format, args...)
#define BLT_TRACE_LN(format, args...)
#define BLT_DEBUG_LN(format, args...)
#define BLT_INFO_LN(format, args...)
#define BLT_WARN_LN(format, args...)
#define BLT_ERROR_LN(format, args...)
#define BLT_FATAL_LN(format, args...)
#else
#define BLT_TRACE(format) log(blt::logging::TRACE, false, format);
#define BLT_DEBUG(format) log(blt::logging::DEBUG, false, format);
#define BLT_INFO(format) log(blt::logging::INFO, false, format);
#define BLT_WARN(format) log(blt::logging::WARN, false, format);
#define BLT_ERROR(format) log(blt::logging::ERROR, false, format);
#define BLT_FATAL(format) log(blt::logging::FATAL, false, format);
#define BLT_TRACE(format, ...) log(format, blt::logging::TRACE, false, ##__VA_ARGS__);
#define BLT_DEBUG(format, ...) log(format, blt::logging::DEBUG, false, ##__VA_ARGS__);
#define BLT_INFO(format, ...) log(format, blt::logging::INFO, false, ##__VA_ARGS__);
#define BLT_WARN(format, ...) log(format, blt::logging::WARN, false, ##__VA_ARGS__);
#define BLT_ERROR(format, ...) log(format, blt::logging::ERROR, false, ##__VA_ARGS__);
#define BLT_FATAL(format, ...) log(format, blt::logging::FATAL, false, ##__VA_ARGS__);
#define BLT_TRACE_FMT(format, args...) log(blt::logging::TRACE, false, format, args);
#define BLT_DEBUG_FMT(format, args...) log(blt::logging::DEBUG, false, format, args);
#define BLT_INFO_FMT(format, args...) log(blt::logging::INFO, false, format, args);
#define BLT_WARN_FMT(format, args...) log(blt::logging::WARN, false, format, args);
#define BLT_ERROR_FMT(format, args...) log(blt::logging::ERROR, false, format, args);
#define BLT_FATAL_FMT(format, args...) log(blt::logging::FATAL, false, format, args);
#define BLT_TRACE_LN(format) log(blt::logging::TRACE, true, format);
#define BLT_DEBUG_LN(format) log(blt::logging::DEBUG, true, format);
#define BLT_INFO_LN(format) log(blt::logging::INFO, true, format);
#define BLT_WARN_LN(format) log(blt::logging::WARN, true, format);
#define BLT_ERROR_LN(format) log(blt::logging::ERROR, true, format);
#define BLT_FATAL_LN(format) log(blt::logging::FATAL, true, format);
#define BLT_TRACE_FMT_LN(format, args...) log(blt::logging::TRACE, true, format, args);
#define BLT_DEBUG_FMT_LN(format, args...) log(blt::logging::DEBUG, true, format, args);
#define BLT_INFO_FMT_LN(format, args...) log(blt::logging::INFO, true, format, args);
#define BLT_WARN_FMT_LN(format, args...) log(blt::logging::WARN, true, format, args);
#define BLT_ERROR_FMT_LN(format, args...) log(blt::logging::ERROR, true, format, args);
#define BLT_FATAL_FMT_LN(format, args...) log(blt::logging::FATAL, true, format, args);
#define BLT_TRACE_LN(format, ...) log(format, blt::logging::TRACE, true, ##__VA_ARGS__);
#define BLT_DEBUG_LN(format, ...) log(format, blt::logging::DEBUG, true, ##__VA_ARGS__);
#define BLT_INFO_LN(format, ...) log(format, blt::logging::INFO, true, ##__VA_ARGS__);
#define BLT_WARN_LN(format, ...) log(format, blt::logging::WARN, true, ##__VA_ARGS__);
#define BLT_ERROR_LN(format, ...) log(format, blt::logging::ERROR, true, ##__VA_ARGS__);
#define BLT_FATAL_LN(format, ...) log(format, blt::logging::FATAL, true, ##__VA_ARGS__);
#endif
#endif //BLT_TESTS_LOGGING_H

View File

@ -9,6 +9,7 @@
#include <string>
#include <sstream>
#include <iostream>
#include "blt/std/string.h"
// https://en.cppreference.com/w/cpp/utility/variadic
// https://medium.com/swlh/variadic-functions-3419c287a0d2
@ -18,69 +19,10 @@
namespace blt::logging {
inline std::string applyFormat(const char* format, va_list args) {
std::stringstream output;
char currentCharacter;
while ((currentCharacter = *format) != '\0') {
if (currentCharacter == '%') {
char nextCharacter = *(++format);
if (nextCharacter == '\0')
break;
switch (nextCharacter) {
case 'd':
case 'i':
output << static_cast<char>(va_arg(args, int));
break;
case 'u':
output << static_cast<char>(va_arg(args, unsigned int));
break;
case 'o':
// TODO octal
break;
case 'x':
case 'X':
// TODO hex
break;
case 'f':
case 'F':
output << va_arg(args, double);
case 'e':
case 'E':
// TODO: scientific notation
break;
case 'g':
case 'G':
// TODO: shortest representation
output << va_arg(args, double);
break;
case 'a':
case 'A':
output << va_arg(args, double);
break;
case 'c':
output << va_arg(args, int);
break;
case 's':
output << va_arg(args, const char*);
break;
case 'p':
output << va_arg(args, void*);
break;
case 'n':
va_arg(args, int*);
break;
case '%':
output << '%';
break;
default:
output << nextCharacter;
break;
}
} else
output << currentCharacter;
++format;
}
return output.str();
void applyFormatting(const std::string& format, std::string& output, va_list& args){
char formattedChars[format.length()];
vsprintf(formattedChars, format.c_str(), args);
output = std::string(formattedChars);
}
const char* levelColors[6] = {
@ -108,26 +50,16 @@ namespace blt::logging {
BLT_LOGGING_PROPERTIES = properties;
}
void log(LOG_LEVEL level, bool auto_line, const char* format, ...) {
va_list args;
va_start(args, format);
auto formattedString = applyFormat(format, args);
bool hasEndingLinefeed = formattedString[formattedString.length()-1] == '\n';
if (hasEndingLinefeed)
formattedString = formattedString.substr(0, formattedString.length()-1);
inline void log(const std::string& str, bool hasEndingLinefeed, LOG_LEVEL level, int auto_line){
std::string outputString = System::getTimeStringLog();
outputString += levelNames[level];
outputString += str;
if (BLT_LOGGING_PROPERTIES.m_useColor)
if (BLT_LOGGING_PROPERTIES.m_useColor) {
outputString = levelColors[level] + outputString;
outputString += formattedString;
if (BLT_LOGGING_PROPERTIES.m_useColor)
outputString += "\033[0m";
}
if (hasEndingLinefeed || auto_line)
outputString += "\n";
@ -137,9 +69,65 @@ namespace blt::logging {
else
std::cout << outputString;
}
}
void log(const std::string& format, LOG_LEVEL level, int auto_line, ...) {
va_list args;
va_start(args, auto_line);
std::string formattedString;
applyFormatting(format, formattedString, args);
bool hasEndingLinefeed = formattedString[formattedString.length()-1] == '\n';
if (hasEndingLinefeed)
formattedString = formattedString.substr(0, formattedString.length()-1);
log(formattedString, hasEndingLinefeed, level, auto_line);
va_end(args);
}
void log(int i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(long i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(unsigned int i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(unsigned long i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(char i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(unsigned char i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(short i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(unsigned short i, LOG_LEVEL level, int auto_line) {
log(std::to_string(i), false, level, true);
}
void log(float f, LOG_LEVEL level, int auto_line) {
log(std::to_string(f), false, level, true);
}
void log(double f, LOG_LEVEL level, int auto_line) {
log(std::to_string(f), false, level, true);
}
}

View File

@ -9,19 +9,22 @@
int main() {
binaryTreeTest();
BLT_TRACE("Hello World!\n");
BLT_DEBUG("Hello World!\n");
BLT_TRACE(10);
BLT_TRACE(10.5);
BLT_TRACE("Hello %d World!\n", 50);
BLT_DEBUG("Hello %E World!\n", 1205200.0);
BLT_INFO("Hello World!\n");
BLT_WARN("Hello World!\n");
BLT_ERROR("Hello World!\n");
BLT_FATAL("Hello World!\n");
BLT_TRACE_LN("Hello World!\n");
BLT_DEBUG_LN("Hello World!\n");
BLT_INFO_LN("Hello World!\n");
BLT_WARN_LN("Hello World!");
BLT_ERROR_LN("Hello World!");
BLT_FATAL_LN("Hello World!");
BLT_TRACE_LN("Goodbye World!\n");
BLT_DEBUG_LN("Goodbye World!\n");
BLT_INFO_LN("Goodbye World!\n");
BLT_WARN_LN("Goodbye World!");
BLT_ERROR_LN("Goodbye World!");
BLT_FATAL_LN("Goodbye World!");
std::string hello = "superSexyMax";
std::cout << "String starts with: " << blt::string::contains(hello, "superSexyMaxE") << "\n";