| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #pragma once |
|
|
| #include <cstdlib> |
| #include <map> |
| #include <string> |
|
|
| #include "string_utils.h" |
|
|
| namespace fastertransformer { |
|
|
| class Logger { |
|
|
| public: |
| enum Level { |
| TRACE = 0, |
| DEBUG = 10, |
| INFO = 20, |
| WARNING = 30, |
| ERROR = 40 |
| }; |
|
|
| static Logger& getLogger() |
| { |
| thread_local Logger instance; |
| return instance; |
| } |
| Logger(Logger const&) = delete; |
| void operator=(Logger const&) = delete; |
|
|
| template<typename... Args> |
| void log(const Level level, const std::string format, const Args&... args) |
| { |
| if (level_ <= level) { |
| std::string fmt = getPrefix(level) + format + "\n"; |
| FILE* out = level_ < WARNING ? stdout : stderr; |
| std::string logstr = fmtstr(fmt, args...); |
| fprintf(out, "%s", logstr.c_str()); |
| } |
| } |
|
|
| template<typename... Args> |
| void log(const Level level, const int rank, const std::string format, const Args&... args) |
| { |
| if (level_ <= level) { |
| std::string fmt = getPrefix(level, rank) + format + "\n"; |
| FILE* out = level_ < WARNING ? stdout : stderr; |
| std::string logstr = fmtstr(fmt, args...); |
| fprintf(out, "%s", logstr.c_str()); |
| } |
| } |
|
|
| void setLevel(const Level level) |
| { |
| level_ = level; |
| log(INFO, "Set logger level by %s", getLevelName(level).c_str()); |
| } |
|
|
| int getLevel() const |
| { |
| return level_; |
| } |
|
|
| private: |
| const std::string PREFIX = "[FT]"; |
| const std::map<const Level, const std::string> level_name_ = { |
| {TRACE, "TRACE"}, {DEBUG, "DEBUG"}, {INFO, "INFO"}, {WARNING, "WARNING"}, {ERROR, "ERROR"}}; |
|
|
| #ifndef NDEBUG |
| const Level DEFAULT_LOG_LEVEL = DEBUG; |
| #else |
| const Level DEFAULT_LOG_LEVEL = INFO; |
| #endif |
| Level level_ = DEFAULT_LOG_LEVEL; |
|
|
| Logger(); |
|
|
| inline const std::string getLevelName(const Level level) |
| { |
| return level_name_.at(level); |
| } |
|
|
| inline const std::string getPrefix(const Level level) |
| { |
| return PREFIX + "[" + getLevelName(level) + "] "; |
| } |
|
|
| inline const std::string getPrefix(const Level level, const int rank) |
| { |
| return PREFIX + "[" + getLevelName(level) + "][" + std::to_string(rank) + "] "; |
| } |
| }; |
|
|
| #define FT_LOG(level, ...) \ |
| do { \ |
| if (fastertransformer::Logger::getLogger().getLevel() <= level) { \ |
| fastertransformer::Logger::getLogger().log(level, __VA_ARGS__); \ |
| } \ |
| } while (0) |
|
|
| #define FT_LOG_TRACE(...) FT_LOG(fastertransformer::Logger::TRACE, __VA_ARGS__) |
| #define FT_LOG_DEBUG(...) FT_LOG(fastertransformer::Logger::DEBUG, __VA_ARGS__) |
| #define FT_LOG_INFO(...) FT_LOG(fastertransformer::Logger::INFO, __VA_ARGS__) |
| #define FT_LOG_WARNING(...) FT_LOG(fastertransformer::Logger::WARNING, __VA_ARGS__) |
| #define FT_LOG_ERROR(...) FT_LOG(fastertransformer::Logger::ERROR, __VA_ARGS__) |
| } |
|
|