Log/Log.h

69 lines
1.3 KiB
C++

#pragma once
#include <sstream> // std::stringstream (buffer for log entries)
#include <string>
#ifndef LOG_USEMUTEX
#define LOG_USEMUTEX 0
#endif
namespace Log {
enum Level { OFF = 0, FATAL, ERROR, WARN, NOTE, INFO, DEBUG, TRACE };
// set up the logger with a ConsoleOutput
void init();
// close all output streams
void stop();
void addLogfile(const std::string& filename, Level max);
void addLogfile(const std::string& filename, Level min, Level max);
void setConsoleLogLevel(Level lvl);
void setColoredOutput(bool enabled);
// Log entry that can be formed with various mixed data types
// by concatenation with the << operator
// Inspired from https://stackoverflow.com/a/8337882
class Entry {
private:
std::stringstream ss;
Level lvl;
void addMetadataHeader();
public:
Entry(Level lvl);
Entry(Entry&&) = default;
~Entry();
template <typename T> Entry& operator<<(const T& msg) {
ss << msg;
return *this;
}
};
class LeveledSink {
private:
Level level;
public:
LeveledSink(Level level);
template <typename T> Entry operator<<(const T& msg) {
Entry entry(level);
entry << msg;
return entry;
}
};
// LeveledSinks
extern LeveledSink fatal;
extern LeveledSink error;
extern LeveledSink warn;
extern LeveledSink note;
extern LeveledSink info;
extern LeveledSink debug;
extern LeveledSink trace;
} // namespace Log