Xyris  0.5
Logger.cpp
Go to the documentation of this file.
1 /**
2  * @file Logger.cpp
3  * @author Keeton Feavel ([email protected])
4  * @brief
5  * @version 0.1
6  * @date 2022-01-21
7  *
8  * @copyright Copyright the Xyris Contributors (c) 2022
9  *
10  */
11 #include "Logger.hpp"
12 #include <Bootloader/Arguments.hpp>
13 #include <Library/stdio.hpp>
14 
16 {
17  switch (lvl) {
18  case lTRACE:
19  return "\033[36mTRACE\033[0m";
20  case lDEBUG:
21  return "\033[96mDEBUG\033[0m";
22  case lVERBOSE:
23  return "\033[92mVERBOSE\033[0m";
24  case lINFO:
25  return "\033[94mINFO\033[0m";
26  case lWARNING:
27  return "\033[93mWARNING\033[0m";
28  case lERROR:
29  return "\033[91mERROR\033[0m";
30  default:
31  return "UNKNOWN";
32  }
33 }
34 
35 void Logger::LogHelper(const char* tag, LogLevel lvl, const char* fmt, va_list ap)
36 {
38  ksprintf(the().m_logBuffer, "[%s] [%s] %s\n", tag, levelToString(lvl), fmt);
40 }
41 
42 void Logger::LogHelperPrint(const char* fmt, va_list ap)
43 {
44  for (size_t i = 0; i < m_writersIdx; i++) {
45  if (the().m_writers[i] != nullptr) {
46  the().m_writers[i](fmt, ap);
47  }
48  }
49 }
50 
51 void Logger::Trace(const char* tag, const char* fmt, ...)
52 {
53  if (lTRACE >= getLevel()) {
54  va_list ap;
55  va_start(ap, fmt);
56  the().LogHelper(tag, lTRACE, fmt, ap);
57  va_end(ap);
58  }
59 }
60 
61 void Logger::Verbose(const char* tag, const char* fmt, ...)
62 {
63  if (lVERBOSE >= getLevel()) {
64  va_list ap;
65  va_start(ap, fmt);
66  the().LogHelper(tag, lVERBOSE, fmt, ap);
67  va_end(ap);
68  }
69 }
70 
71 void Logger::Debug(const char* tag, const char* fmt, ...)
72 {
73  if (lDEBUG >= getLevel()) {
74  va_list ap;
75  va_start(ap, fmt);
76  the().LogHelper(tag, lDEBUG, fmt, ap);
77  va_end(ap);
78  }
79 }
80 
81 void Logger::Info(const char* tag, const char* fmt, ...)
82 {
83  if (lINFO >= getLevel()) {
84  va_list ap;
85  va_start(ap, fmt);
86  the().LogHelper(tag, lINFO, fmt, ap);
87  va_end(ap);
88  }
89 }
90 
91 void Logger::Warning(const char* tag, const char* fmt, ...)
92 {
93  if (lWARNING >= getLevel()) {
94  va_list ap;
95  va_start(ap, fmt);
96  the().LogHelper(tag, lWARNING, fmt, ap);
97  va_end(ap);
98  }
99 }
100 
101 void Logger::Error(const char* tag, const char* fmt, ...)
102 {
103  if (lERROR >= getLevel()) {
104  va_list ap;
105  va_start(ap, fmt);
106  the().LogHelper(tag, lERROR, fmt, ap);
107  va_end(ap);
108  }
109 }
110 
111 void Logger::Print(const char* fmt, ...)
112 {
113  va_list ap;
114  va_start(ap, fmt);
115  the().LogHelperPrint(fmt, ap);
116  va_end(ap);
117 }
118 
119 bool Logger::addWriter(LogWriter writer)
120 {
121  if (the().m_writersIdx < the().m_maxWriterCount) {
122  the().m_writers[the().m_writersIdx++] = writer;
123  return true;
124  }
125 
126  return false;
127 }
128 
129 bool Logger::removeWriter(LogWriter writer)
130 {
131  for (size_t idx = 0; idx < the().m_writersIdx; idx++) {
132  if (the().m_writers[idx] == writer) {
133  the().m_writers[idx] = nullptr;
134  return true;
135  }
136  }
137 
138  return false;
139 }
140 
142 {
143  static Logger instance;
144  return instance;
145 }
146 
148  : m_logBufferMutex("Logger")
149  , m_writersIdx(0)
150 #if defined(RELEASE)
151  , m_logLevel(lINFO)
152 #elif defined(DEBUG)
153  , m_logLevel(lDEBUG)
154 #endif
155 {
156  // Default constructor
157 }
158 
159 // Kernel argument callback
160 static void argumentCallback(const char* lvl)
161 {
162  // FIXME: Update kernel argument parser to handle `=`
163  (void)lvl;
164 }
165 
166 KERNEL_PARAM(logLevelArg, "--log-level=", argumentCallback);
stdio.hpp
Logger::lVERBOSE
@ lVERBOSE
Definition: Logger.hpp:23
Logger::m_logBufferMutex
Mutex m_logBufferMutex
Definition: Logger.hpp:58
ksprintf
int ksprintf(char *buf, const char *fmt,...)
Sends formatted output to a string.
Definition: printf.cpp:342
KERNEL_PARAM
KERNEL_PARAM(logLevelArg, "--log-level=", argumentCallback)
Logger::getLevel
static LogLevel getLevel()
Definition: Logger.hpp:46
Logger::LogLevel
LogLevel
Definition: Logger.hpp:20
Logger::LogHelper
void LogHelper(const char *tag, LogLevel lvl, const char *fmt, va_list args)
Definition: Logger.cpp:35
Logger::LogHelperPrint
void LogHelperPrint(const char *fmt, va_list args)
Definition: Logger.cpp:42
Logger::Error
static void Error(const char *tag, const char *fmt,...)
Definition: Logger.cpp:101
Logger::m_logBuffer
char m_logBuffer[m_maxBufferSize]
Definition: Logger.hpp:62
Logger::lTRACE
@ lTRACE
Definition: Logger.hpp:21
Arguments.hpp
Kernel command argument parsing.
Logger::lDEBUG
@ lDEBUG
Definition: Logger.hpp:22
Logger::Verbose
static void Verbose(const char *tag, const char *fmt,...)
Definition: Logger.cpp:61
Logger::Info
static void Info(const char *tag, const char *fmt,...)
Definition: Logger.cpp:81
Logger::m_writers
LogWriter m_writers[m_maxWriterCount]
Definition: Logger.hpp:61
Logger::addWriter
static bool addWriter(LogWriter writer)
Definition: Logger.cpp:119
Logger::Trace
static void Trace(const char *tag, const char *fmt,...)
Definition: Logger.cpp:51
Logger::Warning
static void Warning(const char *tag, const char *fmt,...)
Definition: Logger.cpp:91
Logger::m_writersIdx
size_t m_writersIdx
Definition: Logger.hpp:59
Logger::lINFO
@ lINFO
Definition: Logger.hpp:24
Logger::levelToString
const char * levelToString(LogLevel lvl)
Definition: Logger.cpp:15
Logger::Print
static void Print(const char *fmt,...)
Definition: Logger.cpp:111
Logger::the
static Logger & the()
Definition: Logger.cpp:141
Logger::Debug
static void Debug(const char *tag, const char *fmt,...)
Definition: Logger.cpp:71
RAIIMutex
Definition: RAII.hpp:16
Logger::Logger
Logger()
Definition: Logger.cpp:147
Logger
Definition: Logger.hpp:16
Logger::removeWriter
static bool removeWriter(LogWriter writer)
Definition: Logger.cpp:129
Logger::lWARNING
@ lWARNING
Definition: Logger.hpp:25
Logger.hpp
Logger::lERROR
@ lERROR
Definition: Logger.hpp:26
Logger::m_maxWriterCount
static const uint8_t m_maxWriterCount
Definition: Logger.hpp:56