|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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__) |
|
} |
|
|