From 168ceb052e9dee57aaedc2ba1e25fd13f95269f3 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 4 Dec 2018 14:12:22 +0100 Subject: [PATCH] fix logging --- common/include/villas/log.hpp | 4 +++- common/include/villas/memory.hpp | 3 ++- common/lib/CMakeLists.txt | 1 + common/lib/log.cpp | 27 +++++++++++++++++++++------ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/common/include/villas/log.hpp b/common/include/villas/log.hpp index 4ab1d4853..465f955f3 100644 --- a/common/include/villas/log.hpp +++ b/common/include/villas/log.hpp @@ -48,7 +48,7 @@ class Log { public: using Level = spdlog::level::level_enum; - using DistSink = spdlog::sinks::dist_sink_mt; + using DistSink = std::shared_ptr; protected: Logger logger = logging.get("log"); @@ -59,6 +59,8 @@ protected: std::string pattern; /**< Logging format. */ std::string prefix; /**< Prefix each line with this string. */ + void init(); + public: Log(Level level = Level::info); diff --git a/common/include/villas/memory.hpp b/common/include/villas/memory.hpp index c70c7ee60..8f229dc57 100644 --- a/common/include/villas/memory.hpp +++ b/common/include/villas/memory.hpp @@ -134,7 +134,8 @@ public: { // CRTP derivedAlloc = static_cast(this); - logger = logging.get(derivedAlloc->getName()); + std::string loggerName = fmt::format("memory:", derivedAlloc->getName()); + logger = logging.get(loggerName); // default deallocation callback free = [&](MemoryBlock* mem) { diff --git a/common/lib/CMakeLists.txt b/common/lib/CMakeLists.txt index 93e135d52..47eb3ac13 100644 --- a/common/lib/CMakeLists.txt +++ b/common/lib/CMakeLists.txt @@ -81,6 +81,7 @@ target_link_libraries(villas-common PUBLIC ${CMAKE_DL_LIBS} spdlog fmt + stdc++ ) target_compile_definitions(villas-common PUBLIC diff --git a/common/lib/log.cpp b/common/lib/log.cpp index a284ac028..3d48b5a17 100644 --- a/common/lib/log.cpp +++ b/common/lib/log.cpp @@ -35,7 +35,11 @@ using namespace villas; /** The global log instance */ Log villas::logging; -Log::Log(Level level) +Log::Log(Level lvl) : + level(lvl) +{ } + +void Log::init() { char *p = getenv("VILLAS_LOG_PREFIX"); if (p) @@ -44,9 +48,11 @@ Log::Log(Level level) setLevel(level); setPattern("%H:%M:%S %^%l%$ %n: %v"); + sinks = std::make_shared(); + + // Default sink auto sink = std::make_shared(); - sink->set_pattern(prefix + pattern); sinks->add_sink(sink); } @@ -64,9 +70,18 @@ Logger Log::get(const std::string &name) { Logger logger = spdlog::get(name); - if (not logger) + if (not sinks) + init(); + + if (not logger) { logger = std::make_shared(name, sinks); + logger->set_level(level); + logger->set_pattern(prefix + pattern); + + spdlog::register_logger(logger); + } + return logger; } @@ -80,7 +95,7 @@ void Log::parse(json_t *cfg) int ret; json_error_t err; - json_t *json_expressions; + json_t *json_expressions = nullptr; ret = json_unpack_ex(cfg, &err, 0, "{ s?: s, s?: s, s?: s, s?: b, s?: s }", "level", &level, @@ -98,13 +113,13 @@ void Log::parse(json_t *cfg) if (path) { auto sink = std::make_shared(path); - sinks.add_sink(sink); + sinks->add_sink(sink); } if (syslog) { auto sink = std::make_shared("villas", LOG_PID, LOG_DAEMON); - sinks.add_sink(sink); + sinks->add_sink(sink); } if (json_expressions) {