forked from NaiJi/project-kyoku
parent
7923e894e2
commit
9d9fa0e0b2
@ -0,0 +1,57 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
* @brief Basic logging class
|
||||
*
|
||||
* Defines helper functions for logging facility. Configured in Application::init()
|
||||
*
|
||||
*/
|
||||
class Log
|
||||
{
|
||||
public:
|
||||
enum LogLevel
|
||||
{
|
||||
FATAL,
|
||||
ERROR,
|
||||
WARN,
|
||||
INFO,
|
||||
DEBUG,
|
||||
};
|
||||
|
||||
LogLevel level = WARN; ///< Default logging level
|
||||
|
||||
/**
|
||||
* @brief Prints message to stdout
|
||||
*
|
||||
* TODO: write to configurable stream, be it stdout, stderr or even a file
|
||||
*
|
||||
* @param level the message level
|
||||
* @param fmt the message format
|
||||
* @param ... variable parameters
|
||||
*/
|
||||
void log(LogLevel level, const std::string &fmt, ...);
|
||||
|
||||
private:
|
||||
inline std::string _getLabel(LogLevel level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
case DEBUG: return "DEBUG";
|
||||
case INFO: return "INFO ";
|
||||
case WARN: return "WARN ";
|
||||
case ERROR: return "ERROR";
|
||||
case FATAL: return "FATAL";
|
||||
default: return "UNK ";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
extern Log LOG; /// Global variable :(
|
||||
|
||||
#define INFO(fmt, ...) LOG.log(Log::INFO, fmt, ##__VA_ARGS__)
|
||||
#define WARN(fmt, ...) LOG.log(Log::WARN, fmt, ##__VA_ARGS__)
|
||||
#define ERROR(fmt, ...) LOG.log(Log::ERROR, fmt, ##__VA_ARGS__)
|
||||
#define FATAL(fmt, ...) LOG.log(Log::FATAL, fmt, ##__VA_ARGS__)
|
||||
#define DEBUG(fmt, ...) LOG.log(Log::DEBUG, fmt, ##__VA_ARGS__)
|
@ -0,0 +1,26 @@
|
||||
#include <cstdarg>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
#include "application/log.h"
|
||||
|
||||
void Log::log(LogLevel level, const std::string &fmt, ...) {
|
||||
if (level > this->level)
|
||||
return;
|
||||
|
||||
va_list args;
|
||||
|
||||
// First va_start: count how many characters are needed for formatting
|
||||
va_start(args, fmt);
|
||||
size_t len = std::vsnprintf(NULL, 0, fmt.c_str(), args);
|
||||
va_end(args);
|
||||
|
||||
std::vector<char> buf(len + 1);
|
||||
|
||||
// Second va_start: actually write formatted message to buffer
|
||||
va_start(args, fmt);
|
||||
std::vsnprintf(&buf[0], len + 1, fmt.c_str(), args);
|
||||
va_end(args);
|
||||
|
||||
std::cout << this->_getLabel(level) << " " << &buf[0] << std::endl;
|
||||
}
|
Loading…
Reference in New Issue