Skip to content

Commit 6516711

Browse files
authored
feat: Add support for logging configuration. (#88)
* feat: Add support for logging configuration. * feat: Add configurable logging. * Revert foxy.cmake * Cleanup * Name disambiguation for GCC. * Handle missing backend. Make ILogBackend have noexcept methods. * Use nullptr
1 parent 94f94ae commit 6516711

22 files changed

+329
-58
lines changed

apps/hello-cpp/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
namespace net = boost::asio; // from <boost/asio.hpp>
1010

1111
using launchdarkly::ContextBuilder;
12+
using launchdarkly::LogLevel;
1213
using launchdarkly::client_side::Client;
1314
using launchdarkly::client_side::ConfigBuilder;
1415
using launchdarkly::client_side::DataSourceBuilder;
16+
using launchdarkly::config::shared::builders::LoggingBuilder;
1517

1618
int main() {
1719
net::io_context ioc;
@@ -36,6 +38,7 @@ int main() {
3638
std::chrono::seconds{30}))
3739
.WithReasons(true)
3840
.UseReport(true))
41+
.Logging(LoggingBuilder::BasicLogging().Level(LogLevel::kDebug))
3942
.Events(launchdarkly::client_side::EventsBuilder().FlushInterval(
4043
std::chrono::seconds(5)))
4144
.Build()

libs/client-sdk/src/client_impl.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <launchdarkly/config/shared/built/logging.hpp>
1313
#include <launchdarkly/logging/console_backend.hpp>
14+
#include <launchdarkly/logging/null_logger.hpp>
1415

1516
namespace launchdarkly::client_side {
1617

@@ -35,8 +36,14 @@ static std::unique_ptr<IDataSource> MakeDataSource(
3536
}
3637

3738
static Logger MakeLogger(config::shared::built::Logging const& config) {
38-
// TODO: Use settings for logger.
39-
return Logger(std::make_unique<logging::ConsoleBackend>("LaunchDarkly"));
39+
if (config.disable_logging) {
40+
return {std::make_shared<logging::NullLoggerBackend>()};
41+
}
42+
if (config.backend) {
43+
return {config.backend};
44+
}
45+
return {
46+
std::make_shared<logging::ConsoleBackend>(config.level, config.tag)};
4047
}
4148

4249
ClientImpl::ClientImpl(Config config, Context context)

libs/client-sdk/tests/data_source_event_handler_test.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class TestHandler : public IDataSourceUpdateSink {
2929
};
3030

3131
TEST(StreamingDataHandlerTests, HandlesPutMessage) {
32-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
32+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
3333
auto test_handler = std::make_unique<TestHandler>();
3434
DataSourceStatusManager status_manager;
3535
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -49,7 +49,7 @@ TEST(StreamingDataHandlerTests, HandlesPutMessage) {
4949
}
5050

5151
TEST(StreamingDataHandlerTests, HandlesEmptyPutMessage) {
52-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
52+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
5353
auto test_handler = std::make_unique<TestHandler>();
5454
DataSourceStatusManager status_manager;
5555
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -64,7 +64,7 @@ TEST(StreamingDataHandlerTests, HandlesEmptyPutMessage) {
6464
}
6565

6666
TEST(StreamingDataHandlerTests, BadJsonPut) {
67-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
67+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
6868
auto test_handler = std::make_unique<TestHandler>();
6969
DataSourceStatusManager status_manager;
7070
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -77,7 +77,7 @@ TEST(StreamingDataHandlerTests, BadJsonPut) {
7777
}
7878

7979
TEST(StreamingDataHandlerTests, BadSchemaPut) {
80-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
80+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
8181
auto test_handler = std::make_unique<TestHandler>();
8282
DataSourceStatusManager status_manager;
8383
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -90,7 +90,7 @@ TEST(StreamingDataHandlerTests, BadSchemaPut) {
9090
}
9191

9292
TEST(StreamingDataHandlerTests, HandlesPatchMessage) {
93-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
93+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
9494
auto test_handler = std::make_unique<TestHandler>();
9595
DataSourceStatusManager status_manager;
9696
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -110,7 +110,7 @@ TEST(StreamingDataHandlerTests, HandlesPatchMessage) {
110110
}
111111

112112
TEST(StreamingDataHandlerTests, BadJsonPatch) {
113-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
113+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
114114
auto test_handler = std::make_unique<TestHandler>();
115115
DataSourceStatusManager status_manager;
116116
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -123,7 +123,7 @@ TEST(StreamingDataHandlerTests, BadJsonPatch) {
123123
}
124124

125125
TEST(StreamingDataHandlerTests, BadSchemaPatch) {
126-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
126+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
127127
auto test_handler = std::make_unique<TestHandler>();
128128
DataSourceStatusManager status_manager;
129129
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -136,7 +136,7 @@ TEST(StreamingDataHandlerTests, BadSchemaPatch) {
136136
}
137137

138138
TEST(StreamingDataHandlerTests, HandlesDeleteMessage) {
139-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
139+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
140140
auto test_handler = std::make_unique<TestHandler>();
141141
DataSourceStatusManager status_manager;
142142
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -153,7 +153,7 @@ TEST(StreamingDataHandlerTests, HandlesDeleteMessage) {
153153
}
154154

155155
TEST(StreamingDataHandlerTests, BadJsonDelete) {
156-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
156+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
157157
auto test_handler = std::make_unique<TestHandler>();
158158
DataSourceStatusManager status_manager;
159159
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -166,7 +166,7 @@ TEST(StreamingDataHandlerTests, BadJsonDelete) {
166166
}
167167

168168
TEST(StreamingDataHandlerTests, BadSchemaDelete) {
169-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
169+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
170170
auto test_handler = std::make_unique<TestHandler>();
171171
DataSourceStatusManager status_manager;
172172
DataSourceEventHandler stream_handler(test_handler.get(), logger,
@@ -179,7 +179,7 @@ TEST(StreamingDataHandlerTests, BadSchemaDelete) {
179179
}
180180

181181
TEST(StreamingDataHandlerTests, UnrecognizedVerb) {
182-
auto logger = Logger(std::make_unique<logging::ConsoleBackend>("test"));
182+
auto logger = Logger(std::make_shared<logging::ConsoleBackend>("test"));
183183
auto test_handler = std::make_unique<TestHandler>();
184184
DataSourceStatusManager status_manager;
185185
DataSourceEventHandler stream_handler(test_handler.get(), logger,

libs/common/include/launchdarkly/config/shared/builders/config_builder.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <launchdarkly/config/shared/builders/endpoints_builder.hpp>
66
#include <launchdarkly/config/shared/builders/events_builder.hpp>
77
#include <launchdarkly/config/shared/builders/http_properties_builder.hpp>
8-
#include <launchdarkly/config/shared/builders/logging_bulder.hpp>
8+
#include <launchdarkly/config/shared/builders/logging_builder.hpp>
99
#include <launchdarkly/config/shared/config.hpp>
1010

1111
#include <optional>
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#pragma once
2+
3+
#include <launchdarkly/config/shared/built/logging.hpp>
4+
#include <launchdarkly/logging/log_backend.hpp>
5+
6+
#include <variant>
7+
8+
namespace launchdarkly::config::shared::builders {
9+
10+
/**
11+
* Used to configure logging for the SDK.
12+
*/
13+
class LoggingBuilder {
14+
public:
15+
/**
16+
* Class for configuring built in logging using the SDKs console logger.
17+
*/
18+
class BasicLogging {
19+
public:
20+
BasicLogging();
21+
22+
/**
23+
* Set the enabled log level.
24+
*
25+
* @return A reference to this builder.
26+
*/
27+
BasicLogging& Level(LogLevel level);
28+
29+
/**
30+
* Set a tag for this logger. This tag will be included at the start
31+
* of log entries in square brackets.
32+
*
33+
* If the name was "LaunchDarkly", then log entries will be prefixed
34+
* with "[LaunchDarkly]".
35+
*
36+
* @param name
37+
* @return
38+
*/
39+
BasicLogging& Tag(std::string name);
40+
41+
private:
42+
LogLevel level_;
43+
std::string tag_;
44+
friend class LoggingBuilder;
45+
};
46+
47+
class CustomLogging {
48+
public:
49+
/**
50+
* Set the backend to use for logging. The provided back-end should
51+
* be thread-safe.
52+
* @param backend The implementation of the backend.
53+
* @return A reference to this builder.
54+
*/
55+
CustomLogging& Backend(std::shared_ptr<ILogBackend> backend);
56+
57+
private:
58+
std::shared_ptr<ILogBackend> backend_;
59+
friend class LoggingBuilder;
60+
};
61+
62+
class NoLogging {};
63+
64+
using LoggingType = std::variant<BasicLogging, CustomLogging, NoLogging>;
65+
66+
/**
67+
* Construct a logging builder.
68+
*/
69+
LoggingBuilder() = default;
70+
71+
/**
72+
* Construct a logging builder from a custom logging builder.
73+
* @param custom The custom logging builder to construct a builder from.
74+
*/
75+
LoggingBuilder(CustomLogging custom);
76+
77+
/**
78+
* Construct a logging builder from a basic logging builder.
79+
* @param basic The basic logging builder to construct a builder from.
80+
*/
81+
LoggingBuilder(BasicLogging basic);
82+
83+
/**
84+
* Construct a logging builder from a no logging builder.
85+
* @param no The no logging builder to construct a builder from.
86+
*/
87+
LoggingBuilder(NoLogging no);
88+
89+
/**
90+
* Set the type of logging to use.
91+
*
92+
* Disable logging:
93+
* ```
94+
* builder.Logging(LoggingBuilder::NoLogging())
95+
* ```
96+
*
97+
* Custom logging level:
98+
* ```
99+
* builder.Logging(LoggingBuilder::BasicLogging().Level(LogLevel::kDebug))
100+
* ```
101+
*
102+
* @param logging
103+
* @return
104+
*/
105+
LoggingBuilder& Logging(LoggingType logging);
106+
107+
/**
108+
* Build a logger configuration. Intended for use by the SDK implementation.
109+
*
110+
* @return A built logging configuration.
111+
*/
112+
built::Logging Build() const;
113+
114+
private:
115+
LoggingType logging_;
116+
};
117+
118+
} // namespace launchdarkly::config::shared::builders

libs/common/include/launchdarkly/config/shared/builders/logging_bulder.hpp

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,38 @@
11
#pragma once
22

3+
#include <launchdarkly/logging/log_backend.hpp>
4+
5+
#include <optional>
6+
37
namespace launchdarkly::config::shared::built {
48

5-
class Logging {
6-
// TODO: Implement
9+
/**
10+
* Logging configuration.
11+
*/
12+
struct Logging {
13+
/*
14+
* True to disable logging.
15+
*/
16+
bool disable_logging;
17+
18+
/**
19+
* Set to use a custom back-end.
20+
*
21+
* If set then name and level will not be used.
22+
*/
23+
std::shared_ptr<ILogBackend> backend;
24+
25+
/**
26+
* When logging is enabled, and a custom backend is not
27+
* in use, this will be the tag used for the logger.
28+
*/
29+
std::string tag;
30+
31+
/**
32+
* When logging is enabled, and a custom backend is not
33+
* in use, this will be the minimum log level.
34+
*/
35+
LogLevel level;
736
};
837

938
} // namespace launchdarkly::config::shared::built

libs/common/include/launchdarkly/config/shared/defaults.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
#include <launchdarkly/config/shared/built/events.hpp>
55
#include <launchdarkly/config/shared/built/http_properties.hpp>
66
#include <launchdarkly/config/shared/built/service_endpoints.hpp>
7-
#include "sdks.hpp"
7+
#include <launchdarkly/config/shared/sdks.hpp>
8+
#include <launchdarkly/logging/log_level.hpp>
89

910
namespace launchdarkly::config::shared {
1011

@@ -20,6 +21,9 @@ struct Defaults {
2021
* @return
2122
*/
2223
static bool Offline() { return false; }
24+
25+
static std::string LogTag() { return "LaunchDarkly"; }
26+
static launchdarkly::LogLevel LogLevel() { return LogLevel::kInfo; }
2327
};
2428

2529
template <>

libs/common/include/launchdarkly/logging/log_backend.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ class ILogBackend {
1919
* @param level The log level to check.
2020
* @return Returns true if the level is enabled.
2121
*/
22-
virtual bool Enabled(LogLevel level) = 0;
22+
virtual bool Enabled(LogLevel level) noexcept = 0;
2323

2424
/**
2525
* Write a message to the specified level.
2626
* @param level The level to write the message for.
2727
* @param message The message to Write.
2828
*/
29-
virtual void Write(LogLevel level, std::string message) = 0;
29+
virtual void Write(LogLevel level, std::string message) noexcept = 0;
3030

3131
virtual ~ILogBackend(){};
3232
};

0 commit comments

Comments
 (0)