Skip to content

Commit 6395d67

Browse files
committed
fdsdump: add logger component
1 parent 4d05ef2 commit 6395d67

File tree

3 files changed

+183
-0
lines changed

3 files changed

+183
-0
lines changed

src/tools/fdsdump/src/common/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ set(COMMON_SRC
77
flowProvider.cpp
88
ipaddr.cpp
99
ieMgr.cpp
10+
logger.cpp
1011
)
1112

1213
add_library(common_obj OBJECT ${COMMON_SRC})
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* @file
3+
* @author Michal Sedlak <[email protected]>
4+
* @brief Logger component
5+
*
6+
* Copyright: (C) 2024 CESNET, z.s.p.o.
7+
* SPDX-License-Identifier: BSD-3-Clause
8+
*/
9+
10+
#include <common/logger.hpp>
11+
12+
namespace fdsdump {
13+
14+
static constexpr const char *loglevel_str[] = {
15+
"",
16+
"ERROR",
17+
"WARNING",
18+
"INFO",
19+
"DEBUG",
20+
"TRACE"
21+
};
22+
23+
Logger &Logger::get_instance()
24+
{
25+
static Logger logger;
26+
return logger;
27+
}
28+
29+
LogLevel operator++(LogLevel &level, int)
30+
{
31+
LogLevel old = level;
32+
if (level != LogLevel::trace) {
33+
level = static_cast<LogLevel>(static_cast<uint8_t>(level) + 1);
34+
}
35+
return old;
36+
}
37+
38+
LogLevel operator--(LogLevel &level, int)
39+
{
40+
LogLevel old = level;
41+
if (level != LogLevel::none) {
42+
level = static_cast<LogLevel>(static_cast<uint8_t>(level) - 1);
43+
}
44+
return old;
45+
}
46+
47+
Logger::Line::Line(LogLevel verbosity_level, LogLevel message_level)
48+
: m_ignored(message_level > verbosity_level)
49+
{
50+
if (!m_ignored) {
51+
std::cerr << loglevel_str[static_cast<uint8_t>(message_level)] << ": ";
52+
}
53+
}
54+
55+
Logger::Line::~Line()
56+
{
57+
if (!m_ignored) {
58+
std::cerr << "\n";
59+
}
60+
}
61+
62+
} // fdsdump
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/**
2+
* @file
3+
* @author Michal Sedlak <[email protected]>
4+
* @brief Logger component
5+
*
6+
* Copyright: (C) 2024 CESNET, z.s.p.o.
7+
* SPDX-License-Identifier: BSD-3-Clause
8+
*/
9+
10+
#pragma once
11+
12+
#include <common/common.hpp>
13+
14+
#include <iostream>
15+
16+
namespace fdsdump {
17+
18+
/**
19+
* The logging level
20+
*/
21+
enum class LogLevel : uint8_t {
22+
none,
23+
error,
24+
warning,
25+
info,
26+
debug,
27+
trace
28+
};
29+
30+
/**
31+
* @brief Increase the log level
32+
*/
33+
LogLevel operator++(LogLevel &level, int);
34+
35+
/**
36+
* @brief Decrease the log level
37+
*/
38+
LogLevel operator--(LogLevel &level, int);
39+
40+
/**
41+
* @brief A logger component
42+
*/
43+
class Logger {
44+
public:
45+
/**
46+
* @brief A single log line
47+
*/
48+
class Line {
49+
DISABLE_COPY_AND_MOVE(Line)
50+
51+
public:
52+
/**
53+
* @brief Finish the log line
54+
*/
55+
~Line();
56+
57+
/**
58+
* @brief Write value onto the log line
59+
*
60+
* @param value The value to write
61+
*
62+
* @return reference to self
63+
*/
64+
template <typename T>
65+
Line &operator<<(const T& value)
66+
{
67+
if (!m_ignored) {
68+
std::cerr << value;
69+
}
70+
return *this;
71+
}
72+
73+
private:
74+
friend class Logger;
75+
76+
bool m_ignored;
77+
Line(LogLevel verbosity_level, LogLevel message_level);
78+
};
79+
80+
81+
/**
82+
* @brief Get the instance of the logger
83+
*/
84+
static Logger &get_instance();
85+
86+
/**
87+
* @brief Set the maximum level of messages to show
88+
*
89+
* @param level The level
90+
*/
91+
void set_log_level(LogLevel level)
92+
{
93+
m_log_level = level;
94+
}
95+
96+
/**
97+
* @brief Log a line on a specified logging level
98+
*
99+
* @param level The log level
100+
*
101+
* @return The line object
102+
*/
103+
Line log(LogLevel level)
104+
{
105+
return {m_log_level, level};
106+
}
107+
108+
private:
109+
LogLevel m_log_level = LogLevel::trace;
110+
111+
Logger() = default;
112+
};
113+
114+
#define LOG_TRACE (Logger::get_instance().log(LogLevel::trace))
115+
#define LOG_DEBUG (Logger::get_instance().log(LogLevel::debug))
116+
#define LOG_INFO (Logger::get_instance().log(LogLevel::info))
117+
#define LOG_WARNING (Logger::get_instance().log(LogLevel::warning))
118+
#define LOG_ERROR (Logger::get_instance().log(LogLevel::error))
119+
120+
} // fdsdump

0 commit comments

Comments
 (0)