44#ifndef MSCCLPP_LOGGER_HPP_
55#define MSCCLPP_LOGGER_HPP_
66
7+ #include < bitset>
78#include < fstream>
89#include < iomanip>
910#include < iostream>
1415
1516namespace 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+
1721namespace detail {
1822std::string guessRemoveProjectPrefix (const std::string& filePathStr);
1923std::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
3330class 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_
0 commit comments