Skip to content

Commit c371837

Browse files
committed
Use bitset for subsys filtering
1 parent b68c1ce commit c371837

File tree

2 files changed

+51
-54
lines changed

2 files changed

+51
-54
lines changed

src/include/logger.hpp

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#ifndef MSCCLPP_LOGGER_HPP_
55
#define MSCCLPP_LOGGER_HPP_
66

7+
#include <bitset>
78
#include <fstream>
89
#include <iomanip>
910
#include <iostream>
@@ -14,21 +15,17 @@
1415

1516
namespace mscclpp {
1617

18+
typedef enum : unsigned int { NONE = 0, DEBUG, INFO, WARN, ERROR } LogLevel;
19+
typedef enum : std::size_t { ENV = 0, NET, CONN, EXEC, NCCL, COUNT } LogSubsys;
20+
1721
namespace detail {
1822
std::string guessRemoveProjectPrefix(const std::string& filePathStr);
1923
std::string timestamp(const char* format = "%Y-%m-%d %X");
20-
std::string subsysFlagToString(unsigned int flag);
24+
std::string logSubsysToString(LogSubsys subsys);
2125
} // namespace detail
2226

23-
typedef enum : unsigned int { NONE = 0, DEBUG, INFO, WARN, ERROR } LogLevel;
24-
typedef enum : unsigned int {
25-
ENV = 0x1,
26-
NET = 0x2,
27-
CONN = 0x4,
28-
EXEC = 0x8,
29-
NCCL = 0x10,
30-
ALL = 0xFFFFFFFF
31-
} LogSubsysFlag;
27+
// Bitset holding enabled subsystems.
28+
using LogSubsysSet = std::bitset<static_cast<std::size_t>(LogSubsys::COUNT)>;
3229

3330
class Logger {
3431
private:
@@ -59,7 +56,7 @@ class Logger {
5956
std::string header_;
6057
LogLevel level_;
6158
char delimiter_;
62-
unsigned int subsysFlags_;
59+
LogSubsysSet subsysSet_;
6360
std::ofstream logFileStream_;
6461

6562
public:
@@ -78,9 +75,9 @@ class Logger {
7875
void setDelimiter(char delimiter) { delimiter_ = delimiter; }
7976

8077
template <bool NewLine, typename... Args>
81-
std::string message(LogLevel level, LogSubsysFlag flag, Args&&... args) {
78+
std::string message(LogLevel level, LogSubsys subsys, Args&&... args) {
8279
if (level < level_) return "";
83-
if ((flag & subsysFlags_) == 0) return "";
80+
if (!subsysSet_.test(static_cast<std::size_t>(subsys))) return "";
8481

8582
if (sizeof...(args) == 0) {
8683
if constexpr (NewLine) {
@@ -121,8 +118,8 @@ class Logger {
121118
}
122119

123120
template <typename... Args>
124-
void log(LogLevel level, LogSubsysFlag flag, Args&&... args) {
125-
auto msg = message<true>(level, flag, std::forward<Args>(args)...);
121+
void log(LogLevel level, LogSubsys subsys, Args&&... args) {
122+
auto msg = message<true>(level, subsys, std::forward<Args>(args)...);
126123
if (msg.empty()) return;
127124
if (logFileStream_.is_open()) {
128125
logFileStream_ << msg;
@@ -138,27 +135,27 @@ Logger& logger(const std::string& header, const std::string& level, char delimit
138135

139136
} // namespace mscclpp
140137

141-
#define LOGGER_LOG(level__, flag__, ...) \
142-
do { \
143-
::mscclpp::logger("%@ %@ %@ %@:%@ ", ::mscclpp::env()->logLevel, 0) \
144-
.log(level__, flag__, ::mscclpp::detail::timestamp(), "MSCCLPP", \
145-
::mscclpp::detail::subsysFlagToString(flag__), ::mscclpp::detail::guessRemoveProjectPrefix(__FILE__), \
146-
__LINE__, __VA_ARGS__); \
138+
#define LOGGER_LOG(level__, subsys__, ...) \
139+
do { \
140+
::mscclpp::logger("%@ %@ %@ %@:%@ ", ::mscclpp::env()->logLevel, 0) \
141+
.log(level__, subsys__, ::mscclpp::detail::timestamp(), "MSCCLPP", \
142+
::mscclpp::detail::logSubsysToString(subsys__), ::mscclpp::detail::guessRemoveProjectPrefix(__FILE__), \
143+
__LINE__, __VA_ARGS__); \
147144
} while (0)
148145

149-
#define LOG(level__, flag__, ...) LOGGER_LOG(level__, flag__, __VA_ARGS__)
150-
#define DEBUG(flag__, ...) LOGGER_LOG(::mscclpp::LogLevel::DEBUG, flag__, __VA_ARGS__)
151-
#define INFO(flag__, ...) LOGGER_LOG(::mscclpp::LogLevel::INFO, flag__, __VA_ARGS__)
152-
#define WARN(flag__, ...) LOGGER_LOG(::mscclpp::LogLevel::WARN, flag__, __VA_ARGS__)
153-
#define ERROR(flag__, ...) LOGGER_LOG(::mscclpp::LogLevel::ERROR, flag__, __VA_ARGS__)
154-
#define THROW(flag__, exception__, errorCode__, ...) \
155-
do { \
156-
throw exception__( \
157-
::mscclpp::logger("%@ %@ %@ %@:%@ ", ::mscclpp::env()->logLevel, 0) \
158-
.message<false>(::mscclpp::LogLevel::ERROR, flag__, ::mscclpp::detail::timestamp(), "MSCCLPP", \
159-
::mscclpp::detail::subsysFlagToString(flag__), \
160-
::mscclpp::detail::guessRemoveProjectPrefix(__FILE__), __LINE__, __VA_ARGS__), \
161-
errorCode__); \
146+
#define LOG(level__, subsys__, ...) LOGGER_LOG(level__, subsys__, __VA_ARGS__)
147+
#define DEBUG(subsys__, ...) LOGGER_LOG(::mscclpp::LogLevel::DEBUG, subsys__, __VA_ARGS__)
148+
#define INFO(subsys__, ...) LOGGER_LOG(::mscclpp::LogLevel::INFO, subsys__, __VA_ARGS__)
149+
#define WARN(subsys__, ...) LOGGER_LOG(::mscclpp::LogLevel::WARN, subsys__, __VA_ARGS__)
150+
#define ERROR(subsys__, ...) LOGGER_LOG(::mscclpp::LogLevel::ERROR, subsys__, __VA_ARGS__)
151+
#define THROW(subsys__, exception__, errorCode__, ...) \
152+
do { \
153+
throw exception__( \
154+
::mscclpp::logger("%@ %@ %@ %@:%@ ", ::mscclpp::env()->logLevel, 0) \
155+
.message<false>(::mscclpp::LogLevel::ERROR, subsys__, ::mscclpp::detail::timestamp(), "MSCCLPP", \
156+
::mscclpp::detail::logSubsysToString(subsys__), \
157+
::mscclpp::detail::guessRemoveProjectPrefix(__FILE__), __LINE__, __VA_ARGS__), \
158+
errorCode__); \
162159
} while (0)
163160

164161
#endif // MSCCLPP_LOGGER_HPP_

src/logger.cc

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static LogLevel stringToLogLevel(const std::string& levelStr) {
3232
return LogLevel::ERROR; // Shouldn't reach here
3333
}
3434

35-
static unsigned int stringToSubsysFlags(const std::string& subsysStr) {
35+
static LogSubsysSet stringToLogSubsysSet(const std::string& subsysStr) {
3636
bool invert = false;
3737
std::string str = subsysStr;
3838
if (!str.empty() && str[0] == '^') {
@@ -41,7 +41,7 @@ static unsigned int stringToSubsysFlags(const std::string& subsysStr) {
4141
}
4242
std::string upperStr = str;
4343
std::transform(upperStr.begin(), upperStr.end(), upperStr.begin(), ::toupper);
44-
unsigned int flag = 0;
44+
LogSubsysSet set; // all bits start cleared
4545
size_t start = 0;
4646
size_t end = upperStr.find(',');
4747
if (end == std::string::npos && !upperStr.empty()) {
@@ -50,25 +50,25 @@ static unsigned int stringToSubsysFlags(const std::string& subsysStr) {
5050
while (end != std::string::npos) {
5151
std::string token = upperStr.substr(start, end - start);
5252
if (token == "ENV") {
53-
flag |= LogSubsysFlag::ENV;
53+
set.set(static_cast<size_t>(LogSubsys::ENV));
5454
} else if (token == "NET") {
55-
flag |= LogSubsysFlag::NET;
55+
set.set(static_cast<size_t>(LogSubsys::NET));
5656
} else if (token == "CONN") {
57-
flag |= LogSubsysFlag::CONN;
57+
set.set(static_cast<size_t>(LogSubsys::CONN));
5858
} else if (token == "EXEC") {
59-
flag |= LogSubsysFlag::EXEC;
59+
set.set(static_cast<size_t>(LogSubsys::EXEC));
6060
} else if (token == "NCCL") {
61-
flag |= LogSubsysFlag::NCCL;
61+
set.set(static_cast<size_t>(LogSubsys::NCCL));
6262
} else if (token == "ALL") {
63-
flag |= LogSubsysFlag::ALL;
63+
set.set(); // all bits
6464
}
6565
start = end + 1;
6666
end = upperStr.find(',', start);
6767
}
6868
if (invert) {
69-
flag = ~flag;
69+
set.flip();
7070
}
71-
return flag;
71+
return set;
7272
}
7373

7474
namespace detail {
@@ -171,20 +171,20 @@ std::string timestamp(const char* format) {
171171
}
172172
}
173173

174-
std::string subsysFlagToString(unsigned int flag) {
175-
switch (flag) {
176-
case LogSubsysFlag::ENV:
174+
std::string logSubsysToString(LogSubsys subsys) {
175+
switch (subsys) {
176+
case LogSubsys::ENV:
177177
return "ENV";
178-
case LogSubsysFlag::NET:
178+
case LogSubsys::NET:
179179
return "NET";
180-
case LogSubsysFlag::CONN:
180+
case LogSubsys::CONN:
181181
return "CONN";
182-
case LogSubsysFlag::EXEC:
182+
case LogSubsys::EXEC:
183183
return "EXEC";
184-
case LogSubsysFlag::NCCL:
184+
case LogSubsys::NCCL:
185185
return "NCCL";
186-
case LogSubsysFlag::ALL:
187-
return "ALL";
186+
case LogSubsys::COUNT:
187+
return "ALL"; // COUNT isn't a subsystem; treat only if misused.
188188
default:
189189
return "UNKNOWN";
190190
}
@@ -197,7 +197,7 @@ static std::shared_ptr<Logger> globalLoggerPtr;
197197

198198
Logger::Logger(const std::string& header, const LogLevel level, const char delimiter)
199199
: header_(header), level_(level), delimiter_(delimiter) {
200-
subsysFlags_ = stringToSubsysFlags(env()->logSubsys);
200+
subsysSet_ = stringToLogSubsysSet(env()->logSubsys);
201201
const std::string& path = env()->logFile;
202202
if (!path.empty()) {
203203
logFileStream_.open(path, std::ios::out | std::ios::app);

0 commit comments

Comments
 (0)