added logging module and a sandbox project
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
#include "matador/logger/file_sink.hpp"
|
||||
|
||||
#include "matador/utils/os.hpp"
|
||||
#include "matador/utils/string.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace matador::logger {
|
||||
|
||||
file_sink::file_sink(const std::string &path)
|
||||
: path_(path)
|
||||
{
|
||||
std::string filename(path);
|
||||
// find last dir delimiter
|
||||
const char *last = strrchr(path.c_str(), os::DIR_SEPARATOR);
|
||||
if (last != nullptr) {
|
||||
path_.assign(path.data(), last-path.data());
|
||||
} else {
|
||||
path_.clear();
|
||||
}
|
||||
|
||||
if (last != nullptr) {
|
||||
filename = (last + 1);
|
||||
}
|
||||
// extract base path and extension
|
||||
if (std::vector<std::string> result; utils::split(filename, '.', result) != 2) {
|
||||
throw std::logic_error("split path must consists of two elements");
|
||||
}
|
||||
// get the current path
|
||||
const auto pwd = os::get_current_dir();
|
||||
// make the path
|
||||
os::mkpath(path_);
|
||||
// change into the path
|
||||
os::chdir(path_);
|
||||
// create the file
|
||||
stream = os::fopen(filename, "a");
|
||||
if (stream == nullptr) {
|
||||
os::chdir(pwd);
|
||||
throw std::logic_error("error opening file");
|
||||
}
|
||||
os::chdir(pwd);
|
||||
}
|
||||
|
||||
file_sink::file_sink(const char *path)
|
||||
: file_sink(std::string(path))
|
||||
{}
|
||||
|
||||
file_sink::~file_sink()
|
||||
{
|
||||
if (stream) {
|
||||
fclose(stream);
|
||||
stream = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
std::string file_sink::path() const
|
||||
{
|
||||
return path_;
|
||||
}
|
||||
|
||||
stdout_sink::stdout_sink()
|
||||
: basic_file_sink(stdout)
|
||||
{}
|
||||
|
||||
stderr_sink::stderr_sink()
|
||||
: basic_file_sink(stderr)
|
||||
{}
|
||||
}
|
||||
Reference in New Issue
Block a user