Skip to content

Commit f0845eb

Browse files
committed
Integrate boost logger
1 parent f7a1873 commit f0845eb

File tree

6 files changed

+131
-2
lines changed

6 files changed

+131
-2
lines changed

.clang-format

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,23 @@ BraceWrapping:
1111
BeforeCatch: true
1212
BeforeElse: true
1313
AfterStruct: true
14+
AfterEnum: true
1415
AccessModifierOffset: -4
1516
BinPackParameters: false
1617
AlwaysBreakAfterReturnType: None
1718
AlwaysBreakAfterDefinitionReturnType: None
1819
AllowAllParametersOfDeclarationOnNextLine: false
1920
ConstructorInitializerIndentWidth: 4
2021
NamespaceIndentation: None
22+
FixNamespaceComments: true
2123
PointerAlignment: Left
2224
Standard: Cpp11
2325
UseTab: Never
2426
AlignAfterOpenBracket: Align
2527
PenaltyReturnTypeOnItsOwnLine: 0
2628
IncludeBlocks: Regroup
2729
IncludeCategories:
28-
- Regex: '^((<|")(shared)\/)'
30+
- Regex: '^((<|")(boost)\/)'
2931
Priority: 4
3032
- Regex: '^((<|")(components)\/)'
3133
Priority: 3

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ set_property(TARGET ${LIB_TARGET_NAME} PROPERTY PUBLIC_HEADER ${PublicHeaders})
5858
target_link_libraries(
5959
${LIB_TARGET_NAME}
6060
PUBLIC jinja2cpp::jinja2cpp nlohmann_json::nlohmann_json
61+
PRIVATE fmt::fmt
6162
)
6263

6364
if (FLASK4CPP_ENABLE_SSL)

include/flask4cpp/app_builder.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,23 @@ class AppBuilder
2222
AppBuilder();
2323
~AppBuilder();
2424

25-
enum class BuildErrors {
25+
enum class BuildErrors
26+
{
2627
NotInitialized,
2728
ConfigurationError,
2829
NoSSLSupport,
2930
};
3031

32+
enum class LogLevel
33+
{
34+
Trace,
35+
Debug,
36+
Info,
37+
Warning,
38+
Error,
39+
Fatal
40+
};
41+
3142
AppBuilder& ConfigureDefault();
3243
AppBuilder& ListenOn(const nonstd::string_view& name, const nonstd::string_view& address, uint16_t port);
3344
AppBuilder& ListenOnSsl(const nonstd::string_view& name,
@@ -36,6 +47,8 @@ class AppBuilder
3647
const nonstd::string_view& certPath,
3748
const nonstd::string_view& keyPath);
3849

50+
AppBuilder& SetLogLevel(LogLevel level);
51+
3952
nonstd::expected<App, BuildErrors> CreateApp();
4053

4154
private:

src/app_builder.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
//
44

55
#include "app_settings.h"
6+
#include "log.h"
67

78
#include <flask4cpp/app_builder.h>
9+
#include <fmt/format.h>
10+
11+
#include <boost/log/utility/setup/console.hpp>
12+
#include <boost/log/utility/setup/filter_parser.hpp>
813

914
namespace flask4cpp
1015
{
@@ -59,18 +64,84 @@ AppBuilder& AppBuilder::ListenOnSsl(const nonstd::string_view& name,
5964
return *this;
6065
}
6166

67+
AppBuilder& AppBuilder::SetLogLevel(AppBuilder::LogLevel level)
68+
{
69+
EnsureSettingsCreated();
70+
auto& logSetts = m_settings->logSettings;
71+
using namespace boost::log;
72+
73+
switch (level)
74+
{
75+
case LogLevel::Trace:
76+
logSetts.severity = trivial::trace;
77+
break;
78+
case LogLevel::Debug:
79+
logSetts.severity = trivial::debug;
80+
break;
81+
case LogLevel::Info:
82+
logSetts.severity = trivial::info;
83+
break;
84+
case LogLevel::Warning:
85+
logSetts.severity = trivial::warning;
86+
break;
87+
case LogLevel::Error:
88+
logSetts.severity = trivial::error;
89+
break;
90+
case LogLevel::Fatal:
91+
logSetts.severity = trivial::fatal;
92+
break;
93+
}
94+
return *this;
95+
}
96+
97+
namespace
98+
{
99+
auto InitializeLogger(const LogSettings& setts)
100+
{
101+
auto log = std::make_unique<AppSettings::LoggerType>();
102+
if (!setts.enableConsole)
103+
{
104+
auto console = boost::log::add_console_log();
105+
console->set_filter(boost::log::expressions::attr<int>("Severity") >= 10);
106+
}
107+
108+
return log;
109+
}
110+
111+
struct EndpointAddressBuilder
112+
{
113+
std::string operator()(const ListenerParams& l) const { return fmt::format("http://{}:{}", l.address, l.port); }
114+
std::string operator()(const SSLListenerParams& l) const { return fmt::format("https://{}:{}", l.address, l.port); }
115+
};
116+
} // namespace
117+
62118
nonstd::expected<App, AppBuilder::BuildErrors> AppBuilder::CreateApp()
63119
{
64120
if (!m_settings)
65121
return nonstd::make_unexpected(BuildErrors::NotInitialized);
66122

123+
m_settings->logger = std::move(InitializeLogger(m_settings->logSettings));
124+
125+
auto log = [this] { return m_settings->logger.get(); };
126+
LOG_DEBUG() << "Start verifying configuration";
127+
for (auto& l : m_settings->listeners)
128+
{
129+
auto endpoint = nonstd::visit(EndpointAddressBuilder(), l);
130+
LOG_DEBUG() << "Found endpoint: " << endpoint;
131+
}
67132
return App(m_settings.release());
68133
}
69134

70135
void AppBuilder::EnsureSettingsCreated()
71136
{
72137
if (!m_settings)
138+
{
73139
m_settings = std::make_unique<AppSettings>();
140+
#ifndef NDEBUG
141+
m_settings->logSettings.severity = boost::log::trivial::debug;
142+
m_settings->logSettings.enableConsole = true;
143+
#endif
144+
}
74145
}
75146

76147
} // namespace flask4cpp

src/app_settings.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@
77

88
#include <nonstd/variant.hpp>
99

10+
#if defined(BOOST_LOG_NO_THREADS)
11+
#undef BOOST_LOG_NO_THREADS
12+
#endif
13+
14+
#include <boost/log/common.hpp>
15+
#include <boost/log/trivial.hpp>
16+
// #include <boost/log/sources/severity_logger.hpp>
17+
#include <boost/log/sources/logger.hpp>
18+
1019
#include <string>
1120
#include <vector>
1221

@@ -31,9 +40,19 @@ struct SSLListenerParams
3140

3241
using ListenerInfo = nonstd::variant<ListenerParams, SSLListenerParams>;
3342

43+
struct LogSettings
44+
{
45+
boost::log::trivial::severity_level severity = boost::log::trivial::info;
46+
bool enableConsole = false;
47+
};
48+
3449
struct AppSettings
3550
{
51+
using LoggerType = boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level>;
52+
3653
std::vector<ListenerInfo> listeners;
54+
LogSettings logSettings;
55+
std::unique_ptr<LoggerType> logger;
3756
};
3857

3958
} // namespace flask4cpp

src/log.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// Created by flexf on 13.03.2020.
3+
//
4+
5+
#ifndef FLASK4CPP_LOG_H
6+
#define FLASK4CPP_LOG_H
7+
8+
#include <boost/log/sources/severity_feature.hpp>
9+
#include <boost/log/trivial.hpp>
10+
11+
namespace flask4cpp
12+
{
13+
#define TO_LOG(L, LV) BOOST_LOG_SEV((L), boost::log::trivial::LV)
14+
15+
#define LOG_TRACE() TO_LOG(log(), trace)
16+
#define LOG_DEBUG() TO_LOG((*log()), debug)
17+
#define LOG_INFO() TO_LOG(log(), info)
18+
#define LOG_WARNING() TO_LOG(log(), warning)
19+
#define LOG_ERROR() TO_LOG(log(), error)
20+
#define LOG_FATAL() TO_LOG(log(), fatal)
21+
} // namespace flask4cpp
22+
23+
#endif // FLASK4CPP_LOG_H

0 commit comments

Comments
 (0)