1

update logger

This commit is contained in:
2022-07-16 03:30:35 +02:00
parent 2f7a2a219b
commit 2b92b180f4
2 changed files with 90 additions and 17 deletions

View File

@ -1,45 +1,95 @@
#include "user/lib/Logger.h" #include "user/lib/Logger.h"
#include "kernel/Globals.h" #include "kernel/Globals.h"
bool Logger::kout_enabled = true; bool Logger::kout_enabled = false;
bool Logger::serial_enabled = true; bool Logger::serial_enabled = true;
const Semaphore Logger::sem = Semaphore(1); const Semaphore Logger::sem = Semaphore(1);
Logger::LogLevel Logger::level = Logger::TRACE; Logger::LogLevel Logger::level = Logger::TRACE;
void Logger::log(char* message, CGA::color col) { void Logger::log(char* message, CGA::color col) const {
if (Logger::kout_enabled) { if (Logger::kout_enabled) {
CGA::color old_col = kout.color_fg; CGA::color old_col = kout.color_fg;
kout << fgc(col) << this->name << " :: " << message << fgc(old_col) << endl; kout << fgc(col)
<< Logger::level_to_string(this->current_message_level) << "::"
<< this->name << ":: "
<< message << fgc(old_col);
kout.flush(); // Don't add newline, Logger already does that
} }
if (Logger::serial_enabled) { if (Logger::serial_enabled) {
serial.write(Logger::level_to_string(this->current_message_level));
serial.write("::");
serial.write(this->name); serial.write(this->name);
serial.write(":: "); serial.write(":: ");
serial.write(message); serial.write(message);
serial.write("\r\n"); serial.write('\r');
// serial.write("\r\n");
} }
} }
void Logger::trace(char* message) { void Logger::flush() {
this->buffer[this->pos] = '\0';
switch (this->current_message_level) {
case Logger::TRACE:
this->trace(this->buffer);
break;
case Logger::DEBUG:
this->debug(this->buffer);
break;
case Logger::ERROR:
this->error(this->buffer);
break;
case Logger::INFO:
this->info(this->buffer);
break;
}
this->current_message_level = Logger::INFO;
this->pos = 0;
}
void Logger::trace(char* message) const {
if (Logger::level <= Logger::TRACE) { if (Logger::level <= Logger::TRACE) {
this->log(message, CGA::GREEN); this->log(message, CGA::GREEN);
} }
} }
void Logger::debug(char* message) { void Logger::debug(char* message) const {
if (Logger::level <= Logger::DEBUG) { if (Logger::level <= Logger::DEBUG) {
this->log(message, CGA::CYAN); this->log(message, CGA::LIGHT_BLUE);
} }
} }
void Logger::error(char* message) { void Logger::error(char* message) const {
if (Logger::level <= Logger::ERROR) { if (Logger::level <= Logger::ERROR) {
this->log(message, CGA::RED); this->log(message, CGA::RED);
} }
} }
void Logger::info(char* message) { void Logger::info(char* message) const {
if (Logger::level <= Logger::TRACE) { if (Logger::level <= Logger::TRACE) {
this->log(message, CGA::LIGHT_GREY); this->log(message, CGA::CYAN);
} }
} }
// Manipulatoren
Logger& TRACE(Logger& log) {
log.current_message_level = Logger::TRACE;
return log;
}
Logger& DEBUG(Logger& log) {
log.current_message_level = Logger::DEBUG;
return log;
}
Logger& ERROR(Logger& log) {
log.current_message_level = Logger::ERROR;
return log;
}
Logger& INFO(Logger& log) {
log.current_message_level = Logger::INFO;
return log;
}

View File

@ -2,9 +2,10 @@
#define __Logger_Include_H_ #define __Logger_Include_H_
#include "devices/CGA.h" #include "devices/CGA.h"
#include "lib/OutStream.h"
#include "lib/Semaphore.h" #include "lib/Semaphore.h"
class Logger { class Logger : public OutStream {
private: private:
Logger(const Logger& copy) = delete; Logger(const Logger& copy) = delete;
@ -15,7 +16,7 @@ private:
// TODO: Don't mix logs // TODO: Don't mix logs
static const Semaphore sem; static const Semaphore sem;
void log(char* message, CGA::color col); void log(char* message, CGA::color col) const;
public: public:
Logger(char* name) : name(name) {} Logger(char* name) : name(name) {}
@ -27,17 +28,33 @@ public:
INFO = 3 INFO = 3
}; };
static LogLevel level; static LogLevel level;
LogLevel current_message_level = Logger::INFO; // Use this to log with manipulators
void trace(char* message); void flush() override;
void debug(char* message);
void error(char* message); void trace(char* message) const;
void info(char* message); void debug(char* message) const;
void error(char* message) const;
void info(char* message) const;
// TODO: Make level change accessible over menu // TODO: Make level change accessible over menu
static void set_level(LogLevel level) { static void set_level(LogLevel level) {
Logger::level = level; Logger::level = level;
} }
static char* level_to_string(LogLevel level) {
switch (level) {
case Logger::TRACE:
return "TRACE";
case Logger::DEBUG:
return "DEBUG";
case Logger::ERROR:
return "ERROR";
case Logger::INFO:
return "INFO";
}
}
static void enable_kout() { static void enable_kout() {
Logger::kout_enabled = true; Logger::kout_enabled = true;
} }
@ -52,4 +69,10 @@ public:
} }
}; };
// Manipulatoren
Logger& TRACE(Logger& log);
Logger& DEBUG(Logger& log);
Logger& ERROR(Logger& log);
Logger& INFO(Logger& log);
#endif #endif