LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
Loading...
Searching...
No Matches
spdlog_utils.cc
1
9#include "spdlog_utils.h"
10
11#include <spdlog/pattern_formatter.h>
12#include <spdlog/sinks/stdout_color_sinks.h>
13
14namespace lf::base {
15
16std::shared_ptr<spdlog::logger> InitLogger(const std::string& name) {
17 auto result = spdlog::stdout_color_mt(name);
18 result->set_formatter(std::make_unique<LineFeedFormatter>(
19 std::make_unique<spdlog::pattern_formatter>()));
20 return result;
21}
22
24 std::unique_ptr<spdlog::formatter> wrapped_formatter)
25 : wrapped_formatter_(std::move(wrapped_formatter)) {}
26
27void LineFeedFormatter::format(const spdlog::details::log_msg& msg,
28 spdlog::memory_buf_t& dest) {
29 int offset = -2; // -2: first line, // -1 second line
30 const auto* begin = msg.payload.begin();
31
32 for (const auto* it = msg.payload.begin();; ++it) {
33 if (it == msg.payload.end() || *it == '\n') {
34 if (offset == -2) {
35 ++offset;
36 } else if (offset == -1) {
37 // the log message has more than one line
38 // => determine the offset
39 spdlog::memory_buf_t temp_dest;
40 const spdlog::details::log_msg empty_msg(msg.time, msg.source,
41 msg.logger_name, msg.level,
42 spdlog::string_view_t());
43 wrapped_formatter_->format(empty_msg, temp_dest);
44 offset = static_cast<int>(temp_dest.size() - 1);
45 }
46
47 const spdlog::details::log_msg part(
48 msg.time, msg.source, msg.logger_name, msg.level,
49 spdlog::string_view_t(begin, it - begin));
50
51 auto old_end = dest.size();
52 wrapped_formatter_->format(part, dest);
53
54 if (offset > 0) {
55 std::memset(dest.data() + old_end, ' ', offset);
56 }
57
58 if (it == msg.payload.end()) {
59 break;
60 }
61 begin = it + 1;
62 }
63 }
64}
65
66std::unique_ptr<spdlog::formatter> LineFeedFormatter::clone() const {
67 return std::make_unique<LineFeedFormatter>(wrapped_formatter_->clone());
68}
69
70} // namespace lf::base
LineFeedFormatter(std::unique_ptr< spdlog::formatter > wrapped_formatter)
std::unique_ptr< spdlog::formatter > wrapped_formatter_
void format(const spdlog::details::log_msg &msg, spdlog::memory_buf_t &dest) override
std::unique_ptr< formatter > clone() const override
Contains basic functionality that is used by other parts of LehrFEM++.
Definition base.h:15
std::shared_ptr< spdlog::logger > InitLogger(const std::string &name)
Create a spdlog logger, register it in the spdlog registry and initialize it with LehrFEM++ specific ...