/*
- * Copyright 2004-present Facebook, Inc.
+ * Copyright 2017-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
#include <folly/experimental/logging/LogLevel.h>
+#include <array>
#include <cctype>
#include <ostream>
namespace folly {
+namespace {
+struct NumberedLevelInfo {
+ LogLevel min;
+ LogLevel max;
+ StringPiece lowerPrefix;
+ StringPiece upperPrefix;
+};
+
+constexpr std::array<NumberedLevelInfo, 2> numberedLogLevels = {{
+ NumberedLevelInfo{LogLevel::DBG, LogLevel::DBG0, "dbg", "DBG"},
+ NumberedLevelInfo{LogLevel::INFO, LogLevel::INFO0, "info", "INFO"},
+}};
+} // namespace
+
LogLevel stringToLogLevel(StringPiece name) {
string lowerNameStr;
lowerNameStr.reserve(name.size());
// If the string is of the form "LogLevel::foo" or "LogLevel(foo)"
// strip it down just to "foo". This makes sure we can process both
- // the "LogLevel::DEBUG" and "LogLevel(1234)" formats produced by
+ // the "LogLevel::WARN" and "LogLevel(1234)" formats produced by
// logLevelToString().
constexpr StringPiece lowercasePrefix{"loglevel::"};
constexpr StringPiece wrapperPrefix{"loglevel("};
return LogLevel::UNINITIALIZED;
} else if (lowerName == "none") {
return LogLevel::NONE;
- } else if (lowerName == "debug") {
- return LogLevel::DEBUG;
+ } else if (lowerName == "debug" || lowerName == "dbg") {
+ return LogLevel::DBG;
} else if (lowerName == "info") {
return LogLevel::INFO;
} else if (lowerName == "warn" || lowerName == "warning") {
return LogLevel::MAX_LEVEL;
}
- if (lowerName.startsWith("dbg")) {
- auto remainder = lowerName.subpiece(3);
+ for (const auto& info : numberedLogLevels) {
+ if (!lowerName.startsWith(info.lowerPrefix)) {
+ continue;
+ }
+ auto remainder = lowerName.subpiece(info.lowerPrefix.size());
auto level = folly::tryTo<int>(remainder).value_or(-1);
- if (level < 0 || level > 100) {
- throw std::range_error("invalid dbg logger level: " + name.str());
+ if (level < 0 ||
+ static_cast<unsigned int>(level) > (static_cast<uint32_t>(info.max) -
+ static_cast<uint32_t>(info.min))) {
+ throw std::range_error(to<string>(
+ "invalid ", info.lowerPrefix, " logger level: ", name.str()));
}
- return LogLevel::DBG0 - level;
+ return info.max - level;
}
// Try as an plain integer if all else fails
auto level = folly::to<uint32_t>(lowerName);
return static_cast<LogLevel>(level);
} catch (const std::exception&) {
- throw std::range_error("invalid logger name " + name.str());
+ throw std::range_error("invalid logger level: " + name.str());
}
}
string logLevelToString(LogLevel level) {
if (level == LogLevel::UNINITIALIZED) {
- return "LogLevel::UNINITIALIZED";
+ return "UNINITIALIZED";
} else if (level == LogLevel::NONE) {
- return "LogLevel::NONE";
- } else if (level == LogLevel::DEBUG) {
- return "LogLevel::DEBUG";
+ return "NONE";
+ } else if (level == LogLevel::DBG) {
+ return "DEBUG";
} else if (level == LogLevel::INFO) {
- return "LogLevel::INFO";
+ return "INFO";
} else if (level == LogLevel::WARN) {
- return "LogLevel::WARN";
+ return "WARN";
} else if (level == LogLevel::ERR) {
- return "LogLevel::ERR";
+ return "ERR";
} else if (level == LogLevel::CRITICAL) {
- return "LogLevel::CRITICAL";
+ return "CRITICAL";
} else if (level == LogLevel::DFATAL) {
- return "LogLevel::DFATAL";
+ return "DFATAL";
} else if (level == LogLevel::FATAL) {
- return "LogLevel::FATAL";
+ return "FATAL";
}
- if (static_cast<uint32_t>(level) <= static_cast<uint32_t>(LogLevel::DBG0) &&
- static_cast<uint32_t>(level) > static_cast<uint32_t>(LogLevel::DEBUG)) {
- auto num =
- static_cast<uint32_t>(LogLevel::DBG0) - static_cast<uint32_t>(level);
- return folly::to<string>("LogLevel::DBG", num);
+ for (const auto& info : numberedLogLevels) {
+ if (static_cast<uint32_t>(level) <= static_cast<uint32_t>(info.max) &&
+ static_cast<uint32_t>(level) > static_cast<uint32_t>(info.min)) {
+ auto num = static_cast<uint32_t>(info.max) - static_cast<uint32_t>(level);
+ return folly::to<string>(info.upperPrefix, num);
+ }
}
+
return folly::to<string>("LogLevel(", static_cast<uint32_t>(level), ")");
}
os << logLevelToString(level);
return os;
}
-}
+} // namespace folly