Console logging

v1
Brett 2023-01-24 17:56:48 -05:00
parent 4fbeb5be72
commit 51a1468cf0
2 changed files with 54 additions and 4 deletions

View File

@ -111,7 +111,7 @@ namespace blt::string {
s.erase( s.erase(
s.begin(), std::find_if( s.begin(), std::find_if(
s.begin(), s.end(), [](unsigned char ch) { s.begin(), s.end(), [](unsigned char ch) {
return !std::isspace(ch); return !std::isblank(ch);
} }
)); ));
return s; return s;
@ -122,7 +122,7 @@ namespace blt::string {
s.erase( s.erase(
std::find_if( std::find_if(
s.rbegin(), s.rend(), [](unsigned char ch) { s.rbegin(), s.rend(), [](unsigned char ch) {
return !std::isspace(ch); return !std::isblank(ch);
} }
).base(), s.end()); ).base(), s.end());
return s; return s;

View File

@ -7,9 +7,11 @@
#include <blt/std/time.h> #include <blt/std/time.h>
#include <cstdarg> #include <cstdarg>
#include <string> #include <string>
#include <sstream>
#include <iostream> #include <iostream>
#include "blt/std/string.h" #include "blt/std/string.h"
#include <fstream>
#include <utility>
#include <ios>
// 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
@ -19,6 +21,43 @@
namespace blt::logging { namespace blt::logging {
class LogFileWriter {
private:
std::string m_path;
std::fstream* output;
int currentLines = 0;
static constexpr int MAX_LINES = 100000;
public:
explicit LogFileWriter(const std::string& path): m_path(path){
auto currentTime = System::getTimeStringFS();
output = new std::fstream(path + currentTime + ".log", std::ios::out | std::ios::app);
if (!output->good()){
throw std::runtime_error("Unable to open console filestream!\n");
}
}
void writeLine(const std::string& line){
if (!output->good()){
std::cerr << "There has been an error in the logging file stream!\n";
output->clear();
}
*output << line;
currentLines++;
if (currentLines > MAX_LINES){
output->flush();
output->close();
delete(output);
currentLines = 0;
auto currentTime = System::getTimeStringFS();
output = new std::fstream(m_path + currentTime + ".log");
}
}
~LogFileWriter() {
delete(output);
}
};
void applyFormatting(const std::string& format, std::string& output, va_list& args){ void applyFormatting(const std::string& format, std::string& output, va_list& args){
char formattedChars[format.length()]; char formattedChars[format.length()];
vsprintf(formattedChars, format.c_str(), args); vsprintf(formattedChars, format.c_str(), args);
@ -45,8 +84,11 @@ namespace blt::logging {
// by default everything is enabled // by default everything is enabled
LOG_PROPERTIES BLT_LOGGING_PROPERTIES{true, true, true, "./"}; LOG_PROPERTIES BLT_LOGGING_PROPERTIES{true, true, true, "./"};
LogFileWriter writer{"./"};
void init(LOG_PROPERTIES properties) { void init(LOG_PROPERTIES properties) {
if (BLT_LOGGING_PROPERTIES.m_directory != properties.m_directory)
writer = LogFileWriter{properties.m_directory};
BLT_LOGGING_PROPERTIES = properties; BLT_LOGGING_PROPERTIES = properties;
} }
@ -55,13 +97,17 @@ namespace blt::logging {
outputString += levelNames[level]; outputString += levelNames[level];
outputString += str; outputString += str;
std::string fileString = outputString;
if (BLT_LOGGING_PROPERTIES.m_useColor) { if (BLT_LOGGING_PROPERTIES.m_useColor) {
outputString = levelColors[level] + outputString; outputString = levelColors[level] + outputString;
outputString += "\033[0m"; outputString += "\033[0m";
} }
if (hasEndingLinefeed || auto_line) if (hasEndingLinefeed || auto_line) {
outputString += "\n"; outputString += "\n";
fileString += "\n";
}
if (BLT_LOGGING_PROPERTIES.m_logToConsole) { if (BLT_LOGGING_PROPERTIES.m_logToConsole) {
if (level > WARN) if (level > WARN)
@ -69,6 +115,10 @@ namespace blt::logging {
else else
std::cout << outputString; std::cout << outputString;
} }
if (BLT_LOGGING_PROPERTIES.m_logToFile) {
writer.writeLine(fileString);
}
} }
void log(const std::string& format, LOG_LEVEL level, int auto_line, ...) { void log(const std::string& format, LOG_LEVEL level, int auto_line, ...) {