diff --git a/include/logging/logger.hpp b/include/logging/logger.hpp index dc3d72df1..90f0a66c9 100644 --- a/include/logging/logger.hpp +++ b/include/logging/logger.hpp @@ -111,4 +111,3 @@ private: Log* log; std::string name; }; - diff --git a/include/logging/streams/format.hpp b/include/logging/streams/format.hpp new file mode 100644 index 000000000..94cd1fc33 --- /dev/null +++ b/include/logging/streams/format.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +#include "logging/log.hpp" + +// TODO: in c++17 replace with logging::format +namespace logging +{ + namespace format + { + std::string out = "{} {:<5} [{}] {}\n"; + std::string err = out; + + // TODO: configurable formats + } + + class Formatter + { + public: + static std::string format(const std::string &format, + const Log::Record &record) + { + return fmt::format(format, static_cast(record.when()), + record.level_str(), record.where(), + record.text()); + } + }; +} diff --git a/include/logging/streams/stderr.hpp b/include/logging/streams/stderr.hpp new file mode 100644 index 000000000..a392e666e --- /dev/null +++ b/include/logging/streams/stderr.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "logging/log.hpp" + +class Stderr : public Log::Stream +{ +public: + void emit(const Log::Record&) override; +}; diff --git a/src/logging/streams/stderr.cpp b/src/logging/streams/stderr.cpp new file mode 100644 index 000000000..5fd354036 --- /dev/null +++ b/src/logging/streams/stderr.cpp @@ -0,0 +1,9 @@ +#include "logging/streams/stderr.hpp" + +#include +#include "logging/streams/format.hpp" + +void Stderr::emit(const Log::Record& record) +{ + std::cerr << logging::Formatter::format(logging::format::err, record); +} diff --git a/src/logging/streams/stdout.cpp b/src/logging/streams/stdout.cpp index 17d04806d..999b9122c 100644 --- a/src/logging/streams/stdout.cpp +++ b/src/logging/streams/stdout.cpp @@ -1,17 +1,9 @@ #include "logging/streams/stdout.hpp" #include -#include +#include "logging/streams/format.hpp" void Stdout::emit(const Log::Record& record) { - auto s = fmt::format("{} {:<5} [{}] {}\n", static_cast( - record.when()), record.level_str(), record.where(), - record.text()); - - std::cout << s; - - /* fmt::printf("{} {:<5} [{}] {}\n", static_cast(record.when()), */ - /* record.level_str(), record.where(), record.text()); */ + std::cout << logging::Formatter::format(logging::format::out, record); } - diff --git a/tests/unit/concurrent_map.cpp b/tests/unit/concurrent_map.cpp index b9e008332..6669747f0 100644 --- a/tests/unit/concurrent_map.cpp +++ b/tests/unit/concurrent_map.cpp @@ -1,5 +1,7 @@ #include +#include "logging/default.hpp" +#include "logging/streams/stdout.hpp" #include "data_structures/concurrent/concurrent_map.hpp" #include "utils/assert.hpp" @@ -8,59 +10,65 @@ using std::endl; using skiplist_t = ConcurrentMap; -void print_skiplist(const skiplist_t::Accessor &skiplist) { - cout << "---- skiplist now has: "; +void print_skiplist(const skiplist_t::Accessor &skiplist) +{ + cout << "---- skiplist now has: "; - for (auto &kv : skiplist) - cout << "(" << kv.first << ", " << kv.second << ") "; + for (auto &kv : skiplist) + cout << "(" << kv.first << ", " << kv.second << ") "; - cout << "----" << endl; + cout << "----" << endl; } -int main(void) { - skiplist_t skiplist; - auto accessor = skiplist.access(); +int main(void) +{ + logging::init_async(); + logging::log->pipe(std::make_unique()); - // insert 10 - permanent_assert(accessor.insert(1, 10).second == true, "add first element"); + skiplist_t skiplist; + auto accessor = skiplist.access(); - // try insert 10 again (should fail) - permanent_assert(accessor.insert(1, 10).second == false, - "add the same element, should fail"); + // insert 10 + permanent_assert(accessor.insert(1, 10).second == true, + "add first element"); - // insert 20 - permanent_assert(accessor.insert(2, 20).second == true, - "insert new unique element"); + // try insert 10 again (should fail) + permanent_assert(accessor.insert(1, 10).second == false, + "add the same element, should fail"); - print_skiplist(accessor); + // insert 20 + permanent_assert(accessor.insert(2, 20).second == true, + "insert new unique element"); - // value at key 3 shouldn't exist - permanent_assert((accessor.find(3) == accessor.end()) == true, - "try to find element which doesn't exist"); + print_skiplist(accessor); - // value at key 2 should exist - permanent_assert((accessor.find(2) != accessor.end()) == true, - "find iterator"); + // value at key 3 shouldn't exist + permanent_assert((accessor.find(3) == accessor.end()) == true, + "try to find element which doesn't exist"); - // at key 2 is 20 (true) - permanent_assert(accessor.find(2)->second == 20, "find element"); + // value at key 2 should exist + permanent_assert((accessor.find(2) != accessor.end()) == true, + "find iterator"); - // removed existing (1) - permanent_assert(accessor.remove(1) == true, "try to remove element"); + // at key 2 is 20 (true) + permanent_assert(accessor.find(2)->second == 20, "find element"); - // removed non-existing (3) - permanent_assert(accessor.remove(3) == false, - "try to remove element which doesn't exist"); + // removed existing (1) + permanent_assert(accessor.remove(1) == true, "try to remove element"); - // insert (1, 10) - permanent_assert(accessor.insert(1, 10).second == true, - "insert unique element"); + // removed non-existing (3) + permanent_assert(accessor.remove(3) == false, + "try to remove element which doesn't exist"); - // insert (4, 40) - permanent_assert(accessor.insert(4, 40).second == true, - "insert unique element"); + // insert (1, 10) + permanent_assert(accessor.insert(1, 10).second == true, + "insert unique element"); - print_skiplist(accessor); + // insert (4, 40) + permanent_assert(accessor.insert(4, 40).second == true, + "insert unique element"); - return 0; + print_skiplist(accessor); + + return 0; }