Skip to content

Instantly share code, notes, and snippets.

@Fiona-J-W
Last active December 5, 2018 05:18
Show Gist options
  • Save Fiona-J-W/7c585cb0cdefc1ed7ad5 to your computer and use it in GitHub Desktop.
Save Fiona-J-W/7c585cb0cdefc1ed7ad5 to your computer and use it in GitHub Desktop.
loggers-mock
#include <fstream>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
enum class loglevel {
debug, note, warn, error
};
struct log_target {
log_target(std::ostream& stream, loglevel min_level = loglevel::note):
stream{&stream}, min_level{min_level} {}
log_target(std::ofstream& stream, loglevel min_level = loglevel::note):
stream{&stream}, min_level{min_level} {
if(!stream.is_open()) {
throw std::runtime_error{"logfile not open"};
}
}
std::ostream* stream;
loglevel min_level;
};
class logger_set {
public:
logger_set(std::initializer_list<log_target> lst): m_loggers{lst} {}
void log(loglevel level, const std::string& msg) {
for(auto& logger: m_loggers) {
if(level >= logger.min_level) {
*logger.stream << msg << std::flush;
}
}
}
private:
std::vector<log_target> m_loggers;
};
int main() {
auto loggers1 = logger_set{{std::cout}};
loggers1.log(loglevel::note, "foobar\n");
std::ofstream file1{"testfile1"};
auto loggers2 = logger_set{std::cout, {file1, loglevel::error}};
loggers2.log(loglevel::warn, "blablub\n");
loggers2.log(loglevel::error, "Some Error\n");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment