Skip to content

Commit 14f4161

Browse files
authored
feat: add console backend constructor that gets level from env (#6)
1 parent ae722bc commit 14f4161

File tree

7 files changed

+73
-18
lines changed

7 files changed

+73
-18
lines changed

apps/hello-cpp/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ using launchdarkly::Logger;
1212
using launchdarkly::LogLevel;
1313

1414
int main() {
15-
Logger logger(std::make_unique<ConsoleBackend>(LogLevel::kInfo, "Hello"));
15+
Logger logger(std::make_unique<ConsoleBackend>("Hello"));
1616

1717
if (auto num = launchdarkly::foo()) {
1818
LD_LOG(logger, LogLevel::kInfo) << "Got: " << *num << '\n';

libs/common/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ include(FetchContent)
3030
# Add main SDK sources.
3131
add_subdirectory(src)
3232

33-
if(BUILD_TESTING)
33+
if (BUILD_TESTING)
3434
add_subdirectory(tests)
35-
endif()
35+
endif ()

libs/common/include/console_backend.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,18 @@ namespace launchdarkly {
88
*/
99
class ConsoleBackend : public ILogBackend {
1010
public:
11+
/**
12+
* Constructs a ConsoleBackend which logs at the given level or above.
13+
* @param level Emit logs at this level or above.
14+
* @param name Log tag.
15+
*/
1116
ConsoleBackend(LogLevel level, std::string name);
17+
/**
18+
* Constructs a ConsoleBackend which logs at the level given by the
19+
* LD_LOG_LEVEL environment variable, or info level by default.
20+
* @param name Log tag.
21+
*/
22+
ConsoleBackend(std::string name);
1223

1324
bool enabled(LogLevel level) override;
1425

libs/common/include/log_level.hpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,19 @@ enum class LogLevel {
1212
kError,
1313
};
1414

15-
char const* GetLDLogLevelName(LogLevel level);
15+
/**
16+
* Lookup the name of a LogLevel.
17+
* @param level Target level.
18+
* @param default_ Default name to return if the level wasn't recognized.
19+
* @return Name of the level as a string, or default_ if not recognized.
20+
*/
21+
char const* GetLogLevelName(LogLevel level, char const* default_);
22+
/**
23+
* Lookup a LogLevel by name.
24+
* @param level Name of level.
25+
* @param default_ Default level to return if the level wasn't recognized.
26+
* @return LogLevel matching the name, or default_ if not recognized.
27+
*/
28+
LogLevel GetLogLevelEnum(char const* name, LogLevel default_);
29+
1630
} // namespace launchdarkly

libs/common/src/console_backend.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ ConsoleBackend::ConsoleBackend(LogLevel level, std::string name)
1111
name_.append("] ");
1212
}
1313

14+
ConsoleBackend::ConsoleBackend(std::string name)
15+
: ConsoleBackend(
16+
GetLogLevelEnum(std::getenv("LD_LOG_LEVEL"), LogLevel::kInfo),
17+
std::move(name)) {}
18+
1419
bool ConsoleBackend::enabled(LogLevel level) {
1520
return level >= level_;
1621
}

libs/common/src/log_level.cpp

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,45 @@
11
#include "log_level.hpp"
22

3+
#include <algorithm>
4+
#include <string>
5+
36
namespace launchdarkly {
4-
char const* GetLDLogLevelName(LogLevel level) {
7+
8+
char const* GetLogLevelName(LogLevel level, char const* default_) {
59
switch (level) {
6-
case LogLevel::kDebug: {
7-
return "kDebug";
8-
} break;
9-
case LogLevel::kInfo: {
10-
return "kInfo";
11-
} break;
10+
case LogLevel::kDebug:
11+
return "debug";
12+
case LogLevel::kInfo:
13+
return "info";
1214
case LogLevel::kWarn: {
13-
return "kWarn";
14-
} break;
15-
case LogLevel::kError: {
16-
return "kError";
17-
} break;
15+
return "warn";
16+
case LogLevel::kError:
17+
return "error";
18+
default:
19+
return default_;
20+
}
21+
}
22+
}
23+
24+
LogLevel GetLogLevelEnum(char const* level, LogLevel default_) {
25+
if (level == nullptr) {
26+
return default_;
27+
}
28+
std::string lowercase = level;
29+
std::transform(lowercase.begin(), lowercase.end(), lowercase.begin(),
30+
tolower);
31+
32+
if (lowercase == "debug") {
33+
return LogLevel::kDebug;
34+
} else if (lowercase == "info") {
35+
return LogLevel::kInfo;
36+
} else if (lowercase == "warn") {
37+
return LogLevel::kWarn;
38+
} else if (lowercase == "error") {
39+
return LogLevel::kError;
40+
} else {
41+
return default_;
1842
}
19-
return "INVALID";
2043
}
44+
2145
} // namespace launchdarkly

libs/common/tests/ld_logger_test.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ INSTANTIATE_TEST_SUITE_P(LDLoggerTest,
8989
LogLevel::kWarn,
9090
LogLevel::kError),
9191
[](testing::TestParamInfo<LogLevel> const& info) {
92-
return launchdarkly::GetLDLogLevelName(info.param);
92+
return launchdarkly::GetLogLevelName(info.param,
93+
"unknown");
9394
});
9495

9596
TEST(LDLoggerTest, UsesOstreamForEnabledLevel) {

0 commit comments

Comments
 (0)