Logging works for the most part, more features need to be added
parent
cf96536468
commit
d025b0595c
|
@ -1,7 +1,7 @@
|
||||||
cmake_minimum_required(VERSION 3.24)
|
cmake_minimum_required(VERSION 3.24)
|
||||||
project(BLT)
|
project(BLT)
|
||||||
|
|
||||||
set(CMAKE_PROJECT_VERSION 0.1a)
|
set(CMAKE_PROJECT_VERSION 0.2a)
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
option(BUILD_STD "Build the BLT standard utilities." ON)
|
option(BUILD_STD "Build the BLT standard utilities." ON)
|
||||||
|
|
|
@ -4,7 +4,7 @@ Standard Files /home/brett/Documents/code/c++/BLT/src/blt/std/logging.cpp;/home/
|
||||||
Profiler Files /home/brett/Documents/code/c++/BLT/src/blt/profiling/profiler.cpp
|
Profiler Files /home/brett/Documents/code/c++/BLT/src/blt/profiling/profiler.cpp
|
||||||
Source: /home/brett/Documents/code/c++/BLT
|
Source: /home/brett/Documents/code/c++/BLT
|
||||||
Current Source: /home/brett/Documents/code/c++/BLT
|
Current Source: /home/brett/Documents/code/c++/BLT
|
||||||
BLT 0.1a Successfully included!
|
BLT 0.2a Successfully included!
|
||||||
BLT tests included!
|
BLT tests included!
|
||||||
-- Configuring done
|
-- Configuring done
|
||||||
-- Generating done
|
-- Generating done
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
Utility classes start with captials (IE classes which are purely static)
|
//Utility classes start with captials (IE classes which are purely static)
|
||||||
|
Utility classes are namespaces all lower case.
|
||||||
everything else is camel cased underscore to conform to what most of the C libs seem to use
|
everything else is camel cased underscore to conform to what most of the C libs seem to use
|
||||||
Template types should be capital camel case
|
Template types should be capital camel case
|
||||||
|
|
|
@ -7,15 +7,69 @@
|
||||||
#ifndef BLT_TESTS_LOGGING_H
|
#ifndef BLT_TESTS_LOGGING_H
|
||||||
#define BLT_TESTS_LOGGING_H
|
#define BLT_TESTS_LOGGING_H
|
||||||
|
|
||||||
namespace blt {
|
namespace blt::logging {
|
||||||
void logToConsoleAndFile(const char* format, ...);
|
|
||||||
void logToConsole(const char* format, ...);
|
enum LOG_LEVEL {
|
||||||
void logToFile(const char* format, ...);
|
TRACE = 0, DEBUG = 1, INFO = 2, WARN = 3, ERROR = 4, FATAL = 5
|
||||||
void logToConsoleAndFile(const char* prefix, const char* format, ...);
|
};
|
||||||
void logToConsole(const char* prefix, const char* format, ...);
|
|
||||||
void logToFile(const char* prefix, const char* format, ...);
|
struct LOG_PROPERTIES {
|
||||||
|
bool m_useColor = true;
|
||||||
|
bool m_logToConsole = true;
|
||||||
|
bool m_logToFile = true;
|
||||||
|
|
||||||
|
explicit constexpr LOG_PROPERTIES(bool useColor, bool logToConsole, bool logToFile):
|
||||||
|
m_useColor(useColor), m_logToConsole(logToConsole), m_logToFile(logToFile) {}
|
||||||
|
|
||||||
|
explicit constexpr LOG_PROPERTIES() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
void init(LOG_PROPERTIES properties);
|
||||||
|
void log(LOG_LEVEL level, bool auto_line, const char* format, ...);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BLT
|
#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_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...)
|
||||||
|
#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_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);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif //BLT_TESTS_LOGGING_H
|
#endif //BLT_TESTS_LOGGING_H
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace blt::String {
|
namespace blt::string {
|
||||||
|
|
||||||
static inline bool starts_with(const std::string& string, const std::string& search){
|
static inline bool starts_with(const std::string& string, const std::string& search){
|
||||||
if (search.length() > string.length())
|
if (search.length() > string.length())
|
||||||
|
|
|
@ -5,36 +5,133 @@
|
||||||
*/
|
*/
|
||||||
#include <blt/std/logging.h>
|
#include <blt/std/logging.h>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
// https://en.cppreference.com/w/cpp/utility/variadic
|
// https://en.cppreference.com/w/cpp/utility/variadic
|
||||||
// https://medium.com/swlh/variadic-functions-3419c287a0d2
|
// https://medium.com/swlh/variadic-functions-3419c287a0d2
|
||||||
// https://publications.gbdirect.co.uk//c_book/chapter9/stdarg.html
|
// https://publications.gbdirect.co.uk//c_book/chapter9/stdarg.html
|
||||||
// https://cplusplus.com/reference/cstdio/printf/
|
// https://cplusplus.com/reference/cstdio/printf/
|
||||||
|
|
||||||
void blt::logToConsoleAndFile(const char* prefix, const char* format, ...) {
|
|
||||||
|
|
||||||
|
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 blt::logToConsole(const char* prefix, const char* format, ...) {
|
const char* levelColors[6] = {
|
||||||
|
"\033[97m",
|
||||||
|
"\033[36m",
|
||||||
|
"\033[92m",
|
||||||
|
"\033[93m",
|
||||||
|
"\033[91m",
|
||||||
|
"\033[97;41m"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* levelNames[6] = {
|
||||||
|
"[Trace]: ",
|
||||||
|
"[Debug]: ",
|
||||||
|
"[Info]: ",
|
||||||
|
"[Warn]: ",
|
||||||
|
"[Error]: ",
|
||||||
|
"[Fatal]: ",
|
||||||
|
};
|
||||||
|
|
||||||
|
// by default everything is enabled
|
||||||
|
LOG_PROPERTIES BLT_LOGGING_PROPERTIES{true, true, true};
|
||||||
|
|
||||||
|
void init(LOG_PROPERTIES properties) {
|
||||||
|
BLT_LOGGING_PROPERTIES = properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
void log(LOG_LEVEL level, bool auto_line, const char* format, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
|
|
||||||
|
std::stringstream finalOutput;
|
||||||
|
auto formattedString = applyFormat(format, args);
|
||||||
|
|
||||||
|
if (BLT_LOGGING_PROPERTIES.m_useColor)
|
||||||
|
finalOutput << levelColors[level];
|
||||||
|
finalOutput << levelNames[level];
|
||||||
|
finalOutput << formattedString;
|
||||||
|
if (BLT_LOGGING_PROPERTIES.m_useColor)
|
||||||
|
finalOutput << "\033[0m";
|
||||||
|
|
||||||
|
std::string outputString = finalOutput.str();
|
||||||
|
|
||||||
|
if (BLT_LOGGING_PROPERTIES.m_logToConsole) {
|
||||||
|
if (level > WARN)
|
||||||
|
std::cerr << outputString;
|
||||||
|
else
|
||||||
|
std::cout << outputString;
|
||||||
|
}
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blt::logToFile(const char* prefix, const char* format, ...) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void blt::logToConsoleAndFile(const char* format, ...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void blt::logToConsole(const char* format, ...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void blt::logToFile(const char* format, ...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,26 @@
|
||||||
|
|
||||||
#include "binary_trees.h"
|
#include "binary_trees.h"
|
||||||
#include "blt/std/string.h"
|
#include "blt/std/string.h"
|
||||||
|
#include "blt/std/logging.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
binaryTreeTest();
|
binaryTreeTest();
|
||||||
|
|
||||||
|
BLT_TRACE("Hello World!\n");
|
||||||
|
BLT_DEBUG("Hello World!\n");
|
||||||
|
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!");
|
||||||
|
|
||||||
std::string hello = "superSexyMax";
|
std::string hello = "superSexyMax";
|
||||||
std::cout << "String starts with: " << blt::String::contains(hello, "superSexyMaxE") << "\n";
|
std::cout << "String starts with: " << blt::string::contains(hello, "superSexyMaxE") << "\n";
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue